[{"data":1,"prerenderedAt":15987},["ShallowReactive",2],{"post-python-mutable-copy":3,"sidebar-posts":269,"post-related-source":9178},{"id":4,"title":5,"body":6,"category":254,"cover":255,"description":12,"extension":256,"meta":257,"navigation":104,"path":258,"pinned":259,"publishedAt":260,"seo":261,"slug":262,"stem":263,"summary":264,"tags":265,"updatedAt":260,"visible":104,"__hash__":268},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":8,"toc":242},"minimark",[9,13,17,20,23,30,41,44,64,67,70,136,139,147,150,153,176,180,183,189,192,195,209,212,229,232,235,238],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,31,32,36,37,40],{},[33,34,35],"code",{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,38,39],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,42,43],{"id":43},"核心概念",[45,46,47,58,61],"ul",{},[48,49,50,53,54,57],"li",{},[33,51,52],{},"=="," 比较内容是否相等，",[33,55,56],{},"is"," 比较是否为同一个对象。",[48,59,60],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[48,62,63],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,65,66],{"id":66},"跟着示例运行",[10,68,69],{},"把下面代码保存到本课脚本并运行：",[71,72,77],"pre",{"className":73,"code":74,"language":75,"meta":76,"style":76},"language-python shiki shiki-themes github-dark","tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n","python","",[33,78,79,87,93,99,106,112,118,124,130],{"__ignoreMap":76},[80,81,84],"span",{"class":82,"line":83},"line",1,[80,85,86],{},"tasks = [\"变量\", \"字符串\"]\n",[80,88,90],{"class":82,"line":89},2,[80,91,92],{},"shared = tasks\n",[80,94,96],{"class":82,"line":95},3,[80,97,98],{},"backup = tasks.copy()\n",[80,100,102],{"class":82,"line":101},4,[80,103,105],{"emptyLinePlaceholder":104},true,"\n",[80,107,109],{"class":82,"line":108},5,[80,110,111],{},"tasks.append(\"列表\")\n",[80,113,115],{"class":82,"line":114},6,[80,116,117],{},"print(shared)\n",[80,119,121],{"class":82,"line":120},7,[80,122,123],{},"print(backup)\n",[80,125,127],{"class":82,"line":126},8,[80,128,129],{},"print(tasks is shared)\n",[80,131,133],{"class":82,"line":132},9,[80,134,135],{},"print(tasks is backup)\n",[10,137,138],{},"预期结果：",[71,140,145],{"className":141,"code":143,"language":144,"meta":76},[142],"language-text","['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n","text",[33,146,143],{"__ignoreMap":76},[10,148,149],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,151,152],{"id":152},"按执行顺序拆开看",[154,155,156,162],"ol",{},[48,157,158,161],{},[33,159,160],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[48,163,164,167,168,171,172,175],{},[33,165,166],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,169,170],{},"shared"," 能观察到变化，",[33,173,174],{},"backup"," 不会。",[177,178,179],"h3",{"id":179},"再看一个具体细节",[10,181,182],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,184,185],{},[26,186],{"alt":187,"src":188},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,190,191],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,193,194],{"id":194},"初学者容易混淆的地方",[45,196,197,206],{},[48,198,199,200,202,203,205],{},"用 ",[33,201,52],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,204,56],{},"。",[48,207,208],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,210,211],{"id":211},"练习",[154,213,214,217],{},[48,215,216],{},"让两个变量引用同一个字典并修改其中一个。",[48,218,219,220,223,224,226,227,205],{},"使用 ",[33,221,222],{},"copy()"," 创建外层副本，再比较 ",[33,225,56],{}," 和 ",[33,228,52],{},[10,230,231],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,233,234],{"id":234},"本篇边界",[10,236,237],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,240,241],"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":76,"searchDepth":89,"depth":89,"links":243},[244,245,246,247,248,251,252,253],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":249},[250],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",false,"2026-08-17",{"title":5,"description":12},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[254,266,267],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",[270,1082,1418,1552,1704,1883,2071,2236,2419,2600,2792,3022,3206,3383,3540,3711,3876,4039,4268,4450,4614,4803,4991,5146,5306,5503,5700,5914,6081,6325,6506,6711,6906,7090,7291,7581,7773,8002,8197,8417,8657,8861],{"id":271,"title":272,"body":273,"category":254,"cover":255,"description":76,"extension":256,"meta":1071,"navigation":104,"path":1072,"pinned":259,"publishedAt":1073,"seo":1074,"slug":1075,"stem":1076,"summary":1077,"tags":1078,"updatedAt":1073,"visible":104,"__hash__":1081},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":274,"toc":1047},[275,278,281,284,291,294,297,336,352,356,360,371,376,382,399,405,410,416,420,466,469,475,481,484,515,560,577,591,601,605,616,632,635,641,646,649,667,677,698,702,706,709,721,728,732,747,754,758,761,782,788,792,795,799,802,822,825,829,832,866,869,888,891,912,917,921,924,944,947,950,954,961,975,978,982,985,995,1006,1010,1013,1028,1044],[14,276,277],{"id":277},"引言",[10,279,280],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,282,283],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,285,286,287,290],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,288,289],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,292,293],{"id":293},"扫盲",[10,295,296],{},"那么这里有几个概念：",[298,299,300,303],"blockquote",{},[10,301,302],{},"为什么需要安装python解释器？",[298,304,305,316,319,327,330],{},[10,306,307,308,311,312,315],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,309,310],{},"0","和",[33,313,314],{},"1","组成的机器指令。",[10,317,318],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,320,321,322,326],{},"这样，我们就能用",[323,324,325],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,328,329],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,331,332],{},[26,333],{"alt":334,"src":335},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[298,337,338,341],{},[10,339,340],{},"pip又是什么？",[298,342,343,346],{},[10,344,345],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,347,348],{},[26,349],{"alt":350,"src":351},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,353,355],{"id":354},"windows-安装","Windows 安装",[177,357,359],{"id":358},"_1-下载官方安装程序","1. 下载官方安装程序",[10,361,362,363,370],{},"打开 ",[364,365,369],"a",{"href":366,"rel":367},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[368],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[298,372,373],{},[10,374,375],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,377,378],{},[26,379],{"alt":380,"src":381},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[45,383,384,390,396],{},[48,385,386,387,205],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[323,388,389],{},"Windows installer (64-bit)",[48,391,392,393,205],{},"搭载 ARM 处理器的 Windows 设备选择 ",[323,394,395],{},"Windows installer (ARM64)",[48,397,398],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,400,401],{},[26,402],{"alt":403,"src":404},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[298,406,407],{},[10,408,409],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,411,412],{},[26,413],{"alt":414,"src":415},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[177,417,419],{"id":418},"_2-安装并加入-path","2. 安装并加入 PATH",[298,421,422,427,434,459],{},[298,423,424],{},[10,425,426],{},"PATH 环境变量",[10,428,429,430,433],{},"Windows 有一个特殊的变量叫 ",[323,431,432],{},"PATH","，它里面存了一串文件夹路径，比如：",[71,435,437],{"className":73,"code":436,"language":75,"meta":76,"style":76},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,438,439,444,449,454],{"__ignoreMap":76},[80,440,441],{"class":82,"line":83},[80,442,443],{},"D:\\Python313\\\n",[80,445,446],{"class":82,"line":89},[80,447,448],{},"D:\\Python313\\Scripts\\\n",[80,450,451],{"class":82,"line":95},[80,452,453],{},"C:\\Windows\\System32\\\n",[80,455,456],{"class":82,"line":101},[80,457,458],{},"...\n",[10,460,461,462,465],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[323,463,464],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,467,468],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,470,471,472,474],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,473,75],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,476,477],{},[26,478],{"alt":479,"src":480},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,482,483],{},"对安装界面最底部的两个勾选项分别解释 :",[298,485,486,489,494],{},[10,487,488],{},"Add python.exe to PATH",[10,490,491],{},[323,492,493],{},"把 Python 添加到系统环境变量",[298,495,496,502,508],{},[10,497,498,499,501],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,500,75],{}," 就能运行",[10,503,504,505,507],{},"不勾选的话，命令行输入 ",[33,506,75],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,509,510,511,514],{},"必须",[323,512,513],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[298,516,517,520,525],{},[10,518,519],{},"Use admin privileges when installing py.exe",[10,521,522],{},[323,523,524],{},"使用管理员权限安装 py.exe（Python 启动器）",[298,526,527,537,551,554],{},[10,528,529,532,533,536],{},[33,530,531],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,534,535],{},"py"," 来启动 Python。",[10,538,539,540,542,543,546,547,550],{},"勾选后，",[33,541,531],{}," 会安装到",[323,544,545],{},"系统级目录","，电脑上",[323,548,549],{},"所有用户账户","都能用",[10,552,553],{},"不勾选，只有当前用户能用",[10,555,556,559],{},[323,557,558],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[298,561,562,565],{},[10,563,564],{},"操作建议",[298,566,567,574],{},[10,568,569,570,573],{},"两个都勾上之后，再点 ",[323,571,572],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,575,576],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[298,578,579,585],{},[10,580,581,582],{},"Python 安装的",[323,583,584],{},"可选功能页",[10,586,587],{},[26,588],{"alt":589,"src":590},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[298,592,593,596],{},[10,594,595],{},"高级选项页",[10,597,598],{},[26,599],{"alt":589,"src":600},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[177,602,604],{"id":603},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,606,607,608,611,612,615],{},"按 ",[33,609,610],{},"Win + R","，输入 ",[33,613,614],{},"cmd"," 并回车，然后执行：",[71,617,621],{"className":618,"code":619,"language":620,"meta":76,"style":76},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,622,623],{"__ignoreMap":76},[80,624,625,628],{"class":82,"line":83},[80,626,75],{"class":627},"svObZ",[80,629,631],{"class":630},"sDLfK"," --version\n",[10,633,634],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[71,636,639],{"className":637,"code":638,"language":144,"meta":76},[142],"Python 3.x.x\n",[33,640,638],{"__ignoreMap":76},[10,642,643],{},[26,644],{"alt":589,"src":645},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,647,648],{},"继续检查 pip：",[71,650,652],{"className":618,"code":651,"language":620,"meta":76,"style":76},"python -m pip --version\n",[33,653,654],{"__ignoreMap":76},[80,655,656,658,661,665],{"class":82,"line":83},[80,657,75],{"class":627},[80,659,660],{"class":630}," -m",[80,662,664],{"class":663},"sU2Wk"," pip",[80,666,631],{"class":630},[10,668,669,670,672,673,676],{},"如果 ",[33,671,75],{}," 无法识别，但 ",[33,674,675],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[71,678,680],{"className":618,"code":679,"language":620,"meta":76,"style":76},"py --version\npy -m pip --version\n",[33,681,682,688],{"__ignoreMap":76},[80,683,684,686],{"class":82,"line":83},[80,685,535],{"class":627},[80,687,631],{"class":630},[80,689,690,692,694,696],{"class":82,"line":89},[80,691,535],{"class":627},[80,693,660],{"class":630},[80,695,664],{"class":663},[80,697,631],{"class":630},[14,699,701],{"id":700},"macos-安装","macOS 安装",[177,703,705],{"id":704},"_1-先检查现有环境","1. 先检查现有环境",[10,707,708],{},"打开“终端”应用，执行：",[71,710,712],{"className":618,"code":711,"language":620,"meta":76,"style":76},"python3 --version\n",[33,713,714],{"__ignoreMap":76},[80,715,716,719],{"class":82,"line":83},[80,717,718],{"class":627},"python3",[80,720,631],{"class":630},[10,722,723,724,727],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,725,726],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[177,729,731],{"id":730},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,733,362,734,739,740,205,743,746],{},[364,735,738],{"href":736,"rel":737},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[368],"Python macOS 下载页","，下载当前稳定版的 ",[323,741,742],{},"macOS 64-bit universal2 installer",[33,744,745],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,748,749,750,753],{},"下载完成后打开 ",[33,751,752],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[177,755,757],{"id":756},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,759,760],{},"安装完成后重新打开终端，执行：",[71,762,764],{"className":618,"code":763,"language":620,"meta":76,"style":76},"python3 --version\npython3 -m pip --version\n",[33,765,766,772],{"__ignoreMap":76},[80,767,768,770],{"class":82,"line":83},[80,769,718],{"class":627},[80,771,631],{"class":630},[80,773,774,776,778,780],{"class":82,"line":89},[80,775,718],{"class":627},[80,777,660],{"class":630},[80,779,664],{"class":663},[80,781,631],{"class":630},[10,783,784,785,787],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,786,718],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,789,791],{"id":790},"linux-安装","Linux 安装",[10,793,794],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[177,796,798],{"id":797},"_1-检查是否已经安装","1. 检查是否已经安装",[10,800,801],{},"打开终端，执行：",[71,803,804],{"className":618,"code":763,"language":620,"meta":76,"style":76},[33,805,806,812],{"__ignoreMap":76},[80,807,808,810],{"class":82,"line":83},[80,809,718],{"class":627},[80,811,631],{"class":630},[80,813,814,816,818,820],{"class":82,"line":89},[80,815,718],{"class":627},[80,817,660],{"class":630},[80,819,664],{"class":663},[80,821,631],{"class":630},[10,823,824],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[177,826,828],{"id":827},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,830,831],{},"Ubuntu 或 Debian：",[71,833,835],{"className":618,"code":834,"language":620,"meta":76,"style":76},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,836,837,848],{"__ignoreMap":76},[80,838,839,842,845],{"class":82,"line":83},[80,840,841],{"class":627},"sudo",[80,843,844],{"class":663}," apt",[80,846,847],{"class":663}," update\n",[80,849,850,852,854,857,860,863],{"class":82,"line":89},[80,851,841],{"class":627},[80,853,844],{"class":663},[80,855,856],{"class":663}," install",[80,858,859],{"class":663}," python3",[80,861,862],{"class":663}," python3-pip",[80,864,865],{"class":663}," python3-venv\n",[10,867,868],{},"Fedora：",[71,870,872],{"className":618,"code":871,"language":620,"meta":76,"style":76},"sudo dnf install python3 python3-pip\n",[33,873,874],{"__ignoreMap":76},[80,875,876,878,881,883,885],{"class":82,"line":83},[80,877,841],{"class":627},[80,879,880],{"class":663}," dnf",[80,882,856],{"class":663},[80,884,859],{"class":663},[80,886,887],{"class":663}," python3-pip\n",[10,889,890],{},"Arch Linux：",[71,892,894],{"className":618,"code":893,"language":620,"meta":76,"style":76},"sudo pacman -S python python-pip\n",[33,895,896],{"__ignoreMap":76},[80,897,898,900,903,906,909],{"class":82,"line":83},[80,899,841],{"class":627},[80,901,902],{"class":663}," pacman",[80,904,905],{"class":630}," -S",[80,907,908],{"class":663}," python",[80,910,911],{"class":663}," python-pip\n",[10,913,914,916],{},[33,915,841],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[177,918,920],{"id":919},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,922,923],{},"安装结束后执行：",[71,925,926],{"className":618,"code":763,"language":620,"meta":76,"style":76},[33,927,928,934],{"__ignoreMap":76},[80,929,930,932],{"class":82,"line":83},[80,931,718],{"class":627},[80,933,631],{"class":630},[80,935,936,938,940,942],{"class":82,"line":89},[80,937,718],{"class":627},[80,939,660],{"class":630},[80,941,664],{"class":663},[80,943,631],{"class":630},[10,945,946],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,948,949],{"id":949},"常见问题",[177,951,953],{"id":952},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,955,956,957,960],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,958,959],{},"python --version","。如果仍然失败，按下面的顺序检查：",[154,962,963,969,972],{},[48,964,965,966,968],{},"执行 ",[33,967,675],{},"，确认 Python Launcher 是否可用。",[48,970,971],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[48,973,974],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,976,977],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[177,979,981],{"id":980},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,983,984],{},"先尝试：",[71,986,987],{"className":618,"code":711,"language":620,"meta":76,"style":76},[33,988,989],{"__ignoreMap":76},[80,990,991,993],{"class":82,"line":83},[80,992,718],{"class":627},[80,994,631],{"class":630},[10,996,997,998,1000,1001,1003,1004,205],{},"在这两个系统中，只有 ",[33,999,718],{}," 命令而没有 ",[33,1002,75],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,1005,718],{},[177,1007,1009],{"id":1008},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,1011,1012],{},"先使用模块方式检查：",[71,1014,1016],{"className":618,"code":1015,"language":620,"meta":76,"style":76},"python3 -m pip --version\n",[33,1017,1018],{"__ignoreMap":76},[80,1019,1020,1022,1024,1026],{"class":82,"line":83},[80,1021,718],{"class":627},[80,1023,660],{"class":630},[80,1025,664],{"class":663},[80,1027,631],{"class":630},[10,1029,1030,1031,1033,1034,1036,1037,1039,1040,1043],{},"Windows 用户将命令中的 ",[33,1032,718],{}," 换成 ",[33,1035,75],{}," 或 ",[33,1038,535],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1041,1042],{},"python3-pip","；不要直接使用其他系统的安装命令。",[239,1045,1046],{},"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":76,"searchDepth":89,"depth":89,"links":1048},[1049,1050,1051,1056,1061,1066],{"id":277,"depth":89,"text":277},{"id":293,"depth":89,"text":293},{"id":354,"depth":89,"text":355,"children":1052},[1053,1054,1055],{"id":358,"depth":95,"text":359},{"id":418,"depth":95,"text":419},{"id":603,"depth":95,"text":604},{"id":700,"depth":89,"text":701,"children":1057},[1058,1059,1060],{"id":704,"depth":95,"text":705},{"id":730,"depth":95,"text":731},{"id":756,"depth":95,"text":757},{"id":790,"depth":89,"text":791,"children":1062},[1063,1064,1065],{"id":797,"depth":95,"text":798},{"id":827,"depth":95,"text":828},{"id":919,"depth":95,"text":920},{"id":949,"depth":89,"text":949,"children":1067},[1068,1069,1070],{"id":952,"depth":95,"text":953},{"id":980,"depth":95,"text":981},{"id":1008,"depth":95,"text":1009},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":272,"description":76},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[254,1079,1080],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1083,"title":1084,"body":1085,"category":254,"cover":1092,"description":76,"extension":256,"meta":1407,"navigation":104,"path":1408,"pinned":259,"publishedAt":1409,"seo":1410,"slug":1411,"stem":1412,"summary":1413,"tags":1414,"updatedAt":1409,"visible":104,"__hash__":1417},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1086,"toc":1392},[1087,1093,1096,1099,1103,1106,1130,1133,1139,1142,1145,1179,1188,1192,1199,1202,1227,1230,1242,1245,1249,1252,1255,1258,1261,1264,1267,1270,1294,1297,1300,1306,1309,1312,1315,1319,1325,1328,1354,1357,1361,1364,1367,1371,1374,1377,1380,1383,1386,1389],[10,1088,1089],{},[26,1090],{"alt":1091,"src":1092},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1094,1095],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1097,1098],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1100,1102],{"id":1101},"python-代码是什么样的","Python 代码是什么样的",[10,1104,1105],{},"下面是一段简单的 Python 代码：",[71,1107,1109],{"className":73,"code":1108,"language":75,"meta":76,"style":76},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1110,1111,1116,1121,1125],{"__ignoreMap":76},[80,1112,1113],{"class":82,"line":83},[80,1114,1115],{},"name = \"Python\"\n",[80,1117,1118],{"class":82,"line":89},[80,1119,1120],{},"year = 2026\n",[80,1122,1123],{"class":82,"line":95},[80,1124,105],{"emptyLinePlaceholder":104},[80,1126,1127],{"class":82,"line":101},[80,1128,1129],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1131,1132],{},"运行结果：",[71,1134,1137],{"className":1135,"code":1136,"language":144,"meta":76},[142],"正在学习 Python，当前年份是 2026\n",[33,1138,1136],{"__ignoreMap":76},[10,1140,1141],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1143,1144],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[71,1146,1148],{"className":73,"code":1147,"language":75,"meta":76,"style":76},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1149,1150,1155,1159,1164,1169,1174],{"__ignoreMap":76},[80,1151,1152],{"class":82,"line":83},[80,1153,1154],{},"score = 85\n",[80,1156,1157],{"class":82,"line":89},[80,1158,105],{"emptyLinePlaceholder":104},[80,1160,1161],{"class":82,"line":95},[80,1162,1163],{},"if score >= 60:\n",[80,1165,1166],{"class":82,"line":101},[80,1167,1168],{},"    print(\"成绩合格\")\n",[80,1170,1171],{"class":82,"line":108},[80,1172,1173],{},"else:\n",[80,1175,1176],{"class":82,"line":114},[80,1177,1178],{},"    print(\"需要继续学习\")\n",[10,1180,1181,226,1184,1187],{},[33,1182,1183],{},"if",[33,1185,1186],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1189,1191],{"id":1190},"python-如何运行代码","Python 如何运行代码",[10,1193,1194,1195,1198],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1196,1197],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1200,1201],{},"交互式环境适合快速验证一个表达式：",[71,1203,1205],{"className":73,"code":1204,"language":75,"meta":76,"style":76},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1206,1207,1212,1217,1222],{"__ignoreMap":76},[80,1208,1209],{"class":82,"line":83},[80,1210,1211],{},">>> 10 + 20\n",[80,1213,1214],{"class":82,"line":89},[80,1215,1216],{},"30\n",[80,1218,1219],{"class":82,"line":95},[80,1220,1221],{},">>> \"Python\".lower()\n",[80,1223,1224],{"class":82,"line":101},[80,1225,1226],{},"'python'\n",[10,1228,1229],{},"需要保存和重复运行的程序，则可以写入文件：",[71,1231,1233],{"className":618,"code":1232,"language":620,"meta":76,"style":76},"python3 hello.py\n",[33,1234,1235],{"__ignoreMap":76},[80,1236,1237,1239],{"class":82,"line":83},[80,1238,718],{"class":627},[80,1240,1241],{"class":663}," hello.py\n",[10,1243,1244],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1246,1248],{"id":1247},"python-的特点","Python 的特点",[177,1250,1251],{"id":1251},"语法相对简洁",[10,1253,1254],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[177,1256,1257],{"id":1257},"支持多种编程方式",[10,1259,1260],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[177,1262,1263],{"id":1263},"标准库比较完整",[10,1265,1266],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1268,1269],{},"例如，获取当前时间：",[71,1271,1273],{"className":73,"code":1272,"language":75,"meta":76,"style":76},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1274,1275,1280,1284,1289],{"__ignoreMap":76},[80,1276,1277],{"class":82,"line":83},[80,1278,1279],{},"from datetime import datetime\n",[80,1281,1282],{"class":82,"line":89},[80,1283,105],{"emptyLinePlaceholder":104},[80,1285,1286],{"class":82,"line":95},[80,1287,1288],{},"now = datetime.now()\n",[80,1290,1291],{"class":82,"line":101},[80,1292,1293],{},"print(now)\n",[10,1295,1296],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[177,1298,1299],{"id":1299},"第三方工具丰富",[10,1301,1302,1303,1305],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1304,289],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1307,1308],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[177,1310,1311],{"id":1311},"支持多个操作系统",[10,1313,1314],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1316,1318],{"id":1317},"python-可以做什么","Python 可以做什么",[10,1320,1321],{},[26,1322],{"alt":1323,"src":1324},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1326,1327],{},"Python 的应用范围比较广，常见方向包括：",[45,1329,1330,1333,1336,1339,1342,1345,1348,1351],{},[48,1331,1332],{},"编写自动化脚本，批量处理文件和重复任务；",[48,1334,1335],{},"开发网站后端和 API 服务；",[48,1337,1338],{},"进行数据清洗、统计分析和图表展示；",[48,1340,1341],{},"编写网络爬虫和信息采集工具；",[48,1343,1344],{},"开发自动化测试程序；",[48,1346,1347],{},"进行机器学习和人工智能开发；",[48,1349,1350],{},"编写运维、监控和辅助开发工具；",[48,1352,1353],{},"开发部分桌面应用和插件。",[10,1355,1356],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1358,1360],{"id":1359},"python-的发展","Python 的发展",[10,1362,1363],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1365,1366],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1368,1370],{"id":1369},"python-也有局限","Python 也有局限",[10,1372,1373],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1375,1376],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1378,1379],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1381,1382],{"id":1382},"写在最后",[10,1384,1385],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1387,1388],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[239,1390,1391],{},"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":76,"searchDepth":89,"depth":89,"links":1393},[1394,1395,1396,1403,1404,1405,1406],{"id":1101,"depth":89,"text":1102},{"id":1190,"depth":89,"text":1191},{"id":1247,"depth":89,"text":1248,"children":1397},[1398,1399,1400,1401,1402],{"id":1251,"depth":95,"text":1251},{"id":1257,"depth":95,"text":1257},{"id":1263,"depth":95,"text":1263},{"id":1299,"depth":95,"text":1299},{"id":1311,"depth":95,"text":1311},{"id":1317,"depth":89,"text":1318},{"id":1359,"depth":89,"text":1360},{"id":1369,"depth":89,"text":1370},{"id":1382,"depth":89,"text":1382},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1084,"description":76},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[254,1415,1416],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1419,"title":1420,"body":1421,"category":254,"cover":255,"description":1425,"extension":256,"meta":1543,"navigation":104,"path":1544,"pinned":259,"publishedAt":260,"seo":1545,"slug":1546,"stem":1547,"summary":1548,"tags":1549,"updatedAt":260,"visible":104,"__hash__":1551},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1422,"toc":1533},[1423,1426,1428,1431,1433,1439,1444,1446,1460,1462,1464,1473,1475,1481,1483,1485,1501,1503,1514,1516,1524,1526,1528,1531],[10,1424,1425],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1427,16],{"id":16},[10,1429,1430],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1432,22],{"id":22},[10,1434,1435],{},[26,1436],{"alt":1437,"src":1438},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1440,1441,1443],{},[33,1442,1197],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1445,43],{"id":43},[45,1447,1448,1454,1457],{},[48,1449,1450,1451,1453],{},"源代码是人编写的文本，通常保存在 ",[33,1452,1197],{}," 文件中。",[48,1455,1456],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[48,1458,1459],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1461,66],{"id":66},[10,1463,69],{},[71,1465,1467],{"className":73,"code":1466,"language":75,"meta":76,"style":76},"print(\"你好，Python\")\n",[33,1468,1469],{"__ignoreMap":76},[80,1470,1471],{"class":82,"line":83},[80,1472,1466],{},[10,1474,138],{},[71,1476,1479],{"className":1477,"code":1478,"language":144,"meta":76},[142],"你好，Python\n",[33,1480,1478],{"__ignoreMap":76},[10,1482,149],{},[14,1484,152],{"id":152},[154,1486,1487,1494],{},[48,1488,1489,1490,1493],{},"终端启动解释器后，解释器读取 ",[33,1491,1492],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[48,1495,1496,1497,1500],{},"字符串对象先准备好，再交给 ",[33,1498,1499],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1502,194],{"id":194},[45,1504,1505,1508],{},[48,1506,1507],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[48,1509,1510,1511,1513],{},"认为 ",[33,1512,1197],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1515,211],{"id":211},[154,1517,1518,1521],{},[48,1519,1520],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[48,1522,1523],{},"把示例文字改成自己的学习目标并重新运行。",[10,1525,231],{},[14,1527,234],{"id":234},[10,1529,1530],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,1532,241],{},{"title":76,"searchDepth":89,"depth":89,"links":1534},[1535,1536,1537,1538,1539,1540,1541,1542],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1420,"description":1425},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[254,1415,1550],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1553,"title":1554,"body":1555,"category":254,"cover":255,"description":1559,"extension":256,"meta":1695,"navigation":104,"path":1696,"pinned":259,"publishedAt":260,"seo":1697,"slug":1698,"stem":1699,"summary":1700,"tags":1701,"updatedAt":260,"visible":104,"__hash__":1703},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1556,"toc":1685},[1557,1560,1562,1565,1567,1573,1579,1581,1596,1598,1601,1621,1623,1629,1631,1633,1646,1648,1662,1664,1675,1677,1679,1682],[10,1558,1559],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1561,16],{"id":16},[10,1563,1564],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1566,22],{"id":22},[10,1568,1569],{},[26,1570],{"alt":1571,"src":1572},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1574,1575,1576,1578],{},"终端收到 ",[33,1577,718],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1580,43],{"id":43},[45,1582,1583,1586,1589],{},[48,1584,1585],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[48,1587,1588],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[48,1590,1591,1592,1595],{},"检查 pip 时使用 ",[33,1593,1594],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1597,66],{"id":66},[10,1599,1600],{},"在 macOS 终端执行：",[71,1602,1603],{"className":618,"code":763,"language":620,"meta":76,"style":76},[33,1604,1605,1611],{"__ignoreMap":76},[80,1606,1607,1609],{"class":82,"line":83},[80,1608,718],{"class":627},[80,1610,631],{"class":630},[80,1612,1613,1615,1617,1619],{"class":82,"line":89},[80,1614,718],{"class":627},[80,1616,660],{"class":630},[80,1618,664],{"class":663},[80,1620,631],{"class":630},[10,1622,138],{},[71,1624,1627],{"className":1625,"code":1626,"language":144,"meta":76},[142],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1628,1626],{"__ignoreMap":76},[10,1630,149],{},[14,1632,152],{"id":152},[154,1634,1635,1641],{},[48,1636,1637,1640],{},[33,1638,1639],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[48,1642,1643,1645],{},[33,1644,726],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1647,194],{"id":194},[45,1649,1650,1656],{},[48,1651,1652,1653,1655],{},"看到系统已有 ",[33,1654,718],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[48,1657,1658,1659,1661],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1660,718],{},"，不修改系统自带工具。",[14,1663,211],{"id":211},[154,1665,1666,1672],{},[48,1667,965,1668,1671],{},[33,1669,1670],{},"which python3","，记录当前解释器路径。",[48,1673,1674],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1676,231],{},[14,1678,234],{"id":234},[10,1680,1681],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,1683,1684],{},"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":76,"searchDepth":89,"depth":89,"links":1686},[1687,1688,1689,1690,1691,1692,1693,1694],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1554,"description":1559},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[254,1702,1079],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1705,"title":1706,"body":1707,"category":254,"cover":255,"description":1872,"extension":256,"meta":1873,"navigation":104,"path":1874,"pinned":259,"publishedAt":260,"seo":1875,"slug":1876,"stem":1877,"summary":1878,"tags":1879,"updatedAt":260,"visible":104,"__hash__":1882},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1708,"toc":1862},[1709,1715,1717,1720,1722,1728,1731,1733,1757,1759,1761,1788,1790,1796,1798,1800,1818,1820,1834,1836,1850,1852,1854,1860],[10,1710,1711,1712,1714],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1713,1197],{}," 脚本。",[14,1716,16],{"id":16},[10,1718,1719],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1721,22],{"id":22},[10,1723,1724],{},[26,1725],{"alt":1726,"src":1727},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1729,1730],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1732,43],{"id":43},[45,1734,1735,1744,1751],{},[48,1736,1737,1738,1740,1741,205],{},"在终端输入 ",[33,1739,718],{}," 进入 REPL，提示符通常是 ",[33,1742,1743],{},">>>",[48,1745,1746,1747,1750],{},"输入 ",[33,1748,1749],{},"exit()"," 或按 Control-D 退出 REPL。",[48,1752,1753,1754,1756],{},"需要保存、复查或多次运行的代码应写入 ",[33,1755,1197],{}," 文件。",[14,1758,66],{"id":66},[10,1760,69],{},[71,1762,1766],{"className":1763,"code":1764,"language":1765,"meta":76,"style":76},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1767,1768,1773,1778,1783],{"__ignoreMap":76},[80,1769,1770],{"class":82,"line":83},[80,1771,1772],{},">>> 2 + 3\n",[80,1774,1775],{"class":82,"line":89},[80,1776,1777],{},"5\n",[80,1779,1780],{"class":82,"line":95},[80,1781,1782],{},">>> \"python\".upper()\n",[80,1784,1785],{"class":82,"line":101},[80,1786,1787],{},"'PYTHON'\n",[10,1789,138],{},[71,1791,1794],{"className":1792,"code":1793,"language":144,"meta":76},[142],"REPL 会直接显示表达式结果\n",[33,1795,1793],{"__ignoreMap":76},[10,1797,149],{},[14,1799,152],{"id":152},[154,1801,1802,1812],{},[48,1803,1804,1805,1808,1809,205],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1806,1807],{},"2 + 3"," 能直接看到 ",[33,1810,1811],{},"5",[48,1813,1814,1815,1817],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1816,1499],{}," 才会写到标准输出。",[14,1819,194],{"id":194},[45,1821,1822,1831],{},[48,1823,1824,1825,1827,1828,1830],{},"把提示符 ",[33,1826,1743],{}," 复制进 ",[33,1829,1197],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[48,1832,1833],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1835,211],{"id":211},[154,1837,1838,1844],{},[48,1839,1840,1841,205],{},"在 REPL 计算 ",[33,1842,1843],{},"12 * 8",[48,1845,1846,1847,1849],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1848,1499],{}," 时是否显示结果。",[10,1851,231],{},[14,1853,234],{"id":234},[10,1855,1856,1857,1859],{},"本篇目标是根据任务选择 REPL 或 ",[33,1858,1197],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,1861,241],{},{"title":76,"searchDepth":89,"depth":89,"links":1863},[1864,1865,1866,1867,1868,1869,1870,1871],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1706,"description":1872},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[254,1880,1881],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1884,"title":1885,"body":1886,"category":254,"cover":255,"description":1890,"extension":256,"meta":2061,"navigation":104,"path":2062,"pinned":259,"publishedAt":260,"seo":2063,"slug":2064,"stem":2065,"summary":2066,"tags":2067,"updatedAt":260,"visible":104,"__hash__":2070},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1887,"toc":2051},[1888,1891,1893,1896,1898,1904,1910,1912,1930,1932,1934,1979,1981,1987,1989,1991,2013,2015,2027,2029,2041,2043,2045,2048],[10,1889,1890],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1892,16],{"id":16},[10,1894,1895],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1897,22],{"id":22},[10,1899,1900],{},[26,1901],{"alt":1902,"src":1903},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1905,1906,1909],{},[33,1907,1908],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1911,43],{"id":43},[45,1913,1914,1917,1927],{},[48,1915,1916],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[48,1918,1919,1922,1923,1926],{},[33,1920,1921],{},"pwd"," 显示当前目录，",[33,1924,1925],{},"ls"," 显示目录里的文件。",[48,1928,1929],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1931,66],{"id":66},[10,1933,1600],{},[71,1935,1937],{"className":618,"code":1936,"language":620,"meta":76,"style":76},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1938,1939,1947,1954,1959,1973],{"__ignoreMap":76},[80,1940,1941,1944],{"class":82,"line":83},[80,1942,1943],{"class":627},"mkdir",[80,1945,1946],{"class":663}," python-study\n",[80,1948,1949,1952],{"class":82,"line":89},[80,1950,1951],{"class":630},"cd",[80,1953,1946],{"class":663},[80,1955,1956],{"class":82,"line":95},[80,1957,1958],{"class":630},"pwd\n",[80,1960,1961,1964,1967,1971],{"class":82,"line":101},[80,1962,1963],{"class":630},"printf",[80,1965,1966],{"class":663}," 'print(\"项目已经运行\")\\n'",[80,1968,1970],{"class":1969},"snl16"," >",[80,1972,1241],{"class":663},[80,1974,1975,1977],{"class":82,"line":108},[80,1976,718],{"class":627},[80,1978,1241],{"class":663},[10,1980,138],{},[71,1982,1985],{"className":1983,"code":1984,"language":144,"meta":76},[142],"项目已经运行\n",[33,1986,1984],{"__ignoreMap":76},[10,1988,149],{},[14,1990,152],{"id":152},[154,1992,1993,2004],{},[48,1994,1995,1997,1998,2000,2001,2003],{},[33,1996,1943],{}," 创建目录，",[33,1999,1951],{}," 改变终端当前目录，",[33,2002,1921],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[48,2005,2006,2008,2009,2012],{},[33,2007,1908],{}," 会在当前目录寻找 ",[33,2010,2011],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,2014,194],{"id":194},[45,2016,2017,2024],{},[48,2018,2019,2020,226,2022,205],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,2021,1921],{},[33,2023,1925],{},[48,2025,2026],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2028,211],{"id":211},[154,2030,2031,2038],{},[48,2032,2033,2034,2037],{},"新建 ",[33,2035,2036],{},"lesson01.py"," 并输出课程编号。",[48,2039,2040],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2042,231],{},[14,2044,234],{"id":234},[10,2046,2047],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,2049,2050],{},"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":76,"searchDepth":89,"depth":89,"links":2052},[2053,2054,2055,2056,2057,2058,2059,2060],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1885,"description":1890},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[254,2068,2069],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2072,"title":2073,"body":2074,"category":254,"cover":255,"description":2078,"extension":256,"meta":2226,"navigation":104,"path":2227,"pinned":259,"publishedAt":260,"seo":2228,"slug":2229,"stem":2230,"summary":2231,"tags":2232,"updatedAt":260,"visible":104,"__hash__":2235},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2075,"toc":2216},[2076,2079,2081,2084,2086,2092,2103,2105,2125,2127,2129,2149,2151,2157,2159,2161,2180,2182,2190,2192,2207,2209,2211,2214],[10,2077,2078],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2080,16],{"id":16},[10,2082,2083],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2085,22],{"id":22},[10,2087,2088],{},[26,2089],{"alt":2090,"src":2091},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2093,2094,2095,205,2097,2100,2101,205],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2096,1499],{},[33,2098,2099],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2102,1807],{},[14,2104,43],{"id":43},[45,2106,2107,2113,2122],{},[48,2108,2109,2112],{},[33,2110,2111],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[48,2114,2115,2118,2119,205],{},[33,2116,2117],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2120,2121],{},"12",[48,2123,2124],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2126,66],{"id":66},[10,2128,69],{},[71,2130,2132],{"className":73,"code":2131,"language":75,"meta":76,"style":76},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2133,2134,2139,2144],{"__ignoreMap":76},[80,2135,2136],{"class":82,"line":83},[80,2137,2138],{},"print(42)\n",[80,2140,2141],{"class":82,"line":89},[80,2142,2143],{},"print(7 + 5)\n",[80,2145,2146],{"class":82,"line":95},[80,2147,2148],{},"print(\"Python 基础课\")\n",[10,2150,138],{},[71,2152,2155],{"className":2153,"code":2154,"language":144,"meta":76},[142],"42\n12\nPython 基础课\n",[33,2156,2154],{"__ignoreMap":76},[10,2158,149],{},[14,2160,152],{"id":152},[154,2162,2163,2171],{},[48,2164,2165,2168,2169,205],{},[33,2166,2167],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2170,2121],{},[48,2172,2173,2175,2176,2179],{},[33,2174,1499],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2177,2178],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2181,194],{"id":194},[45,2183,2184,2187],{},[48,2185,2186],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[48,2188,2189],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2191,211],{"id":211},[154,2193,2194,2197],{},[48,2195,2196],{},"分别输出一个整数、一个小数和一段文本。",[48,2198,2199,2200,2202,2203,2206],{},"比较 ",[33,2201,2099],{}," 与 ",[33,2204,2205],{},"print(\"2 + 3\")"," 的结果。",[10,2208,231],{},[14,2210,234],{"id":234},[10,2212,2213],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,2215,241],{},{"title":76,"searchDepth":89,"depth":89,"links":2217},[2218,2219,2220,2221,2222,2223,2224,2225],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2073,"description":2078},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[254,2233,2234],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2237,"title":2238,"body":2239,"category":254,"cover":255,"description":2243,"extension":256,"meta":2409,"navigation":104,"path":2410,"pinned":259,"publishedAt":260,"seo":2411,"slug":2412,"stem":2413,"summary":2414,"tags":2415,"updatedAt":260,"visible":104,"__hash__":2418},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2240,"toc":2399},[2241,2244,2246,2249,2251,2257,2260,2262,2288,2290,2292,2320,2322,2328,2330,2332,2356,2358,2373,2375,2390,2392,2394,2397],[10,2242,2243],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2245,16],{"id":16},[10,2247,2248],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2250,22],{"id":22},[10,2252,2253],{},[26,2254],{"alt":2255,"src":2256},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2258,2259],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2261,43],{"id":43},[45,2263,2264,2267,2277],{},[48,2265,2266],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[48,2268,2269,2270,2202,2273,2276],{},"变量名区分大小写，",[33,2271,2272],{},"score",[33,2274,2275],{},"Score"," 是两个名字。",[48,2278,2279,2280,2283,2284,2287],{},"使用能表达含义的名称；不要用 ",[33,2281,2282],{},"list","、",[33,2285,2286],{},"str"," 等内置名称作为普通变量名。",[14,2289,66],{"id":66},[10,2291,69],{},[71,2293,2295],{"className":73,"code":2294,"language":75,"meta":76,"style":76},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2296,2297,2302,2307,2311,2316],{"__ignoreMap":76},[80,2298,2299],{"class":82,"line":83},[80,2300,2301],{},"score = 90\n",[80,2303,2304],{"class":82,"line":89},[80,2305,2306],{},"print(score)\n",[80,2308,2309],{"class":82,"line":95},[80,2310,105],{"emptyLinePlaceholder":104},[80,2312,2313],{"class":82,"line":101},[80,2314,2315],{},"score = 95\n",[80,2317,2318],{"class":82,"line":108},[80,2319,2306],{},[10,2321,138],{},[71,2323,2326],{"className":2324,"code":2325,"language":144,"meta":76},[142],"90\n95\n",[33,2327,2325],{"__ignoreMap":76},[10,2329,149],{},[14,2331,152],{"id":152},[154,2333,2334,2343],{},[48,2335,965,2336,2339,2340,2342],{},[33,2337,2338],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2341,2272],{}," 再绑定到它。",[48,2344,965,2345,2348,2349,2352,2353,205],{},[33,2346,2347],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2350,2351],{},"90"," 没有被改造成 ",[33,2354,2355],{},"95",[14,2357,194],{"id":194},[45,2359,2360,2363],{},[48,2361,2362],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[48,2364,219,2365,2283,2367,2283,2369,2372],{},[33,2366,2282],{},[33,2368,2286],{},[33,2370,2371],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2374,211],{"id":211},[154,2376,2377,2387],{},[48,2378,2379,2380,226,2383,2386],{},"创建 ",[33,2381,2382],{},"course_name",[33,2384,2385],{},"lesson_count"," 两个变量并输出。",[48,2388,2389],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2391,231],{},[14,2393,234],{"id":234},[10,2395,2396],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,2398,241],{},{"title":76,"searchDepth":89,"depth":89,"links":2400},[2401,2402,2403,2404,2405,2406,2407,2408],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2238,"description":2243},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[254,2416,2417],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2420,"title":2421,"body":2422,"category":254,"cover":255,"description":2426,"extension":256,"meta":2590,"navigation":104,"path":2591,"pinned":259,"publishedAt":260,"seo":2592,"slug":2593,"stem":2594,"summary":2595,"tags":2596,"updatedAt":260,"visible":104,"__hash__":2599},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2423,"toc":2580},[2424,2427,2429,2432,2434,2440,2443,2445,2474,2476,2478,2522,2524,2530,2532,2534,2548,2550,2561,2563,2571,2573,2575,2578],[10,2425,2426],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2428,16],{"id":16},[10,2430,2431],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2433,22],{"id":22},[10,2435,2436],{},[26,2437],{"alt":2438,"src":2439},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2441,2442],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2444,43],{"id":43},[45,2446,2447,2457,2471],{},[48,2448,2449,2452,2453,2456],{},[33,2450,2451],{},"int"," 表示整数，",[33,2454,2455],{},"float"," 表示浮点数。",[48,2458,2459,2462,2463,2466,2467,2470],{},[33,2460,2461],{},"\u002F"," 总是进行真除法；",[33,2464,2465],{},"\u002F\u002F"," 是向下取整除法，",[33,2468,2469],{},"%"," 得到余数。",[48,2472,2473],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2475,66],{"id":66},[10,2477,69],{},[71,2479,2481],{"className":73,"code":2480,"language":75,"meta":76,"style":76},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2482,2483,2488,2493,2498,2502,2507,2512,2517],{"__ignoreMap":76},[80,2484,2485],{"class":82,"line":83},[80,2486,2487],{},"price = 25\n",[80,2489,2490],{"class":82,"line":89},[80,2491,2492],{},"count = 4\n",[80,2494,2495],{"class":82,"line":95},[80,2496,2497],{},"discount = 0.9\n",[80,2499,2500],{"class":82,"line":101},[80,2501,105],{"emptyLinePlaceholder":104},[80,2503,2504],{"class":82,"line":108},[80,2505,2506],{},"total = price * count * discount\n",[80,2508,2509],{"class":82,"line":114},[80,2510,2511],{},"average = total \u002F count\n",[80,2513,2514],{"class":82,"line":120},[80,2515,2516],{},"print(total)\n",[80,2518,2519],{"class":82,"line":126},[80,2520,2521],{},"print(average)\n",[10,2523,138],{},[71,2525,2528],{"className":2526,"code":2527,"language":144,"meta":76},[142],"90.0\n22.5\n",[33,2529,2527],{"__ignoreMap":76},[10,2531,149],{},[14,2533,152],{"id":152},[154,2535,2536,2542],{},[48,2537,2538,2541],{},[33,2539,2540],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[48,2543,2544,2547],{},[33,2545,2546],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2549,194],{"id":194},[45,2551,2552,2558],{},[48,2553,2554,2555,205],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2556,2557],{},"decimal.Decimal",[48,2559,2560],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2562,211],{"id":211},[154,2564,2565,2568],{},[48,2566,2567],{},"计算 137 除以 10 的商和余数。",[48,2569,2570],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2572,231],{},[14,2574,234],{"id":234},[10,2576,2577],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,2579,241],{},{"title":76,"searchDepth":89,"depth":89,"links":2581},[2582,2583,2584,2585,2586,2587,2588,2589],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2421,"description":2426},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[254,2597,2598],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2601,"title":2602,"body":2603,"category":254,"cover":255,"description":2607,"extension":256,"meta":2782,"navigation":104,"path":2783,"pinned":259,"publishedAt":260,"seo":2784,"slug":2785,"stem":2786,"summary":2787,"tags":2788,"updatedAt":260,"visible":104,"__hash__":2791},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2604,"toc":2770},[2605,2608,2610,2613,2615,2621,2631,2633,2644,2646,2648,2678,2680,2686,2688,2690,2720,2722,2725,2731,2734,2736,2744,2746,2761,2763,2765,2768],[10,2606,2607],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2609,16],{"id":16},[10,2611,2612],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2614,22],{"id":22},[10,2616,2617],{},[26,2618],{"alt":2619,"src":2620},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2622,2623,2624,2627,2628,205],{},"切片 ",[33,2625,2626],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2629,2630],{},"stop - start",[14,2632,43],{"id":43},[45,2634,2635,2638,2641],{},[48,2636,2637],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[48,2639,2640],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[48,2642,2643],{},"切片会创建新的字符串，不会修改原字符串。",[14,2645,66],{"id":66},[10,2647,69],{},[71,2649,2651],{"className":73,"code":2650,"language":75,"meta":76,"style":76},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2652,2653,2658,2663,2668,2673],{"__ignoreMap":76},[80,2654,2655],{"class":82,"line":83},[80,2656,2657],{},"language = \"Python\"\n",[80,2659,2660],{"class":82,"line":89},[80,2661,2662],{},"print(language[0])\n",[80,2664,2665],{"class":82,"line":95},[80,2666,2667],{},"print(language[-1])\n",[80,2669,2670],{"class":82,"line":101},[80,2671,2672],{},"print(language[0:3])\n",[80,2674,2675],{"class":82,"line":108},[80,2676,2677],{},"print(language + \" 3.14\")\n",[10,2679,138],{},[71,2681,2684],{"className":2682,"code":2683,"language":144,"meta":76},[142],"P\nn\nPyt\nPython 3.14\n",[33,2685,2683],{"__ignoreMap":76},[10,2687,149],{},[14,2689,152],{"id":152},[154,2691,2692,2706],{},[48,2693,2694,2695,2697,2698,2701,2702,2705],{},"字符串 ",[33,2696,254],{}," 的正索引从 ",[33,2699,2700],{},"P"," 的 0 开始，负索引从末尾 ",[33,2703,2704],{},"n"," 的 -1 开始。",[48,2707,2708,2711,2712,2715,2716,2719],{},[33,2709,2710],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2713,2714],{},"Pyt","；索引 3 的 ",[33,2717,2718],{},"h"," 不在结果中。",[177,2721,179],{"id":179},[10,2723,2724],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2726,2727],{},[26,2728],{"alt":2729,"src":2730},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2732,2733],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2735,194],{"id":194},[45,2737,2738,2741],{},[48,2739,2740],{},"把第一个字符写成索引 1，造成整体偏移一位。",[48,2742,2743],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2745,211],{"id":211},[154,2747,2748,2758],{},[48,2749,2750,2751,2754,2755,205],{},"从 ",[33,2752,2753],{},"\"programming\""," 中切出 ",[33,2756,2757],{},"\"gram\"",[48,2759,2760],{},"使用负索引取得字符串倒数第二个字符。",[10,2762,231],{},[14,2764,234],{"id":234},[10,2766,2767],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,2769,241],{},{"title":76,"searchDepth":89,"depth":89,"links":2771},[2772,2773,2774,2775,2776,2779,2780,2781],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":2777},[2778],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2602,"description":2607},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[254,2789,2790],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2793,"title":2794,"body":2795,"category":254,"cover":255,"description":2799,"extension":256,"meta":3012,"navigation":104,"path":3013,"pinned":259,"publishedAt":260,"seo":3014,"slug":3015,"stem":3016,"summary":3017,"tags":3018,"updatedAt":260,"visible":104,"__hash__":3021},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2796,"toc":3000},[2797,2800,2802,2805,2807,2813,2823,2825,2857,2859,2861,2905,2907,2913,2915,2917,2938,2940,2943,2949,2957,2959,2973,2975,2991,2993,2995,2998],[10,2798,2799],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2801,16],{"id":16},[10,2803,2804],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2806,22],{"id":22},[10,2808,2809],{},[26,2810],{"alt":2811,"src":2812},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2814,2815,2816,1036,2819,2822],{},"比较表达式先产生 ",[33,2817,2818],{},"True",[33,2820,2821],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2824,43],{"id":43},[45,2826,2827,2840,2854],{},[48,2828,2829,2831,2832,2835,2836,2839],{},[33,2830,52],{}," 判断是否相等，",[33,2833,2834],{},"!="," 判断是否不等；单个 ",[33,2837,2838],{},"="," 是赋值。",[48,2841,2842,2845,2846,2849,2850,2853],{},[33,2843,2844],{},"and"," 要求两侧都为真，",[33,2847,2848],{},"or"," 只需一侧为真，",[33,2851,2852],{},"not"," 取反。",[48,2855,2856],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2858,66],{"id":66},[10,2860,69],{},[71,2862,2864],{"className":73,"code":2863,"language":75,"meta":76,"style":76},"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,2865,2866,2871,2876,2880,2885,2890,2895,2900],{"__ignoreMap":76},[80,2867,2868],{"class":82,"line":83},[80,2869,2870],{},"age = 20\n",[80,2872,2873],{"class":82,"line":89},[80,2874,2875],{},"has_ticket = True\n",[80,2877,2878],{"class":82,"line":95},[80,2879,105],{"emptyLinePlaceholder":104},[80,2881,2882],{"class":82,"line":101},[80,2883,2884],{},"is_adult = age >= 18\n",[80,2886,2887],{"class":82,"line":108},[80,2888,2889],{},"can_enter = is_adult and has_ticket\n",[80,2891,2892],{"class":82,"line":114},[80,2893,2894],{},"print(is_adult)\n",[80,2896,2897],{"class":82,"line":120},[80,2898,2899],{},"print(can_enter)\n",[80,2901,2902],{"class":82,"line":126},[80,2903,2904],{},"print(not has_ticket)\n",[10,2906,138],{},[71,2908,2911],{"className":2909,"code":2910,"language":144,"meta":76},[142],"True\nTrue\nFalse\n",[33,2912,2910],{"__ignoreMap":76},[10,2914,149],{},[14,2916,152],{"id":152},[154,2918,2919,2929],{},[48,2920,2921,2924,2925,2928],{},[33,2922,2923],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2926,2927],{},"is_adult","，这一步没有任何分支跳转。",[48,2930,2931,2934,2935,2937],{},[33,2932,2933],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2936,2852],{}," 只对紧随其后的值取反。",[177,2939,179],{"id":179},[10,2941,2942],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2944,2945],{},[26,2946],{"alt":2947,"src":2948},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2950,2951,2953,2954,2956],{},[33,2952,2844],{}," 只有“真、真”得到真；",[33,2955,2848],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2958,194],{"id":194},[45,2960,2961,2970],{},[48,2962,2963,2964,2966,2967,2969],{},"用单个等号判断相等。",[33,2965,2838],{}," 是赋值，",[33,2968,52],{}," 才是相等比较。",[48,2971,2972],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2974,211],{"id":211},[154,2976,2977,2984],{},[48,2978,2979,2980,2983],{},"判断数字 ",[33,2981,2982],{},"15"," 是否同时大于 10 且小于 20。",[48,2985,2986,2987,2990],{},"分别修改年龄和票据状态，记录 ",[33,2988,2989],{},"can_enter"," 的四种组合结果。",[10,2992,231],{},[14,2994,234],{"id":234},[10,2996,2997],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,2999,241],{},{"title":76,"searchDepth":89,"depth":89,"links":3001},[3002,3003,3004,3005,3006,3009,3010,3011],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":3007},[3008],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2794,"description":2799},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[254,3019,3020],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3023,"title":3024,"body":3025,"category":254,"cover":255,"description":3029,"extension":256,"meta":3197,"navigation":104,"path":3198,"pinned":259,"publishedAt":260,"seo":3199,"slug":3200,"stem":3201,"summary":3202,"tags":3203,"updatedAt":260,"visible":104,"__hash__":3205},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3026,"toc":3187},[3027,3030,3032,3035,3037,3043,3061,3063,3076,3078,3080,3114,3116,3122,3124,3126,3148,3150,3162,3164,3178,3180,3182,3185],[10,3028,3029],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3031,16],{"id":16},[10,3033,3034],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3036,22],{"id":22},[10,3038,3039],{},[26,3040],{"alt":3041,"src":3042},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3044,3045,3048,3049,3052,3053,3056,3057,3060],{},[33,3046,3047],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,3050,3051],{},"18","，程序首先得到的也是 ",[33,3054,3055],{},"\"18\"","，需要 ",[33,3058,3059],{},"int()"," 后才能按整数参与计算。",[14,3062,43],{"id":43},[45,3064,3065,3068,3073],{},[48,3066,3067],{},"提示文字应告诉用户需要输入什么。",[48,3069,3070,3072],{},[33,3071,3059],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[48,3074,3075],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3077,66],{"id":66},[10,3079,69],{},[71,3081,3083],{"className":73,"code":3082,"language":75,"meta":76,"style":76},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3084,3085,3090,3095,3100,3104,3109],{"__ignoreMap":76},[80,3086,3087],{"class":82,"line":83},[80,3088,3089],{},"name = input(\"请输入姓名：\")\n",[80,3091,3092],{"class":82,"line":89},[80,3093,3094],{},"age_text = input(\"请输入年龄：\")\n",[80,3096,3097],{"class":82,"line":95},[80,3098,3099],{},"age = int(age_text)\n",[80,3101,3102],{"class":82,"line":101},[80,3103,105],{"emptyLinePlaceholder":104},[80,3105,3106],{"class":82,"line":108},[80,3107,3108],{},"print(\"你好，\" + name)\n",[80,3110,3111],{"class":82,"line":114},[80,3112,3113],{},"print(age + 1)\n",[10,3115,138],{},[71,3117,3120],{"className":3118,"code":3119,"language":144,"meta":76},[142],"根据输入显示姓名，并输出下一年的年龄\n",[33,3121,3119],{"__ignoreMap":76},[10,3123,149],{},[14,3125,152],{"id":152},[154,3127,3128,3138],{},[48,3129,3130,3131,3133,3134,3137],{},"两次 ",[33,3132,3047],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3135,3136],{},"age_text"," 用来提醒这仍是文本。",[48,3139,3140,3143,3144,3147],{},[33,3141,3142],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3145,3146],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3149,194],{"id":194},[45,3151,3152,3159],{},[48,3153,3154,3155,3158],{},"直接计算 ",[33,3156,3157],{},"input(...) + 1","，忽略输入结果是字符串。",[48,3160,3161],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3163,211],{"id":211},[154,3165,3166,3169],{},[48,3167,3168],{},"接收两个整数并输出它们的和。",[48,3170,1746,3171,3174,3175,3177],{},[33,3172,3173],{},"18.5"," 给 ",[33,3176,3059],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3179,231],{},[14,3181,234],{"id":234},[10,3183,3184],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,3186,241],{},{"title":76,"searchDepth":89,"depth":89,"links":3188},[3189,3190,3191,3192,3193,3194,3195,3196],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3024,"description":3029},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[254,2371,3204],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3207,"title":3208,"body":3209,"category":254,"cover":255,"description":3213,"extension":256,"meta":3373,"navigation":104,"path":3374,"pinned":259,"publishedAt":260,"seo":3375,"slug":3376,"stem":3377,"summary":3378,"tags":3379,"updatedAt":260,"visible":104,"__hash__":3382},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3210,"toc":3363},[3211,3214,3216,3219,3221,3227,3234,3236,3250,3252,3254,3293,3295,3301,3303,3305,3324,3326,3341,3343,3354,3356,3358,3361],[10,3212,3213],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3215,16],{"id":16},[10,3217,3218],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3220,22],{"id":22},[10,3222,3223],{},[26,3224],{"alt":3225,"src":3226},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3228,3229,3230,3233],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3231,3232],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3235,43],{"id":43},[45,3237,3238,3241,3244],{},[48,3239,3240],{},"列表使用方括号，元素之间用逗号分隔。",[48,3242,3243],{},"列表可变，可以替换、追加和删除元素。",[48,3245,3246,3247,205],{},"访问不存在的索引会产生 ",[33,3248,3249],{},"IndexError",[14,3251,66],{"id":66},[10,3253,69],{},[71,3255,3257],{"className":73,"code":3256,"language":75,"meta":76,"style":76},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3258,3259,3264,3269,3273,3278,3283,3288],{"__ignoreMap":76},[80,3260,3261],{"class":82,"line":83},[80,3262,3263],{},"scores = [82, 90, 76]\n",[80,3265,3266],{"class":82,"line":89},[80,3267,3268],{},"print(scores[0])\n",[80,3270,3271],{"class":82,"line":95},[80,3272,105],{"emptyLinePlaceholder":104},[80,3274,3275],{"class":82,"line":101},[80,3276,3277],{},"scores[1] = 95\n",[80,3279,3280],{"class":82,"line":108},[80,3281,3282],{},"scores.append(88)\n",[80,3284,3285],{"class":82,"line":114},[80,3286,3287],{},"print(scores)\n",[80,3289,3290],{"class":82,"line":120},[80,3291,3292],{},"print(len(scores))\n",[10,3294,138],{},[71,3296,3299],{"className":3297,"code":3298,"language":144,"meta":76},[142],"82\n[82, 95, 76, 88]\n4\n",[33,3300,3298],{"__ignoreMap":76},[10,3302,149],{},[14,3304,152],{"id":152},[154,3306,3307,3310],{},[48,3308,3309],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[48,3311,3312,3315,3316,3319,3320,3323],{},[33,3313,3314],{},"scores[1] = 95"," 替换第二个位置，",[33,3317,3318],{},"append(88)"," 在末尾增加新位置，",[33,3321,3322],{},"len()"," 因而从 3 变为 4。",[14,3325,194],{"id":194},[45,3327,3328,3338],{},[48,3329,3330,3331,3334,3335,205],{},"访问 ",[33,3332,3333],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3336,3337],{},"len(scores) - 1",[48,3339,3340],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3342,211],{"id":211},[154,3344,3345,3348],{},[48,3346,3347],{},"建立三项学习任务列表，再追加第四项。",[48,3349,3350,3351,3353],{},"修改第二项，并用 ",[33,3352,3322],{}," 检查元素数量。",[10,3355,231],{},[14,3357,234],{"id":234},[10,3359,3360],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,3362,241],{},{"title":76,"searchDepth":89,"depth":89,"links":3364},[3365,3366,3367,3368,3369,3370,3371,3372],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3208,"description":3213},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[254,3380,3381],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3384,"title":3385,"body":3386,"category":254,"cover":255,"description":3390,"extension":256,"meta":3531,"navigation":104,"path":3532,"pinned":259,"publishedAt":260,"seo":3533,"slug":3534,"stem":3535,"summary":3536,"tags":3537,"updatedAt":260,"visible":104,"__hash__":3539},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3387,"toc":3521},[3388,3391,3393,3396,3398,3404,3407,3409,3420,3422,3424,3458,3460,3466,3468,3470,3484,3486,3498,3500,3512,3514,3516,3519],[10,3389,3390],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3392,16],{"id":16},[10,3394,3395],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3397,22],{"id":22},[10,3399,3400],{},[26,3401],{"alt":3402,"src":3403},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3405,3406],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3408,43],{"id":43},[45,3410,3411,3414,3417],{},[48,3412,3413],{},"元组常用来表达固定数量、固定含义的一组值。",[48,3415,3416],{},"只有一个元素的元组必须保留尾随逗号。",[48,3418,3419],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3421,66],{"id":66},[10,3423,69],{},[71,3425,3427],{"className":73,"code":3426,"language":75,"meta":76,"style":76},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3428,3429,3434,3439,3444,3448,3453],{"__ignoreMap":76},[80,3430,3431],{"class":82,"line":83},[80,3432,3433],{},"point = (120, 80)\n",[80,3435,3436],{"class":82,"line":89},[80,3437,3438],{},"print(point[0])\n",[80,3440,3441],{"class":82,"line":95},[80,3442,3443],{},"print(point[1])\n",[80,3445,3446],{"class":82,"line":101},[80,3447,105],{"emptyLinePlaceholder":104},[80,3449,3450],{"class":82,"line":108},[80,3451,3452],{},"single = (5,)\n",[80,3454,3455],{"class":82,"line":114},[80,3456,3457],{},"print(single)\n",[10,3459,138],{},[71,3461,3464],{"className":3462,"code":3463,"language":144,"meta":76},[142],"120\n80\n(5,)\n",[33,3465,3463],{"__ignoreMap":76},[10,3467,149],{},[14,3469,152],{"id":152},[154,3471,3472,3478],{},[48,3473,3474,3477],{},[33,3475,3476],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[48,3479,3480,3483],{},[33,3481,3482],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3485,194],{"id":194},[45,3487,3488,3495],{},[48,3489,3490,3491,3494],{},"把 ",[33,3492,3493],{},"(5)"," 当作元组，实际它仍是整数。",[48,3496,3497],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3499,211],{"id":211},[154,3501,3502,3505],{},[48,3503,3504],{},"用元组表示宽度和高度。",[48,3506,2199,3507,2202,3509,3511],{},[33,3508,3493],{},[33,3510,3482],{}," 的类型。",[10,3513,231],{},[14,3515,234],{"id":234},[10,3517,3518],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,3520,241],{},{"title":76,"searchDepth":89,"depth":89,"links":3522},[3523,3524,3525,3526,3527,3528,3529,3530],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3385,"description":3390},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[254,3538,3381],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3541,"title":3542,"body":3543,"category":254,"cover":255,"description":3547,"extension":256,"meta":3702,"navigation":104,"path":3703,"pinned":259,"publishedAt":260,"seo":3704,"slug":3705,"stem":3706,"summary":3707,"tags":3708,"updatedAt":260,"visible":104,"__hash__":3710},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3544,"toc":3692},[3545,3548,3550,3553,3555,3561,3571,3573,3587,3589,3591,3625,3627,3633,3635,3637,3652,3654,3673,3675,3683,3685,3687,3690],[10,3546,3547],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3549,16],{"id":16},[10,3551,3552],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3554,22],{"id":22},[10,3556,3557],{},[26,3558],{"alt":3559,"src":3560},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3562,3563,3564,3567,3568,3570],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3565,3566],{},"student[\"score\"]"," 读取的是键 ",[33,3569,2272],{}," 对应的值，而不是“第几个元素”。",[14,3572,43],{"id":43},[45,3574,3575,3578,3584],{},[48,3576,3577],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[48,3579,219,3580,3583],{},[33,3581,3582],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[48,3585,3586],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3588,66],{"id":66},[10,3590,69],{},[71,3592,3594],{"className":73,"code":3593,"language":75,"meta":76,"style":76},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3595,3596,3601,3606,3610,3615,3620],{"__ignoreMap":76},[80,3597,3598],{"class":82,"line":83},[80,3599,3600],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[80,3602,3603],{"class":82,"line":89},[80,3604,3605],{},"print(student[\"name\"])\n",[80,3607,3608],{"class":82,"line":95},[80,3609,105],{"emptyLinePlaceholder":104},[80,3611,3612],{"class":82,"line":101},[80,3613,3614],{},"student[\"score\"] = 95\n",[80,3616,3617],{"class":82,"line":108},[80,3618,3619],{},"student[\"city\"] = \"郑州\"\n",[80,3621,3622],{"class":82,"line":114},[80,3623,3624],{},"print(student)\n",[10,3626,138],{},[71,3628,3631],{"className":3629,"code":3630,"language":144,"meta":76},[142],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3632,3630],{"__ignoreMap":76},[10,3634,149],{},[14,3636,152],{"id":152},[154,3638,3639,3642],{},[48,3640,3641],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[48,3643,3644,3645,3647,3648,3651],{},"给已有键 ",[33,3646,2272],{}," 赋值会更新映射，给新键 ",[33,3649,3650],{},"city"," 赋值会增加映射。",[14,3653,194],{"id":194},[45,3655,3656,3663],{},[48,3657,3658,3659,3662],{},"按位置理解字典并尝试 ",[33,3660,3661],{},"student[0]","，而实际键是字符串。",[48,3664,3665,3666,3669,3670,205],{},"直接读取不确定存在的键并忽略 ",[33,3667,3668],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3671,3672],{},"get()",[14,3674,211],{"id":211},[154,3676,3677,3680],{},[48,3678,3679],{},"建立一本书的标题、作者和页数字典。",[48,3681,3682],{},"添加分类键，再修改页数。",[10,3684,231],{},[14,3686,234],{"id":234},[10,3688,3689],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,3691,241],{},{"title":76,"searchDepth":89,"depth":89,"links":3693},[3694,3695,3696,3697,3698,3699,3700,3701],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3542,"description":3547},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[254,3709,3381],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3712,"title":3713,"body":3714,"category":254,"cover":255,"description":3718,"extension":256,"meta":3867,"navigation":104,"path":3868,"pinned":259,"publishedAt":260,"seo":3869,"slug":3870,"stem":3871,"summary":3872,"tags":3873,"updatedAt":260,"visible":104,"__hash__":3875},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3715,"toc":3857},[3716,3719,3721,3724,3726,3732,3735,3737,3756,3758,3760,3794,3796,3802,3804,3806,3821,3823,3835,3837,3848,3850,3852,3855],[10,3717,3718],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3720,16],{"id":16},[10,3722,3723],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3725,22],{"id":22},[10,3727,3728],{},[26,3729],{"alt":3730,"src":3731},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3733,3734],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3736,43],{"id":43},[45,3738,3739,3742,3745],{},[48,3740,3741],{},"集合中的元素不重复。",[48,3743,3744],{},"集合是无序容器，不要依赖打印顺序或索引。",[48,3746,3747,3748,3751,3752,3755],{},"创建空集合必须写 ",[33,3749,3750],{},"set()","；",[33,3753,3754],{},"{}"," 创建的是空字典。",[14,3757,66],{"id":66},[10,3759,69],{},[71,3761,3763],{"className":73,"code":3762,"language":75,"meta":76,"style":76},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3764,3765,3770,3775,3779,3784,3789],{"__ignoreMap":76},[80,3766,3767],{"class":82,"line":83},[80,3768,3769],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[80,3771,3772],{"class":82,"line":89},[80,3773,3774],{},"right = {\"Python\", \"Docker\"}\n",[80,3776,3777],{"class":82,"line":95},[80,3778,105],{"emptyLinePlaceholder":104},[80,3780,3781],{"class":82,"line":101},[80,3782,3783],{},"print(left & right)\n",[80,3785,3786],{"class":82,"line":108},[80,3787,3788],{},"print(left | right)\n",[80,3790,3791],{"class":82,"line":114},[80,3792,3793],{},"print(\"Git\" in left)\n",[10,3795,138],{},[71,3797,3800],{"className":3798,"code":3799,"language":144,"meta":76},[142],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3801,3799],{"__ignoreMap":76},[10,3803,149],{},[14,3805,152],{"id":152},[154,3807,3808,3811],{},[48,3809,3810],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[48,3812,3813,3816,3817,3820],{},[33,3814,3815],{},"&"," 计算交集，",[33,3818,3819],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3822,194],{"id":194},[45,3824,3825,3832],{},[48,3826,219,3827,3829,3830,205],{},[33,3828,3754],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3831,3750],{},[48,3833,3834],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3836,211],{"id":211},[154,3838,3839,3845],{},[48,3840,3841,3842,3844],{},"把包含重复标签的列表交给 ",[33,3843,3750],{}," 去重。",[48,3846,3847],{},"计算两组课程标签的交集和差集。",[10,3849,231],{},[14,3851,234],{"id":234},[10,3853,3854],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,3856,241],{},{"title":76,"searchDepth":89,"depth":89,"links":3858},[3859,3860,3861,3862,3863,3864,3865,3866],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3713,"description":3718},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[254,3874,3381],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":4,"title":5,"body":3877,"category":254,"cover":255,"description":12,"extension":256,"meta":4036,"navigation":104,"path":258,"pinned":259,"publishedAt":260,"seo":4037,"slug":262,"stem":263,"summary":264,"tags":4038,"updatedAt":260,"visible":104,"__hash__":268},{"type":7,"value":3878,"toc":4024},[3879,3881,3883,3885,3887,3891,3897,3899,3911,3913,3915,3955,3957,3962,3964,3966,3980,3982,3984,3988,3990,3992,4002,4004,4016,4018,4020,4022],[10,3880,12],{},[14,3882,16],{"id":16},[10,3884,19],{},[14,3886,22],{"id":22},[10,3888,3889],{},[26,3890],{"alt":28,"src":29},[10,3892,3893,36,3895,40],{},[33,3894,35],{},[33,3896,39],{},[14,3898,43],{"id":43},[45,3900,3901,3907,3909],{},[48,3902,3903,53,3905,57],{},[33,3904,52],{},[33,3906,56],{},[48,3908,60],{},[48,3910,63],{},[14,3912,66],{"id":66},[10,3914,69],{},[71,3916,3917],{"className":73,"code":74,"language":75,"meta":76,"style":76},[33,3918,3919,3923,3927,3931,3935,3939,3943,3947,3951],{"__ignoreMap":76},[80,3920,3921],{"class":82,"line":83},[80,3922,86],{},[80,3924,3925],{"class":82,"line":89},[80,3926,92],{},[80,3928,3929],{"class":82,"line":95},[80,3930,98],{},[80,3932,3933],{"class":82,"line":101},[80,3934,105],{"emptyLinePlaceholder":104},[80,3936,3937],{"class":82,"line":108},[80,3938,111],{},[80,3940,3941],{"class":82,"line":114},[80,3942,117],{},[80,3944,3945],{"class":82,"line":120},[80,3946,123],{},[80,3948,3949],{"class":82,"line":126},[80,3950,129],{},[80,3952,3953],{"class":82,"line":132},[80,3954,135],{},[10,3956,138],{},[71,3958,3960],{"className":3959,"code":143,"language":144,"meta":76},[142],[33,3961,143],{"__ignoreMap":76},[10,3963,149],{},[14,3965,152],{"id":152},[154,3967,3968,3972],{},[48,3969,3970,161],{},[33,3971,160],{},[48,3973,3974,167,3976,171,3978,175],{},[33,3975,166],{},[33,3977,170],{},[33,3979,174],{},[177,3981,179],{"id":179},[10,3983,182],{},[10,3985,3986],{},[26,3987],{"alt":187,"src":188},[10,3989,191],{},[14,3991,194],{"id":194},[45,3993,3994,4000],{},[48,3995,199,3996,202,3998,205],{},[33,3997,52],{},[33,3999,56],{},[48,4001,208],{},[14,4003,211],{"id":211},[154,4005,4006,4008],{},[48,4007,216],{},[48,4009,219,4010,223,4012,226,4014,205],{},[33,4011,222],{},[33,4013,56],{},[33,4015,52],{},[10,4017,231],{},[14,4019,234],{"id":234},[10,4021,237],{},[239,4023,241],{},{"title":76,"searchDepth":89,"depth":89,"links":4025},[4026,4027,4028,4029,4030,4033,4034,4035],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":4031},[4032],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":5,"description":12},[254,266,267],{"id":4040,"title":4041,"body":4042,"category":254,"cover":255,"description":4046,"extension":256,"meta":4259,"navigation":104,"path":4260,"pinned":259,"publishedAt":260,"seo":4261,"slug":4262,"stem":4263,"summary":4264,"tags":4265,"updatedAt":260,"visible":104,"__hash__":4267},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4043,"toc":4246},[4044,4047,4049,4052,4054,4060,4070,4072,4083,4085,4087,4140,4142,4148,4150,4152,4170,4172,4175,4181,4189,4192,4195,4201,4207,4209,4227,4229,4237,4239,4241,4244],[10,4045,4046],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4048,16],{"id":16},[10,4050,4051],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4053,22],{"id":22},[10,4055,4056],{},[26,4057],{"alt":4058,"src":4059},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4061,4062,2283,4064,2283,4067,4069],{},[33,4063,1183],{},[33,4065,4066],{},"elif",[33,4068,1186],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4071,43],{"id":43},[45,4073,4074,4077,4080],{},[48,4075,4076],{},"冒号表示接下来开始一个代码块。",[48,4078,4079],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[48,4081,4082],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4084,66],{"id":66},[10,4086,69],{},[71,4088,4090],{"className":73,"code":4089,"language":75,"meta":76,"style":76},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4091,4092,4097,4101,4106,4111,4116,4121,4125,4130,4134],{"__ignoreMap":76},[80,4093,4094],{"class":82,"line":83},[80,4095,4096],{},"score = int(input(\"请输入分数：\"))\n",[80,4098,4099],{"class":82,"line":89},[80,4100,105],{"emptyLinePlaceholder":104},[80,4102,4103],{"class":82,"line":95},[80,4104,4105],{},"if score >= 90:\n",[80,4107,4108],{"class":82,"line":101},[80,4109,4110],{},"    level = \"优秀\"\n",[80,4112,4113],{"class":82,"line":108},[80,4114,4115],{},"elif score >= 60:\n",[80,4117,4118],{"class":82,"line":114},[80,4119,4120],{},"    level = \"合格\"\n",[80,4122,4123],{"class":82,"line":120},[80,4124,1173],{},[80,4126,4127],{"class":82,"line":126},[80,4128,4129],{},"    level = \"需要继续学习\"\n",[80,4131,4132],{"class":82,"line":132},[80,4133,105],{"emptyLinePlaceholder":104},[80,4135,4137],{"class":82,"line":4136},10,[80,4138,4139],{},"print(level)\n",[10,4141,138],{},[71,4143,4146],{"className":4144,"code":4145,"language":144,"meta":76},[142],"输入 85 时输出：合格\n",[33,4147,4145],{"__ignoreMap":76},[10,4149,149],{},[14,4151,152],{"id":152},[154,4153,4154,4161],{},[48,4155,4156,4157,4160],{},"输入先转换为整数，程序从 ",[33,4158,4159],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[48,4162,4163,4166,4167,4169],{},[33,4164,4165],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4168,1186],{}," 被跳过；最终三个分支只会选择一个。",[177,4171,179],{"id":179},[10,4173,4174],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4176,4177],{},[26,4178],{"alt":4179,"src":4180},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4182,4183,4185,4186,4188],{},[33,4184,4159],{}," 必须放在 ",[33,4187,4165],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[177,4190,179],{"id":4191},"再看一个具体细节-1",[10,4193,4194],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4196,4197],{},[26,4198],{"alt":4199,"src":4200},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4202,4203,4204,4206],{},"同一缩进层级属于同一个代码块；回到 ",[33,4205,1183],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4208,194],{"id":194},[45,4210,4211,4217],{},[48,4212,4213,4214,4216],{},"先写 ",[33,4215,4165],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[48,4218,4219,4220,4222,4223,4226],{},"混用多个独立 ",[33,4221,1183],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4224,4225],{},"if\u002Felif\u002Felse"," 链。",[14,4228,211],{"id":211},[154,4230,4231,4234],{},[48,4232,4233],{},"根据温度输出“冷、适中、热”三个等级。",[48,4235,4236],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4238,231],{},[14,4240,234],{"id":234},[10,4242,4243],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,4245,241],{},{"title":76,"searchDepth":89,"depth":89,"links":4247},[4248,4249,4250,4251,4252,4256,4257,4258],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":4253},[4254,4255],{"id":179,"depth":95,"text":179},{"id":4191,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4041,"description":4046},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[254,1183,4266],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4269,"title":4270,"body":4271,"category":254,"cover":255,"description":4275,"extension":256,"meta":4441,"navigation":104,"path":4442,"pinned":259,"publishedAt":260,"seo":4443,"slug":4444,"stem":4445,"summary":4446,"tags":4447,"updatedAt":260,"visible":104,"__hash__":4449},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4272,"toc":4429},[4273,4276,4278,4281,4283,4289,4295,4297,4312,4314,4316,4354,4356,4362,4364,4366,4381,4383,4386,4392,4398,4400,4408,4410,4420,4422,4424,4427],[10,4274,4275],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4277,16],{"id":16},[10,4279,4280],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4282,22],{"id":22},[10,4284,4285],{},[26,4286],{"alt":4287,"src":4288},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4290,4291,4294],{},[33,4292,4293],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4296,43],{"id":43},[45,4298,4299,4302,4305],{},[48,4300,4301],{},"进入循环前先准备参与条件判断的状态。",[48,4303,4304],{},"循环体中必须有机会让条件变为假。",[48,4306,4307,4308,4311],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4309,4310],{},"for"," 通常更直接。",[14,4313,66],{"id":66},[10,4315,69],{},[71,4317,4319],{"className":73,"code":4318,"language":75,"meta":76,"style":76},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4320,4321,4326,4330,4335,4340,4345,4349],{"__ignoreMap":76},[80,4322,4323],{"class":82,"line":83},[80,4324,4325],{},"count = 1\n",[80,4327,4328],{"class":82,"line":89},[80,4329,105],{"emptyLinePlaceholder":104},[80,4331,4332],{"class":82,"line":95},[80,4333,4334],{},"while count \u003C= 3:\n",[80,4336,4337],{"class":82,"line":101},[80,4338,4339],{},"    print(\"第\", count, \"次练习\")\n",[80,4341,4342],{"class":82,"line":108},[80,4343,4344],{},"    count = count + 1\n",[80,4346,4347],{"class":82,"line":114},[80,4348,105],{"emptyLinePlaceholder":104},[80,4350,4351],{"class":82,"line":120},[80,4352,4353],{},"print(\"练习结束\")\n",[10,4355,138],{},[71,4357,4360],{"className":4358,"code":4359,"language":144,"meta":76},[142],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4361,4359],{"__ignoreMap":76},[10,4363,149],{},[14,4365,152],{"id":152},[154,4367,4368,4375],{},[48,4369,4370,4371,4374],{},"进入循环前 ",[33,4372,4373],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[48,4376,4377,4378,4380],{},"循环体末尾把 ",[33,4379,4373],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[177,4382,179],{"id":179},[10,4384,4385],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4387,4388],{},[26,4389],{"alt":4390,"src":4391},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4393,4394,4395,4397],{},"第4次检查时 ",[33,4396,4373],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4399,194],{"id":194},[45,4401,4402,4405],{},[48,4403,4404],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[48,4406,4407],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4409,211],{"id":211},[154,4411,4412,4417],{},[48,4413,219,4414,4416],{},[33,4415,4293],{}," 输出 1 到 5。",[48,4418,4419],{},"计算 1 到 10 的累加和。",[10,4421,231],{},[14,4423,234],{"id":234},[10,4425,4426],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,4428,241],{},{"title":76,"searchDepth":89,"depth":89,"links":4430},[4431,4432,4433,4434,4435,4438,4439,4440],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":4436},[4437],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4270,"description":4275},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[254,4293,4448],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4451,"title":4452,"body":4453,"category":254,"cover":255,"description":4457,"extension":256,"meta":4605,"navigation":104,"path":4606,"pinned":259,"publishedAt":260,"seo":4607,"slug":4608,"stem":4609,"summary":4610,"tags":4611,"updatedAt":260,"visible":104,"__hash__":4613},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4454,"toc":4595},[4455,4458,4460,4463,4465,4471,4476,4478,4492,4494,4496,4534,4536,4542,4544,4546,4563,4565,4573,4575,4586,4588,4590,4593],[10,4456,4457],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4459,16],{"id":16},[10,4461,4462],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4464,22],{"id":22},[10,4466,4467],{},[26,4468],{"alt":4469,"src":4470},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4472,4473,4475],{},[33,4474,4310],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4477,43],{"id":43},[45,4479,4480,4486,4489],{},[48,4481,4482,4485],{},[33,4483,4484],{},"range(1, 4)"," 包含 1，不包含 4。",[48,4487,4488],{},"只需要元素时直接遍历元素，不必手工维护索引。",[48,4490,4491],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4493,66],{"id":66},[10,4495,69],{},[71,4497,4499],{"className":73,"code":4498,"language":75,"meta":76,"style":76},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4500,4501,4506,4510,4515,4520,4524,4529],{"__ignoreMap":76},[80,4502,4503],{"class":82,"line":83},[80,4504,4505],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[80,4507,4508],{"class":82,"line":89},[80,4509,105],{"emptyLinePlaceholder":104},[80,4511,4512],{"class":82,"line":95},[80,4513,4514],{},"for course in courses:\n",[80,4516,4517],{"class":82,"line":101},[80,4518,4519],{},"    print(course)\n",[80,4521,4522],{"class":82,"line":108},[80,4523,105],{"emptyLinePlaceholder":104},[80,4525,4526],{"class":82,"line":114},[80,4527,4528],{},"for number in range(1, 4):\n",[80,4530,4531],{"class":82,"line":120},[80,4532,4533],{},"    print(number)\n",[10,4535,138],{},[71,4537,4540],{"className":4538,"code":4539,"language":144,"meta":76},[142],"变量\n字符串\n列表\n1\n2\n3\n",[33,4541,4539],{"__ignoreMap":76},[10,4543,149],{},[14,4545,152],{"id":152},[154,4547,4548,4558],{},[48,4549,4550,4551,4553,4554,4557],{},"第一个 ",[33,4552,4310],{}," 依次从列表取得字符串，循环变量 ",[33,4555,4556],{},"course"," 每轮重新绑定。",[48,4559,4560,4562],{},[33,4561,4484],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4564,194],{"id":194},[45,4566,4567,4570],{},[48,4568,4569],{},"只需要元素却手工维护索引，增加越界风险。",[48,4571,4572],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4574,211],{"id":211},[154,4576,4577,4580],{},[48,4578,4579],{},"逐项输出一个字符串中的字符。",[48,4581,219,4582,4585],{},[33,4583,4584],{},"range()"," 输出 2、4、6、8。",[10,4587,231],{},[14,4589,234],{"id":234},[10,4591,4592],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,4594,241],{},{"title":76,"searchDepth":89,"depth":89,"links":4596},[4597,4598,4599,4600,4601,4602,4603,4604],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4452,"description":4457},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[254,4310,4612],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4615,"title":4616,"body":4617,"category":254,"cover":255,"description":4621,"extension":256,"meta":4795,"navigation":104,"path":4796,"pinned":259,"publishedAt":260,"seo":4797,"slug":4798,"stem":4799,"summary":4800,"tags":4801,"updatedAt":260,"visible":104,"__hash__":4802},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4618,"toc":4785},[4619,4622,4624,4627,4629,4635,4645,4647,4666,4668,4670,4722,4724,4730,4732,4734,4748,4750,4766,4768,4776,4778,4780,4783],[10,4620,4621],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4623,16],{"id":16},[10,4625,4626],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4628,22],{"id":22},[10,4630,4631],{},[26,4632],{"alt":4633,"src":4634},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4636,4637,4640,4641,4644],{},[33,4638,4639],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4642,4643],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4646,43],{"id":43},[45,4648,4649,4652,4660],{},[48,4650,4651],{},"先写普通循环，再在确有需要时加入流程控制语句。",[48,4653,4654,4656,4657,4659],{},[33,4655,4639],{}," 前要确认不会跳过 ",[33,4658,4293],{}," 循环中的状态更新。",[48,4661,4662,4663,4665],{},"多层嵌套中 ",[33,4664,4643],{}," 只结束它所在的最内层循环。",[14,4667,66],{"id":66},[10,4669,69],{},[71,4671,4673],{"className":73,"code":4672,"language":75,"meta":76,"style":76},"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,4674,4675,4680,4684,4689,4694,4699,4704,4709,4713,4717],{"__ignoreMap":76},[80,4676,4677],{"class":82,"line":83},[80,4678,4679],{},"numbers = [3, -1, 0, 8, 12]\n",[80,4681,4682],{"class":82,"line":89},[80,4683,105],{"emptyLinePlaceholder":104},[80,4685,4686],{"class":82,"line":95},[80,4687,4688],{},"for number in numbers:\n",[80,4690,4691],{"class":82,"line":101},[80,4692,4693],{},"    if number \u003C 0:\n",[80,4695,4696],{"class":82,"line":108},[80,4697,4698],{},"        continue\n",[80,4700,4701],{"class":82,"line":114},[80,4702,4703],{},"    if number == 0:\n",[80,4705,4706],{"class":82,"line":120},[80,4707,4708],{},"        break\n",[80,4710,4711],{"class":82,"line":126},[80,4712,4533],{},[80,4714,4715],{"class":82,"line":132},[80,4716,105],{"emptyLinePlaceholder":104},[80,4718,4719],{"class":82,"line":4136},[80,4720,4721],{},"print(\"循环结束\")\n",[10,4723,138],{},[71,4725,4728],{"className":4726,"code":4727,"language":144,"meta":76},[142],"3\n循环结束\n",[33,4729,4727],{"__ignoreMap":76},[10,4731,149],{},[14,4733,152],{"id":152},[154,4735,4736,4742],{},[48,4737,4738,4739,4741],{},"遇到 -1 时 ",[33,4740,4639],{}," 立即结束本轮，后面的判断和输出都不执行。",[48,4743,4744,4745,4747],{},"遇到 0 时 ",[33,4746,4643],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4749,194],{"id":194},[45,4751,4752,4757],{},[48,4753,3490,4754,4756],{},[33,4755,4639],{}," 当作结束循环，实际它只跳到下一轮。",[48,4758,4759,4760,4762,4763,4765],{},"在 ",[33,4761,4293],{}," 中把状态更新放在可能被 ",[33,4764,4639],{}," 跳过的位置，造成无限循环。",[14,4767,211],{"id":211},[154,4769,4770,4773],{},[48,4771,4772],{},"跳过列表中的空字符串并输出其他内容。",[48,4774,4775],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4777,231],{},[14,4779,234],{"id":234},[10,4781,4782],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,4784,241],{},{"title":76,"searchDepth":89,"depth":89,"links":4786},[4787,4788,4789,4790,4791,4792,4793,4794],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4616,"description":4621},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[254,4643,4639],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4804,"title":4805,"body":4806,"category":254,"cover":255,"description":4810,"extension":256,"meta":4981,"navigation":104,"path":4982,"pinned":259,"publishedAt":260,"seo":4983,"slug":4984,"stem":4985,"summary":4986,"tags":4987,"updatedAt":260,"visible":104,"__hash__":4990},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4807,"toc":4969},[4808,4811,4813,4816,4818,4824,4827,4829,4853,4855,4857,4891,4893,4899,4901,4903,4920,4922,4925,4931,4934,4936,4950,4952,4960,4962,4964,4967],[10,4809,4810],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4812,16],{"id":16},[10,4814,4815],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4817,22],{"id":22},[10,4819,4820],{},[26,4821],{"alt":4822,"src":4823},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4825,4826],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4828,43],{"id":43},[45,4830,4831,4834,4837],{},[48,4832,4833],{},"每增加一层嵌套，阅读成本都会上升。",[48,4835,4836],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[48,4838,4839,4840,2283,4843,4846,4847,2283,4850,205],{},"变量名使用 ",[33,4841,4842],{},"row",[33,4844,4845],{},"cell"," 等层级含义，避免全部写成 ",[33,4848,4849],{},"i",[33,4851,4852],{},"j",[14,4854,66],{"id":66},[10,4856,69],{},[71,4858,4860],{"className":73,"code":4859,"language":75,"meta":76,"style":76},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4861,4862,4867,4871,4876,4881,4886],{"__ignoreMap":76},[80,4863,4864],{"class":82,"line":83},[80,4865,4866],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[80,4868,4869],{"class":82,"line":89},[80,4870,105],{"emptyLinePlaceholder":104},[80,4872,4873],{"class":82,"line":95},[80,4874,4875],{},"for row in table:\n",[80,4877,4878],{"class":82,"line":101},[80,4879,4880],{},"    for cell in row:\n",[80,4882,4883],{"class":82,"line":108},[80,4884,4885],{},"        print(cell)\n",[80,4887,4888],{"class":82,"line":114},[80,4889,4890],{},"    print(\"一行结束\")\n",[10,4892,138],{},[71,4894,4897],{"className":4895,"code":4896,"language":144,"meta":76},[142],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4898,4896],{"__ignoreMap":76},[10,4900,149],{},[14,4902,152],{"id":152},[154,4904,4905,4917],{},[48,4906,4907,4908,4910,4911,226,4914,205],{},"外层变量 ",[33,4909,4842],{}," 先引用第一行列表，内层才依次处理 ",[33,4912,4913],{},"A1",[33,4915,4916],{},"A2",[48,4918,4919],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[177,4921,179],{"id":179},[10,4923,4924],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4926,4927],{},[26,4928],{"alt":4929,"src":4930},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4932,4933],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4935,194],{"id":194},[45,4937,4938,4947],{},[48,4939,4940,4941,1036,4944,4946],{},"把两层循环变量都叫 ",[33,4942,4943],{},"item",[33,4945,4849],{},"，难以确认当前层级。",[48,4948,4949],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4951,211],{"id":211},[154,4953,4954,4957],{},[48,4955,4956],{},"打印一个 2×3 数字表。",[48,4958,4959],{},"在内层增加条件，只输出大于 3 的元素。",[10,4961,231],{},[14,4963,234],{"id":234},[10,4965,4966],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,4968,241],{},{"title":76,"searchDepth":89,"depth":89,"links":4970},[4971,4972,4973,4974,4975,4978,4979,4980],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":4976},[4977],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4805,"description":4810},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[254,4988,4989],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4992,"title":4993,"body":4994,"category":254,"cover":255,"description":4998,"extension":256,"meta":5136,"navigation":104,"path":5137,"pinned":259,"publishedAt":260,"seo":5138,"slug":5139,"stem":5140,"summary":5141,"tags":5142,"updatedAt":260,"visible":104,"__hash__":5145},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4995,"toc":5126},[4996,4999,5001,5004,5006,5012,5015,5017,5028,5030,5032,5070,5072,5078,5080,5082,5094,5096,5107,5109,5117,5119,5121,5124],[10,4997,4998],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5000,16],{"id":16},[10,5002,5003],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5005,22],{"id":22},[10,5007,5008],{},[26,5009],{"alt":5010,"src":5011},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5013,5014],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5016,43],{"id":43},[45,5018,5019,5022,5025],{},[48,5020,5021],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[48,5023,5024],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[48,5026,5027],{},"推导式创建新列表，不修改输入列表。",[14,5029,66],{"id":66},[10,5031,69],{},[71,5033,5035],{"className":73,"code":5034,"language":75,"meta":76,"style":76},"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,5036,5037,5042,5046,5051,5056,5060,5065],{"__ignoreMap":76},[80,5038,5039],{"class":82,"line":83},[80,5040,5041],{},"numbers = [1, 2, 3, 4, 5]\n",[80,5043,5044],{"class":82,"line":89},[80,5045,105],{"emptyLinePlaceholder":104},[80,5047,5048],{"class":82,"line":95},[80,5049,5050],{},"squares = [number * number for number in numbers]\n",[80,5052,5053],{"class":82,"line":101},[80,5054,5055],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[80,5057,5058],{"class":82,"line":108},[80,5059,105],{"emptyLinePlaceholder":104},[80,5061,5062],{"class":82,"line":114},[80,5063,5064],{},"print(squares)\n",[80,5066,5067],{"class":82,"line":120},[80,5068,5069],{},"print(even_squares)\n",[10,5071,138],{},[71,5073,5076],{"className":5074,"code":5075,"language":144,"meta":76},[142],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5077,5075],{"__ignoreMap":76},[10,5079,149],{},[14,5081,152],{"id":152},[154,5083,5084,5087],{},[48,5085,5086],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[48,5088,5089,5090,5093],{},"第二条先用 ",[33,5091,5092],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5095,194],{"id":194},[45,5097,5098,5104],{},[48,5099,5100,5101,5103],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5102,4310],{}," 开始找输入。",[48,5105,5106],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5108,211],{"id":211},[154,5110,5111,5114],{},[48,5112,5113],{},"把字符串列表转换为长度列表。",[48,5115,5116],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5118,231],{},[14,5120,234],{"id":234},[10,5122,5123],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,5125,241],{},{"title":76,"searchDepth":89,"depth":89,"links":5127},[5128,5129,5130,5131,5132,5133,5134,5135],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4993,"description":4998},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[254,5143,5144],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5147,"title":5148,"body":5149,"category":254,"cover":255,"description":5153,"extension":256,"meta":5296,"navigation":104,"path":5297,"pinned":259,"publishedAt":260,"seo":5298,"slug":5299,"stem":5300,"summary":5301,"tags":5302,"updatedAt":260,"visible":104,"__hash__":5305},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5150,"toc":5286},[5151,5154,5156,5159,5161,5167,5170,5172,5183,5185,5187,5226,5228,5234,5236,5238,5253,5255,5263,5265,5277,5279,5281,5284],[10,5152,5153],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5155,16],{"id":16},[10,5157,5158],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5160,22],{"id":22},[10,5162,5163],{},[26,5164],{"alt":5165,"src":5166},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5168,5169],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5171,43],{"id":43},[45,5173,5174,5177,5180],{},[48,5175,5176],{},"函数名描述动作，使用小写字母和下划线。",[48,5178,5179],{},"函数定义要先执行，之后才能调用。",[48,5181,5182],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5184,66],{"id":66},[10,5186,69],{},[71,5188,5190],{"className":73,"code":5189,"language":75,"meta":76,"style":76},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5191,5192,5197,5202,5207,5211,5216,5221],{"__ignoreMap":76},[80,5193,5194],{"class":82,"line":83},[80,5195,5196],{},"def show_progress():\n",[80,5198,5199],{"class":82,"line":89},[80,5200,5201],{},"    print(\"正在学习函数\")\n",[80,5203,5204],{"class":82,"line":95},[80,5205,5206],{},"    print(\"本节完成 50%\")\n",[80,5208,5209],{"class":82,"line":101},[80,5210,105],{"emptyLinePlaceholder":104},[80,5212,5213],{"class":82,"line":108},[80,5214,5215],{},"print(\"调用前\")\n",[80,5217,5218],{"class":82,"line":114},[80,5219,5220],{},"show_progress()\n",[80,5222,5223],{"class":82,"line":120},[80,5224,5225],{},"print(\"调用后\")\n",[10,5227,138],{},[71,5229,5232],{"className":5230,"code":5231,"language":144,"meta":76},[142],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5233,5231],{"__ignoreMap":76},[10,5235,149],{},[14,5237,152],{"id":152},[154,5239,5240,5246],{},[48,5241,965,5242,5245],{},[33,5243,5244],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[48,5247,5248,5249,5252],{},"运行到 ",[33,5250,5251],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5254,194],{"id":194},[45,5256,5257,5260],{},[48,5258,5259],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[48,5261,5262],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5264,211],{"id":211},[154,5266,5267,5274],{},[48,5268,5269,5270,5273],{},"定义 ",[33,5271,5272],{},"show_plan()"," 输出两行学习计划。",[48,5275,5276],{},"连续调用同一个函数两次，观察执行顺序。",[10,5278,231],{},[14,5280,234],{"id":234},[10,5282,5283],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,5285,241],{},{"title":76,"searchDepth":89,"depth":89,"links":5287},[5288,5289,5290,5291,5292,5293,5294,5295],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5148,"description":5153},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[254,5303,5304],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5307,"title":5308,"body":5309,"category":254,"cover":255,"description":5313,"extension":256,"meta":5493,"navigation":104,"path":5494,"pinned":259,"publishedAt":260,"seo":5495,"slug":5496,"stem":5497,"summary":5498,"tags":5499,"updatedAt":260,"visible":104,"__hash__":5502},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5310,"toc":5481},[5311,5314,5316,5319,5321,5327,5334,5336,5353,5355,5357,5391,5393,5399,5401,5403,5424,5426,5429,5435,5445,5447,5462,5464,5472,5474,5476,5479],[10,5312,5313],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5315,16],{"id":16},[10,5317,5318],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5320,22],{"id":22},[10,5322,5323],{},[26,5324],{"alt":5325,"src":5326},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5328,5329,5330,5333],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5331,5332],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5335,43],{"id":43},[45,5337,5338,5341,5344],{},[48,5339,5340],{},"形参出现在函数定义中，实参出现在函数调用中。",[48,5342,5343],{},"局部变量默认只在函数内部可见。",[48,5345,5346,5347,5349,5350,205],{},"没有显式 ",[33,5348,5332],{}," 的函数会返回 ",[33,5351,5352],{},"None",[14,5354,66],{"id":66},[10,5356,69],{},[71,5358,5360],{"className":73,"code":5359,"language":75,"meta":76,"style":76},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5361,5362,5367,5372,5377,5381,5386],{"__ignoreMap":76},[80,5363,5364],{"class":82,"line":83},[80,5365,5366],{},"def calculate_total(price, count):\n",[80,5368,5369],{"class":82,"line":89},[80,5370,5371],{},"    total = price * count\n",[80,5373,5374],{"class":82,"line":95},[80,5375,5376],{},"    return total\n",[80,5378,5379],{"class":82,"line":101},[80,5380,105],{"emptyLinePlaceholder":104},[80,5382,5383],{"class":82,"line":108},[80,5384,5385],{},"result = calculate_total(25, 4)\n",[80,5387,5388],{"class":82,"line":114},[80,5389,5390],{},"print(result)\n",[10,5392,138],{},[71,5394,5397],{"className":5395,"code":5396,"language":144,"meta":76},[142],"100\n",[33,5398,5396],{"__ignoreMap":76},[10,5400,149],{},[14,5402,152],{"id":152},[154,5404,5405,5414],{},[48,5406,5407,5408,2283,5411,5413],{},"调用时 25 和 4 分别绑定到 ",[33,5409,5410],{},"price",[33,5412,4373],{},"，它们只在本次函数调用的局部范围中使用。",[48,5415,5416,5419,5420,5423],{},[33,5417,5418],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5421,5422],{},"result"," 并输出。",[177,5425,179],{"id":179},[10,5427,5428],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5430,5431],{},[26,5432],{"alt":5433,"src":5434},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5436,5437,2283,5439,226,5441,5444],{},[33,5438,5410],{},[33,5440,4373],{},[33,5442,5443],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5446,194],{"id":194},[45,5448,5449,5456],{},[48,5450,5451,5452,5455],{},"在函数内部只 ",[33,5453,5454],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[48,5457,5458,5459,5461],{},"试图在函数外直接访问局部变量 ",[33,5460,5443],{},"，它的名字只在调用期间的局部作用域存在。",[14,5463,211],{"id":211},[154,5465,5466,5469],{},[48,5467,5468],{},"编写计算长方形面积的函数。",[48,5470,5471],{},"让函数返回结果后在调用方加上单位再输出。",[10,5473,231],{},[14,5475,234],{"id":234},[10,5477,5478],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,5480,241],{},{"title":76,"searchDepth":89,"depth":89,"links":5482},[5483,5484,5485,5486,5487,5490,5491,5492],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":5488},[5489],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5308,"description":5313},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[254,5500,5501],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5504,"title":5505,"body":5506,"category":254,"cover":255,"description":5510,"extension":256,"meta":5690,"navigation":104,"path":5691,"pinned":259,"publishedAt":260,"seo":5692,"slug":5693,"stem":5694,"summary":5695,"tags":5696,"updatedAt":260,"visible":104,"__hash__":5699},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5507,"toc":5678},[5508,5511,5513,5516,5518,5524,5527,5529,5546,5548,5550,5602,5604,5610,5612,5614,5632,5634,5637,5643,5646,5648,5659,5661,5669,5671,5673,5676],[10,5509,5510],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5512,16],{"id":16},[10,5514,5515],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5517,22],{"id":22},[10,5519,5520],{},[26,5521],{"alt":5522,"src":5523},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5525,5526],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5528,43],{"id":43},[45,5530,5531,5534,5540],{},[48,5532,5533],{},"必需参数应放在有默认值的参数之前。",[48,5535,5536,5539],{},[33,5537,5538],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[48,5541,5542,5545],{},[33,5543,5544],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5547,66],{"id":66},[10,5549,69],{},[71,5551,5553],{"className":73,"code":5552,"language":75,"meta":76,"style":76},"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,5554,5555,5560,5565,5569,5574,5579,5583,5588,5593,5597],{"__ignoreMap":76},[80,5556,5557],{"class":82,"line":83},[80,5558,5559],{},"def build_title(name, level=\"基础\"):\n",[80,5561,5562],{"class":82,"line":89},[80,5563,5564],{},"    return name + \"｜\" + level\n",[80,5566,5567],{"class":82,"line":95},[80,5568,105],{"emptyLinePlaceholder":104},[80,5570,5571],{"class":82,"line":101},[80,5572,5573],{},"print(build_title(\"Python\"))\n",[80,5575,5576],{"class":82,"line":108},[80,5577,5578],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[80,5580,5581],{"class":82,"line":114},[80,5582,105],{"emptyLinePlaceholder":104},[80,5584,5585],{"class":82,"line":120},[80,5586,5587],{},"def total(*numbers):\n",[80,5589,5590],{"class":82,"line":126},[80,5591,5592],{},"    return sum(numbers)\n",[80,5594,5595],{"class":82,"line":132},[80,5596,105],{"emptyLinePlaceholder":104},[80,5598,5599],{"class":82,"line":4136},[80,5600,5601],{},"print(total(10, 20, 30))\n",[10,5603,138],{},[71,5605,5608],{"className":5606,"code":5607,"language":144,"meta":76},[142],"Python｜基础\n异常处理｜进阶\n60\n",[33,5609,5607],{"__ignoreMap":76},[10,5611,149],{},[14,5613,152],{"id":152},[154,5615,5616,5623],{},[48,5617,5618,5619,5622],{},"第一次调用只提供必需参数，",[33,5620,5621],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[48,5624,5625,5628,5629,205],{},[33,5626,5627],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5630,5631],{},"sum()",[177,5633,179],{"id":179},[10,5635,5636],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5638,5639],{},[26,5640],{"alt":5641,"src":5642},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5644,5645],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5647,194],{"id":194},[45,5649,5650,5656],{},[48,5651,5652,5653,5655],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5654,5352],{}," 再在函数内创建。",[48,5657,5658],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5660,211],{"id":211},[154,5662,5663,5666],{},[48,5664,5665],{},"给问候函数增加默认称呼。",[48,5667,5668],{},"编写接收任意数量分数并返回总分的函数。",[10,5670,231],{},[14,5672,234],{"id":234},[10,5674,5675],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,5677,241],{},{"title":76,"searchDepth":89,"depth":89,"links":5679},[5680,5681,5682,5683,5684,5687,5688,5689],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":5685},[5686],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5505,"description":5510},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[254,5697,5698],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5701,"title":5702,"body":5703,"category":254,"cover":255,"description":5707,"extension":256,"meta":5904,"navigation":104,"path":5905,"pinned":259,"publishedAt":260,"seo":5906,"slug":5907,"stem":5908,"summary":5909,"tags":5910,"updatedAt":260,"visible":104,"__hash__":5913},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5704,"toc":5892},[5705,5708,5710,5713,5715,5721,5724,5726,5743,5745,5747,5810,5812,5818,5820,5822,5849,5851,5854,5860,5863,5865,5873,5875,5883,5885,5887,5890],[10,5706,5707],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5709,16],{"id":16},[10,5711,5712],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5714,22],{"id":22},[10,5716,5717],{},[26,5718],{"alt":5719,"src":5720},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5722,5723],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5725,43],{"id":43},[45,5727,5728,5731,5734],{},[48,5729,5730],{},"函数内部赋值默认创建局部变量。",[48,5732,5733],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[48,5735,5736,2202,5739,5742],{},[33,5737,5738],{},"global",[33,5740,5741],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5744,66],{"id":66},[10,5746,69],{},[71,5748,5750],{"className":73,"code":5749,"language":75,"meta":76,"style":76},"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,5751,5752,5757,5761,5766,5771,5775,5780,5785,5790,5794,5799,5804],{"__ignoreMap":76},[80,5753,5754],{"class":82,"line":83},[80,5755,5756],{},"course = \"Python\"\n",[80,5758,5759],{"class":82,"line":89},[80,5760,105],{"emptyLinePlaceholder":104},[80,5762,5763],{"class":82,"line":95},[80,5764,5765],{},"def outer():\n",[80,5767,5768],{"class":82,"line":101},[80,5769,5770],{},"    level = \"基础\"\n",[80,5772,5773],{"class":82,"line":108},[80,5774,105],{"emptyLinePlaceholder":104},[80,5776,5777],{"class":82,"line":114},[80,5778,5779],{},"    def show():\n",[80,5781,5782],{"class":82,"line":120},[80,5783,5784],{},"        lesson = \"作用域\"\n",[80,5786,5787],{"class":82,"line":126},[80,5788,5789],{},"        print(course, level, lesson)\n",[80,5791,5792],{"class":82,"line":132},[80,5793,105],{"emptyLinePlaceholder":104},[80,5795,5796],{"class":82,"line":4136},[80,5797,5798],{},"    show()\n",[80,5800,5802],{"class":82,"line":5801},11,[80,5803,105],{"emptyLinePlaceholder":104},[80,5805,5807],{"class":82,"line":5806},12,[80,5808,5809],{},"outer()\n",[10,5811,138],{},[71,5813,5816],{"className":5814,"code":5815,"language":144,"meta":76},[142],"Python 基础 作用域\n",[33,5817,5815],{"__ignoreMap":76},[10,5819,149],{},[14,5821,152],{"id":152},[154,5823,5824,5841],{},[48,5825,5826,5829,5830,5833,5834,5836,5837,5840],{},[33,5827,5828],{},"show()"," 中查找 ",[33,5831,5832],{},"lesson"," 时先在局部找到，查找 ",[33,5835,5621],{}," 时到外层 ",[33,5838,5839],{},"outer()"," 找到。",[48,5842,5843,5845,5846,5848],{},[33,5844,4556],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5847,2234],{}," 最后在内置作用域找到。",[177,5850,179],{"id":179},[10,5852,5853],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5855,5856],{},[26,5857],{"alt":5858,"src":5859},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5861,5862],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5864,194],{"id":194},[45,5866,5867,5870],{},[48,5868,5869],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[48,5871,5872],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5874,211],{"id":211},[154,5876,5877,5880],{},[48,5878,5879],{},"在内外层定义同名变量，观察最近作用域优先。",[48,5881,5882],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5884,231],{},[14,5886,234],{"id":234},[10,5888,5889],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,5891,241],{},{"title":76,"searchDepth":89,"depth":89,"links":5893},[5894,5895,5896,5897,5898,5901,5902,5903],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":5899},[5900],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5702,"description":5707},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[254,5911,5912],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5915,"title":5916,"body":5917,"category":254,"cover":255,"description":5921,"extension":256,"meta":6071,"navigation":104,"path":6072,"pinned":259,"publishedAt":260,"seo":6073,"slug":6074,"stem":6075,"summary":6076,"tags":6077,"updatedAt":260,"visible":104,"__hash__":6080},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5918,"toc":6061},[5919,5922,5924,5927,5929,5935,5938,5940,5959,5961,5963,5997,5999,6005,6007,6009,6024,6026,6038,6040,6052,6054,6056,6059],[10,5920,5921],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5923,16],{"id":16},[10,5925,5926],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5928,22],{"id":22},[10,5930,5931],{},[26,5932],{"alt":5933,"src":5934},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5936,5937],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5939,43],{"id":43},[45,5941,5942,5945,5948],{},[48,5943,5944],{},"文档字符串紧跟在函数定义后的第一条语句。",[48,5946,5947],{},"注解表达接口意图，不代替输入校验和测试。",[48,5949,5950,5951,2283,5953,2283,5955,5958],{},"基础注解优先使用 ",[33,5952,2286],{},[33,5954,2451],{},[33,5956,5957],{},"list[str]"," 等直接写法。",[14,5960,66],{"id":66},[10,5962,69],{},[71,5964,5966],{"className":73,"code":5965,"language":75,"meta":76,"style":76},"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,5967,5968,5973,5978,5983,5987,5992],{"__ignoreMap":76},[80,5969,5970],{"class":82,"line":83},[80,5971,5972],{},"def format_score(name: str, score: int) -> str:\n",[80,5974,5975],{"class":82,"line":89},[80,5976,5977],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[80,5979,5980],{"class":82,"line":95},[80,5981,5982],{},"    return name + \"：\" + str(score)\n",[80,5984,5985],{"class":82,"line":101},[80,5986,105],{"emptyLinePlaceholder":104},[80,5988,5989],{"class":82,"line":108},[80,5990,5991],{},"print(format_score(\"小郑\", 95))\n",[80,5993,5994],{"class":82,"line":114},[80,5995,5996],{},"print(format_score.__doc__)\n",[10,5998,138],{},[71,6000,6003],{"className":6001,"code":6002,"language":144,"meta":76},[142],"小郑：95\n返回带姓名的分数文本。\n",[33,6004,6002],{"__ignoreMap":76},[10,6006,149],{},[14,6008,152],{"id":152},[154,6010,6011,6021],{},[48,6012,6013,6014,6017,6018,6020],{},"函数签名说明 ",[33,6015,6016],{},"name"," 预期为字符串、",[33,6019,2272],{}," 预期为整数，返回值预期为字符串。",[48,6022,6023],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6025,194],{"id":194},[45,6027,6028,6035],{},[48,6029,6030,6031,6034],{},"认为加了 ",[33,6032,6033],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[48,6036,6037],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6039,211],{"id":211},[154,6041,6042,6045],{},[48,6043,6044],{},"为面积函数补充参数和返回值注解。",[48,6046,6047,6048,6051],{},"通过 ",[33,6049,6050],{},"函数名.__doc__"," 查看文档字符串。",[10,6053,231],{},[14,6055,234],{"id":234},[10,6057,6058],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,6060,241],{},{"title":76,"searchDepth":89,"depth":89,"links":6062},[6063,6064,6065,6066,6067,6068,6069,6070],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5916,"description":5921},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[254,6078,6079],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6082,"title":6083,"body":6084,"category":254,"cover":255,"description":6088,"extension":256,"meta":6315,"navigation":104,"path":6316,"pinned":259,"publishedAt":260,"seo":6317,"slug":6318,"stem":6319,"summary":6320,"tags":6321,"updatedAt":260,"visible":104,"__hash__":6324},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6085,"toc":6303},[6086,6089,6091,6097,6099,6105,6116,6118,6136,6138,6145,6174,6181,6200,6209,6211,6217,6219,6221,6244,6246,6249,6255,6261,6263,6279,6281,6294,6296,6298,6301],[10,6087,6088],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6090,16],{"id":16},[10,6092,6093,6094,6096],{},"本篇只处理“模块、import 与 ",[323,6095,6016],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6098,22],{"id":22},[10,6100,6101],{},[26,6102],{"alt":6103,"src":6104},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6106,6107,6108,6111,6112,6115],{},"同一个文件直接运行时 ",[33,6109,6110],{},"__name__"," 等于 ",[33,6113,6114],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6117,43],{"id":43},[45,6119,6120,6126,6129],{},[48,6121,6122,6123,6125],{},"一个 ",[33,6124,1197],{}," 文件就是一个模块。",[48,6127,6128],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[48,6130,6131,6132,6135],{},"避免使用 ",[33,6133,6134],{},"from module import *","，它会让名字来源不清楚。",[14,6137,66],{"id":66},[10,6139,6140,6141,6144],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6142,6143],{},"calculator.py","：",[71,6146,6148],{"className":73,"code":6147,"language":75,"meta":76,"style":76},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6149,6150,6155,6160,6164,6169],{"__ignoreMap":76},[80,6151,6152],{"class":82,"line":83},[80,6153,6154],{},"def add(left, right):\n",[80,6156,6157],{"class":82,"line":89},[80,6158,6159],{},"    return left + right\n",[80,6161,6162],{"class":82,"line":95},[80,6163,105],{"emptyLinePlaceholder":104},[80,6165,6166],{"class":82,"line":101},[80,6167,6168],{},"if __name__ == \"__main__\":\n",[80,6170,6171],{"class":82,"line":108},[80,6172,6173],{},"    print(add(2, 3))\n",[10,6175,6176,6177,6180],{},"再创建 ",[33,6178,6179],{},"app.py","，从模块中导入函数：",[71,6182,6184],{"className":73,"code":6183,"language":75,"meta":76,"style":76},"from calculator import add\n\nprint(add(10, 20))\n",[33,6185,6186,6191,6195],{"__ignoreMap":76},[80,6187,6188],{"class":82,"line":83},[80,6189,6190],{},"from calculator import add\n",[80,6192,6193],{"class":82,"line":89},[80,6194,105],{"emptyLinePlaceholder":104},[80,6196,6197],{"class":82,"line":95},[80,6198,6199],{},"print(add(10, 20))\n",[10,6201,6202,6203,226,6206,205],{},"分别执行 ",[33,6204,6205],{},"python3 calculator.py",[33,6207,6208],{},"python3 app.py",[10,6210,138],{},[71,6212,6215],{"className":6213,"code":6214,"language":144,"meta":76},[142],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6216,6214],{"__ignoreMap":76},[10,6218,149],{},[14,6220,152],{"id":152},[154,6222,6223,6233],{},[48,6224,6225,6226,6228,6229,6232],{},"直接运行 ",[33,6227,6143],{}," 时，模块名是 ",[33,6230,6231],{},"__main__","，入口代码输出 5。",[48,6234,6235,6237,6238,6240,6241,6243],{},[33,6236,6179],{}," 导入模块时，",[33,6239,6143],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6242,6179],{}," 调用函数输出 30。",[177,6245,179],{"id":179},[10,6247,6248],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6250,6251],{},[26,6252],{"alt":6253,"src":6254},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6256,6257,6258,6260],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6259,6231],{}," 保护下的演示代码。",[14,6262,194],{"id":194},[45,6264,6265,6272],{},[48,6266,6267,6268,226,6270,205],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6269,6143],{},[33,6271,6179],{},[48,6273,6274,6275,6278],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6276,6277],{},"json.py","，导致导入目标被遮蔽。",[14,6280,211],{"id":211},[154,6282,6283,6289],{},[48,6284,2379,6285,6288],{},[33,6286,6287],{},"text_tools.py"," 并导出一个格式化函数。",[48,6290,6291,6292,205],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6293,6110],{},[10,6295,231],{},[14,6297,234],{"id":234},[10,6299,6300],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,6302,241],{},{"title":76,"searchDepth":89,"depth":89,"links":6304},[6305,6306,6307,6308,6309,6312,6313,6314],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":6310},[6311],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6083,"description":6088},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[254,6322,6323],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6326,"title":6327,"body":6328,"category":254,"cover":255,"description":6332,"extension":256,"meta":6497,"navigation":104,"path":6498,"pinned":259,"publishedAt":260,"seo":6499,"slug":6500,"stem":6501,"summary":6502,"tags":6503,"updatedAt":260,"visible":104,"__hash__":6505},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6329,"toc":6487},[6330,6333,6335,6338,6340,6346,6349,6351,6365,6367,6369,6415,6417,6423,6425,6427,6453,6455,6465,6467,6478,6480,6482,6485],[10,6331,6332],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6334,16],{"id":16},[10,6336,6337],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6339,22],{"id":22},[10,6341,6342],{},[26,6343],{"alt":6344,"src":6345},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6347,6348],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6350,43],{"id":43},[45,6352,6353,6359,6362],{},[48,6354,6355,6358],{},[33,6356,6357],{},".venv"," 是常见目录名，不应提交到 Git。",[48,6360,6361],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[48,6363,6364],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6366,66],{"id":66},[10,6368,1600],{},[71,6370,6372],{"className":618,"code":6371,"language":620,"meta":76,"style":76},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6373,6374,6386,6394,6400,6410],{"__ignoreMap":76},[80,6375,6376,6378,6380,6383],{"class":82,"line":83},[80,6377,718],{"class":627},[80,6379,660],{"class":630},[80,6381,6382],{"class":663}," venv",[80,6384,6385],{"class":663}," .venv\n",[80,6387,6388,6391],{"class":82,"line":89},[80,6389,6390],{"class":630},"source",[80,6392,6393],{"class":663}," .venv\u002Fbin\u002Factivate\n",[80,6395,6396,6398],{"class":82,"line":95},[80,6397,75],{"class":627},[80,6399,631],{"class":630},[80,6401,6402,6404,6406,6408],{"class":82,"line":101},[80,6403,75],{"class":627},[80,6405,660],{"class":630},[80,6407,664],{"class":663},[80,6409,631],{"class":630},[80,6411,6412],{"class":82,"line":108},[80,6413,6414],{"class":627},"deactivate\n",[10,6416,138],{},[71,6418,6421],{"className":6419,"code":6420,"language":144,"meta":76},[142],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6422,6420],{"__ignoreMap":76},[10,6424,149],{},[14,6426,152],{"id":152},[154,6428,6429,6438],{},[48,6430,6431,6434,6435,6437],{},[33,6432,6433],{},"venv"," 根据当前 ",[33,6436,718],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[48,6439,6440,6441,2202,6443,6446,6447,3751,6449,6452],{},"激活后 ",[33,6442,75],{},[33,6444,6445],{},"python -m pip"," 优先指向 ",[33,6448,6357],{},[33,6450,6451],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6454,194],{"id":194},[45,6456,6457,6460],{},[48,6458,6459],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[48,6461,3490,6462,6464],{},[33,6463,6357],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6466,211],{"id":211},[154,6468,6469,6475],{},[48,6470,6471,6472,205],{},"创建虚拟环境并记录激活前后的 ",[33,6473,6474],{},"which python",[48,6476,6477],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6479,231],{},[14,6481,234],{"id":234},[10,6483,6484],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,6486,1684],{},{"title":76,"searchDepth":89,"depth":89,"links":6488},[6489,6490,6491,6492,6493,6494,6495,6496],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6327,"description":6332},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[254,6504,289],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6507,"title":6508,"body":6509,"category":254,"cover":255,"description":6513,"extension":256,"meta":6701,"navigation":104,"path":6702,"pinned":259,"publishedAt":260,"seo":6703,"slug":6704,"stem":6705,"summary":6706,"tags":6707,"updatedAt":260,"visible":104,"__hash__":6710},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6510,"toc":6691},[6511,6514,6516,6519,6521,6527,6536,6538,6562,6564,6566,6619,6621,6627,6629,6631,6647,6649,6668,6670,6682,6684,6686,6689],[10,6512,6513],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6515,16],{"id":16},[10,6517,6518],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6520,22],{"id":22},[10,6522,6523],{},[26,6524],{"alt":6525,"src":6526},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6528,6529,6532,6533,6535],{},[33,6530,6531],{},"Path"," 使用 ",[33,6534,2461],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6537,43],{"id":43},[45,6539,6540,6543,6555],{},[48,6541,6542],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[48,6544,6545,2283,6548,2283,6551,6554],{},[33,6546,6547],{},"exists()",[33,6549,6550],{},"is_file()",[33,6552,6553],{},"is_dir()"," 检查真实文件系统状态。",[48,6556,6557,6558,6561],{},"创建目录前明确目标；",[33,6559,6560],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6563,66],{"id":66},[10,6565,69],{},[71,6567,6569],{"className":73,"code":6568,"language":75,"meta":76,"style":76},"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,6570,6571,6576,6580,6585,6590,6595,6599,6604,6609,6614],{"__ignoreMap":76},[80,6572,6573],{"class":82,"line":83},[80,6574,6575],{},"from pathlib import Path\n",[80,6577,6578],{"class":82,"line":89},[80,6579,105],{"emptyLinePlaceholder":104},[80,6581,6582],{"class":82,"line":95},[80,6583,6584],{},"project = Path.cwd()\n",[80,6586,6587],{"class":82,"line":101},[80,6588,6589],{},"data_dir = project \u002F \"data\"\n",[80,6591,6592],{"class":82,"line":108},[80,6593,6594],{},"file_path = data_dir \u002F \"records.json\"\n",[80,6596,6597],{"class":82,"line":114},[80,6598,105],{"emptyLinePlaceholder":104},[80,6600,6601],{"class":82,"line":120},[80,6602,6603],{},"print(project)\n",[80,6605,6606],{"class":82,"line":126},[80,6607,6608],{},"print(file_path.name)\n",[80,6610,6611],{"class":82,"line":132},[80,6612,6613],{},"print(file_path.suffix)\n",[80,6615,6616],{"class":82,"line":4136},[80,6617,6618],{},"print(file_path.exists())\n",[10,6620,138],{},[71,6622,6625],{"className":6623,"code":6624,"language":144,"meta":76},[142],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6626,6624],{"__ignoreMap":76},[10,6628,149],{},[14,6630,152],{"id":152},[154,6632,6633,6639],{},[48,6634,6635,6638],{},[33,6636,6637],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[48,6640,219,6641,6643,6644,6646],{},[33,6642,2461],{}," 组合路径片段只创建新的 ",[33,6645,6531],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6648,194],{"id":194},[45,6650,6651,6659],{},[48,6652,3490,6653,6655,6656,6658],{},[33,6654,6531],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6657,6547],{}," 等方法确认。",[48,6660,6661,6662,1036,6664,6667],{},"手工拼接 ",[33,6663,2461],{},[33,6665,6666],{},"\\"," 分隔符，降低跨平台可读性。",[14,6669,211],{"id":211},[154,6671,6672,6679],{},[48,6673,6674,6675,6678],{},"组合 ",[33,6676,6677],{},"output\u002Freport.txt"," 路径但先不创建文件。",[48,6680,6681],{},"输出路径的父目录、文件名和扩展名。",[10,6683,231],{},[14,6685,234],{"id":234},[10,6687,6688],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,6690,241],{},{"title":76,"searchDepth":89,"depth":89,"links":6692},[6693,6694,6695,6696,6697,6698,6699,6700],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6508,"description":6513},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[254,6708,6709],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6712,"title":6713,"body":6714,"category":254,"cover":255,"description":6718,"extension":256,"meta":6896,"navigation":104,"path":6897,"pinned":259,"publishedAt":260,"seo":6898,"slug":6899,"stem":6900,"summary":6901,"tags":6902,"updatedAt":260,"visible":104,"__hash__":6905},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6715,"toc":6886},[6716,6719,6721,6724,6726,6732,6735,6737,6765,6767,6769,6826,6828,6834,6836,6838,6849,6851,6864,6866,6877,6879,6881,6884],[10,6717,6718],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6720,16],{"id":16},[10,6722,6723],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6725,22],{"id":22},[10,6727,6728],{},[26,6729],{"alt":6730,"src":6731},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6733,6734],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6736,43],{"id":43},[45,6738,6739,6745,6754],{},[48,6740,6741,6744],{},[33,6742,6743],{},"w"," 模式会截断原文件，写入前必须确认目标。",[48,6746,6747,6750,6751,205],{},[33,6748,6749],{},"r"," 模式读取不存在文件会产生 ",[33,6752,6753],{},"FileNotFoundError",[48,6755,6756,6757,6760,6761,6764],{},"本篇显式调用 ",[33,6758,6759],{},"close()","；第 34 篇会用 ",[33,6762,6763],{},"with"," 更可靠地管理关闭动作。",[14,6766,66],{"id":66},[10,6768,69],{},[71,6770,6772],{"className":73,"code":6771,"language":75,"meta":76,"style":76},"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,6773,6774,6778,6782,6787,6792,6797,6802,6806,6811,6816,6821],{"__ignoreMap":76},[80,6775,6776],{"class":82,"line":83},[80,6777,6575],{},[80,6779,6780],{"class":82,"line":89},[80,6781,105],{"emptyLinePlaceholder":104},[80,6783,6784],{"class":82,"line":95},[80,6785,6786],{},"file_path = Path(\"notes.txt\")\n",[80,6788,6789],{"class":82,"line":101},[80,6790,6791],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[80,6793,6794],{"class":82,"line":108},[80,6795,6796],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[80,6798,6799],{"class":82,"line":114},[80,6800,6801],{},"writer.close()\n",[80,6803,6804],{"class":82,"line":120},[80,6805,105],{"emptyLinePlaceholder":104},[80,6807,6808],{"class":82,"line":126},[80,6809,6810],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[80,6812,6813],{"class":82,"line":132},[80,6814,6815],{},"content = reader.read()\n",[80,6817,6818],{"class":82,"line":4136},[80,6819,6820],{},"reader.close()\n",[80,6822,6823],{"class":82,"line":5801},[80,6824,6825],{},"print(content)\n",[10,6827,138],{},[71,6829,6832],{"className":6830,"code":6831,"language":144,"meta":76},[142],"变量\n循环\n函数\n",[33,6833,6831],{"__ignoreMap":76},[10,6835,149],{},[14,6837,152],{"id":152},[154,6839,6840,6846],{},[48,6841,6842,6843,6845],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6844,6759],{}," 确保缓冲内容交给文件系统。",[48,6847,6848],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6850,194],{"id":194},[45,6852,6853,6858],{},[48,6854,219,6855,6857],{},[33,6856,6743],{}," 模式打开重要文件却未确认覆盖风险。",[48,6859,6860,6861,205],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6862,6863],{},"encoding=\"utf-8\"",[14,6865,211],{"id":211},[154,6867,6868,6871],{},[48,6869,6870],{},"写入三行学习记录并读取。",[48,6872,6873,6874,6876],{},"改用 ",[33,6875,364],{}," 模式追加一行，确认原内容仍保留。",[10,6878,231],{},[14,6880,234],{"id":234},[10,6882,6883],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,6885,241],{},{"title":76,"searchDepth":89,"depth":89,"links":6887},[6888,6889,6890,6891,6892,6893,6894,6895],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6713,"description":6718},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[254,6903,6904],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6907,"title":6908,"body":6909,"category":254,"cover":255,"description":6913,"extension":256,"meta":7080,"navigation":104,"path":7081,"pinned":259,"publishedAt":260,"seo":7082,"slug":7083,"stem":7084,"summary":7085,"tags":7086,"updatedAt":260,"visible":104,"__hash__":7089},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6910,"toc":7070},[6911,6914,6916,6919,6921,6927,6937,6939,6953,6955,6957,7017,7019,7025,7027,7029,7041,7043,7051,7053,7061,7063,7065,7068],[10,6912,6913],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6915,16],{"id":16},[10,6917,6918],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6920,22],{"id":22},[10,6922,6923],{},[26,6924],{"alt":6925,"src":6926},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6928,6929,6932,6933,6936],{},[33,6930,6931],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6934,6935],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6938,43],{"id":43},[45,6940,6941,6944,6950],{},[48,6942,6943],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[48,6945,6946,6949],{},[33,6947,6948],{},"ensure_ascii=False"," 让中文以可读字符写入。",[48,6951,6952],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6954,66],{"id":66},[10,6956,69],{},[71,6958,6960],{"className":73,"code":6959,"language":75,"meta":76,"style":76},"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,6961,6962,6967,6971,6976,6980,6985,6990,6994,6998,7003,7008,7012],{"__ignoreMap":76},[80,6963,6964],{"class":82,"line":83},[80,6965,6966],{},"import json\n",[80,6968,6969],{"class":82,"line":89},[80,6970,105],{"emptyLinePlaceholder":104},[80,6972,6973],{"class":82,"line":95},[80,6974,6975],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[80,6977,6978],{"class":82,"line":101},[80,6979,105],{"emptyLinePlaceholder":104},[80,6981,6982],{"class":82,"line":108},[80,6983,6984],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[80,6986,6987],{"class":82,"line":114},[80,6988,6989],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[80,6991,6992],{"class":82,"line":120},[80,6993,6801],{},[80,6995,6996],{"class":82,"line":126},[80,6997,105],{"emptyLinePlaceholder":104},[80,6999,7000],{"class":82,"line":132},[80,7001,7002],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[80,7004,7005],{"class":82,"line":4136},[80,7006,7007],{},"loaded = json.load(reader)\n",[80,7009,7010],{"class":82,"line":5801},[80,7011,6820],{},[80,7013,7014],{"class":82,"line":5806},[80,7015,7016],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7018,138],{},[71,7020,7023],{"className":7021,"code":7022,"language":144,"meta":76},[142],"Python 60\n",[33,7024,7022],{"__ignoreMap":76},[10,7026,149],{},[14,7028,152],{"id":152},[154,7030,7031,7036],{},[48,7032,7033,7035],{},[33,7034,6931],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[48,7037,7038,7040],{},[33,7039,6935],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7042,194],{"id":194},[45,7044,7045,7048],{},[48,7046,7047],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[48,7049,7050],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7052,211],{"id":211},[154,7054,7055,7058],{},[48,7056,7057],{},"保存包含两条学习记录的列表。",[48,7059,7060],{},"读取后修改进度，再重新写回文件。",[10,7062,231],{},[14,7064,234],{"id":234},[10,7066,7067],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,7069,241],{},{"title":76,"searchDepth":89,"depth":89,"links":7071},[7072,7073,7074,7075,7076,7077,7078,7079],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6908,"description":6913},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[254,7087,7088],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7091,"title":7092,"body":7093,"category":254,"cover":255,"description":7097,"extension":256,"meta":7281,"navigation":104,"path":7282,"pinned":259,"publishedAt":260,"seo":7283,"slug":7284,"stem":7285,"summary":7286,"tags":7287,"updatedAt":260,"visible":104,"__hash__":7290},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7094,"toc":7271},[7095,7098,7100,7103,7105,7111,7117,7119,7141,7143,7145,7208,7210,7216,7218,7220,7236,7238,7252,7254,7262,7264,7266,7269],[10,7096,7097],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7099,16],{"id":16},[10,7101,7102],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7104,22],{"id":22},[10,7106,7107],{},[26,7108],{"alt":7109,"src":7110},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7112,7113,7116],{},[33,7114,7115],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7118,43],{"id":43},[45,7120,7121,7131,7138],{},[48,7122,219,7123,7126,7127,7130],{},[33,7124,7125],{},"newline=\"\""," 让 ",[33,7128,7129],{},"csv"," 模块正确处理换行。",[48,7132,7133,7134,7137],{},"字段顺序由 ",[33,7135,7136],{},"fieldnames"," 决定，字典键需要与字段名一致。",[48,7139,7140],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7142,66],{"id":66},[10,7144,69],{},[71,7146,7148],{"className":73,"code":7147,"language":75,"meta":76,"style":76},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[33,7149,7150,7155,7159,7164,7169,7174,7179,7184,7188,7193,7198,7203],{"__ignoreMap":76},[80,7151,7152],{"class":82,"line":83},[80,7153,7154],{},"import csv\n",[80,7156,7157],{"class":82,"line":89},[80,7158,105],{"emptyLinePlaceholder":104},[80,7160,7161],{"class":82,"line":95},[80,7162,7163],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[80,7165,7166],{"class":82,"line":101},[80,7167,7168],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[80,7170,7171],{"class":82,"line":108},[80,7172,7173],{},"writer.writeheader()\n",[80,7175,7176],{"class":82,"line":114},[80,7177,7178],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[80,7180,7181],{"class":82,"line":120},[80,7182,7183],{},"writer_file.close()\n",[80,7185,7186],{"class":82,"line":126},[80,7187,105],{"emptyLinePlaceholder":104},[80,7189,7190],{"class":82,"line":132},[80,7191,7192],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[80,7194,7195],{"class":82,"line":4136},[80,7196,7197],{},"for row in csv.DictReader(reader_file):\n",[80,7199,7200],{"class":82,"line":5801},[80,7201,7202],{},"    print(row[\"name\"], row[\"score\"])\n",[80,7204,7205],{"class":82,"line":5806},[80,7206,7207],{},"reader_file.close()\n",[10,7209,138],{},[71,7211,7214],{"className":7212,"code":7213,"language":144,"meta":76},[142],"小郑 95\n",[33,7215,7213],{"__ignoreMap":76},[10,7217,149],{},[14,7219,152],{"id":152},[154,7221,7222,7231],{},[48,7223,7224,7227,7228,7230],{},[33,7225,7226],{},"DictWriter"," 按 ",[33,7229,7136],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[48,7232,7233,7235],{},[33,7234,7115],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7237,194],{"id":194},[45,7239,7240,7243],{},[48,7241,7242],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[48,7244,7245,7246,7248,7249,7251],{},"在 macOS 以外环境忽略 ",[33,7247,7125],{}," 可能出现额外空行；统一交给 ",[33,7250,7129],{}," 模块管理换行。",[14,7253,211],{"id":211},[154,7255,7256,7259],{},[48,7257,7258],{},"写入三名学习者的课程和分数。",[48,7260,7261],{},"读取 CSV 后把分数字符串转换为整数。",[10,7263,231],{},[14,7265,234],{"id":234},[10,7267,7268],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,7270,241],{},{"title":76,"searchDepth":89,"depth":89,"links":7272},[7273,7274,7275,7276,7277,7278,7279,7280],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7092,"description":7097},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[254,7288,7289],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7292,"title":7293,"body":7294,"category":254,"cover":255,"description":7298,"extension":256,"meta":7571,"navigation":104,"path":7572,"pinned":259,"publishedAt":260,"seo":7573,"slug":7574,"stem":7575,"summary":7576,"tags":7577,"updatedAt":260,"visible":104,"__hash__":7580},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7295,"toc":7558},[7296,7299,7301,7304,7306,7312,7323,7325,7342,7344,7346,7421,7423,7429,7431,7433,7458,7460,7469,7475,7486,7488,7494,7500,7509,7511,7526,7528,7549,7551,7553,7556],[10,7297,7298],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7300,16],{"id":16},[10,7302,7303],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7305,22],{"id":22},[10,7307,7308],{},[26,7309],{"alt":7310,"src":7311},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7313,7314,7315,7318,7319,7322],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7316,7317],{},"except","；无论是否异常，",[33,7320,7321],{},"finally"," 都会在离开结构前执行。",[14,7324,43],{"id":43},[45,7326,7327,7333,7339],{},[48,7328,7329,7330,7332],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7331,7317],{}," 吞掉全部错误。",[48,7334,7335,7338],{},[33,7336,7337],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[48,7340,7341],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7343,66],{"id":66},[10,7345,69],{},[71,7347,7349],{"className":73,"code":7348,"language":75,"meta":76,"style":76},"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,7350,7351,7356,7361,7366,7371,7376,7380,7385,7390,7395,7400,7404,7409,7415],{"__ignoreMap":76},[80,7352,7353],{"class":82,"line":83},[80,7354,7355],{},"def parse_age(text):\n",[80,7357,7358],{"class":82,"line":89},[80,7359,7360],{},"    age = int(text)\n",[80,7362,7363],{"class":82,"line":95},[80,7364,7365],{},"    if age \u003C 0:\n",[80,7367,7368],{"class":82,"line":101},[80,7369,7370],{},"        raise ValueError(\"年龄不能为负数\")\n",[80,7372,7373],{"class":82,"line":108},[80,7374,7375],{},"    return age\n",[80,7377,7378],{"class":82,"line":114},[80,7379,105],{"emptyLinePlaceholder":104},[80,7381,7382],{"class":82,"line":120},[80,7383,7384],{},"try:\n",[80,7386,7387],{"class":82,"line":126},[80,7388,7389],{},"    age = parse_age(\"18\")\n",[80,7391,7392],{"class":82,"line":132},[80,7393,7394],{},"except ValueError as error:\n",[80,7396,7397],{"class":82,"line":4136},[80,7398,7399],{},"    print(\"输入错误：\", error)\n",[80,7401,7402],{"class":82,"line":5801},[80,7403,1173],{},[80,7405,7406],{"class":82,"line":5806},[80,7407,7408],{},"    print(\"年龄：\", age)\n",[80,7410,7412],{"class":82,"line":7411},13,[80,7413,7414],{},"finally:\n",[80,7416,7418],{"class":82,"line":7417},14,[80,7419,7420],{},"    print(\"处理结束\")\n",[10,7422,138],{},[71,7424,7427],{"className":7425,"code":7426,"language":144,"meta":76},[142],"年龄： 18\n处理结束\n",[33,7428,7426],{"__ignoreMap":76},[10,7430,149],{},[14,7432,152],{"id":152},[154,7434,7435,7447],{},[48,7436,7437,7439,7440,7442,7443,7446],{},[33,7438,3059],{}," 或主动 ",[33,7441,7337],{}," 都可能产生 ",[33,7444,7445],{},"ValueError","，控制流立即离开当前正常路径。",[48,7448,7449,7450,7452,7453,7455,7456,205],{},"有异常时进入匹配的 ",[33,7451,7317],{},"；没有异常时执行 ",[33,7454,1186],{},"；两种情况最后都会执行 ",[33,7457,7321],{},[177,7459,179],{"id":179},[10,7461,7462,2283,7464,226,7466,7468],{},[33,7463,7317],{},[33,7465,1186],{},[33,7467,7321],{}," 的职责不同，不能只看它们出现的顺序。",[10,7470,7471],{},[26,7472],{"alt":7473,"src":7474},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7476,7477,7479,7480,7482,7483,7485],{},[33,7478,7317],{}," 处理匹配异常，",[33,7481,1186],{}," 只在无异常时运行，",[33,7484,7321],{}," 负责两条路径都需要的清理动作。",[177,7487,179],{"id":4191},[10,7489,7490,7493],{},[33,7491,7492],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7495,7496],{},[26,7497],{"alt":7498,"src":7499},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7501,7502,7503,7505,7506,7508],{},"只把可能产生预期异常的操作放进 ",[33,7504,7492],{},"，后续正常业务放进 ",[33,7507,1186],{},"，错误边界会更清楚。",[14,7510,194],{"id":194},[45,7512,7513,7520],{},[48,7514,7515,7516,7519],{},"使用裸 ",[33,7517,7518],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[48,7521,7522,7523,7525],{},"把整个程序包在一个巨大 ",[33,7524,7492],{}," 中，无法判断究竟哪一步允许失败。",[14,7527,211],{"id":211},[154,7529,7530,7543],{},[48,7531,7532,7533,7536,7537,226,7540,205],{},"让 ",[33,7534,7535],{},"parse_age"," 分别处理 ",[33,7538,7539],{},"\"abc\"",[33,7541,7542],{},"\"-1\"",[48,7544,7545,7546,7548],{},"为文件读取捕获 ",[33,7547,6753],{}," 并给出清晰提示。",[10,7550,231],{},[14,7552,234],{"id":234},[10,7554,7555],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,7557,241],{},{"title":76,"searchDepth":89,"depth":89,"links":7559},[7560,7561,7562,7563,7564,7568,7569,7570],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":7565},[7566,7567],{"id":179,"depth":95,"text":179},{"id":4191,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7293,"description":7298},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[254,7578,7579],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7582,"title":7583,"body":7584,"category":254,"cover":255,"description":7588,"extension":256,"meta":7764,"navigation":104,"path":7765,"pinned":259,"publishedAt":260,"seo":7766,"slug":7767,"stem":7768,"summary":7769,"tags":7770,"updatedAt":260,"visible":104,"__hash__":7772},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7585,"toc":7754},[7586,7589,7591,7594,7596,7602,7608,7610,7626,7628,7630,7684,7686,7692,7694,7696,7709,7711,7724,7726,7745,7747,7749,7752],[10,7587,7588],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7590,16],{"id":16},[10,7592,7593],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7595,22],{"id":22},[10,7597,7598],{},[26,7599],{"alt":7600,"src":7601},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7603,7604,7605,7607],{},"进入 ",[33,7606,6763],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7609,43],{"id":43},[45,7611,7612,7617,7623],{},[48,7613,7614,7616],{},[33,7615,6763],{}," 把资源获取和释放配成一个清晰边界。",[48,7618,7619,7622],{},[33,7620,7621],{},"as file"," 得到的是上下文返回的资源对象。",[48,7624,7625],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7627,66],{"id":66},[10,7629,69],{},[71,7631,7633],{"className":73,"code":7632,"language":75,"meta":76,"style":76},"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,7634,7635,7639,7643,7647,7651,7656,7661,7665,7670,7675,7679],{"__ignoreMap":76},[80,7636,7637],{"class":82,"line":83},[80,7638,6575],{},[80,7640,7641],{"class":82,"line":89},[80,7642,105],{"emptyLinePlaceholder":104},[80,7644,7645],{"class":82,"line":95},[80,7646,6786],{},[80,7648,7649],{"class":82,"line":101},[80,7650,105],{"emptyLinePlaceholder":104},[80,7652,7653],{"class":82,"line":108},[80,7654,7655],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[80,7657,7658],{"class":82,"line":114},[80,7659,7660],{},"    file.write(\"上下文管理器\\n\")\n",[80,7662,7663],{"class":82,"line":120},[80,7664,105],{"emptyLinePlaceholder":104},[80,7666,7667],{"class":82,"line":126},[80,7668,7669],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[80,7671,7672],{"class":82,"line":132},[80,7673,7674],{},"    print(file.read())\n",[80,7676,7677],{"class":82,"line":4136},[80,7678,105],{"emptyLinePlaceholder":104},[80,7680,7681],{"class":82,"line":5801},[80,7682,7683],{},"print(file.closed)\n",[10,7685,138],{},[71,7687,7690],{"className":7688,"code":7689,"language":144,"meta":76},[142],"上下文管理器\n\nTrue\n",[33,7691,7689],{"__ignoreMap":76},[10,7693,149],{},[14,7695,152],{"id":152},[154,7697,7698,7706],{},[48,7699,7604,7700,7702,7703,205],{},[33,7701,6763],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7704,7705],{},"file",[48,7707,7708],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7710,194],{"id":194},[45,7712,7713,7718],{},[48,7714,4759,7715,7717],{},[33,7716,6763],{}," 代码块外继续读写已经关闭的文件对象。",[48,7719,7720,7721,7723],{},"误以为 ",[33,7722,6763],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7725,211],{"id":211},[154,7727,7728,7737],{},[48,7729,7730,7731,7734,7735,205],{},"把第 30 篇的手动 ",[33,7732,7733],{},"open\u002Fclose"," 改写为 ",[33,7736,6763],{},[48,7738,4759,7739,7741,7742,205],{},[33,7740,6763],{}," 块后检查 ",[33,7743,7744],{},"file.closed",[10,7746,231],{},[14,7748,234],{"id":234},[10,7750,7751],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,7753,241],{},{"title":76,"searchDepth":89,"depth":89,"links":7755},[7756,7757,7758,7759,7760,7761,7762,7763],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7583,"description":7588},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[254,6763,7771],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7774,"title":7775,"body":7776,"category":254,"cover":255,"description":7780,"extension":256,"meta":7992,"navigation":104,"path":7993,"pinned":259,"publishedAt":260,"seo":7994,"slug":7995,"stem":7996,"summary":7997,"tags":7998,"updatedAt":260,"visible":104,"__hash__":8001},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7777,"toc":7980},[7778,7781,7783,7786,7788,7794,7797,7799,7816,7818,7820,7888,7890,7896,7898,7900,7925,7927,7930,7936,7945,7947,7958,7960,7971,7973,7975,7978],[10,7779,7780],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7782,16],{"id":16},[10,7784,7785],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7787,22],{"id":22},[10,7789,7790],{},[26,7791],{"alt":7792,"src":7793},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7795,7796],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7798,43],{"id":43},[45,7800,7801,7807,7813],{},[48,7802,7803,7806],{},[33,7804,7805],{},"self"," 表示当前实例，由方法调用自动传入。",[48,7808,7809,7812],{},[33,7810,7811],{},"__init__"," 在实例创建过程中初始化属性。",[48,7814,7815],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7817,66],{"id":66},[10,7819,69],{},[71,7821,7823],{"className":73,"code":7822,"language":75,"meta":76,"style":76},"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,7824,7825,7830,7835,7840,7845,7849,7854,7859,7864,7869,7873,7878,7883],{"__ignoreMap":76},[80,7826,7827],{"class":82,"line":83},[80,7828,7829],{},"class LearningRecord:\n",[80,7831,7832],{"class":82,"line":89},[80,7833,7834],{},"    def __init__(self, course, progress=0):\n",[80,7836,7837],{"class":82,"line":95},[80,7838,7839],{},"        self.course = course\n",[80,7841,7842],{"class":82,"line":101},[80,7843,7844],{},"        self.progress = progress\n",[80,7846,7847],{"class":82,"line":108},[80,7848,105],{"emptyLinePlaceholder":104},[80,7850,7851],{"class":82,"line":114},[80,7852,7853],{},"    def advance(self, amount):\n",[80,7855,7856],{"class":82,"line":120},[80,7857,7858],{},"        self.progress = self.progress + amount\n",[80,7860,7861],{"class":82,"line":126},[80,7862,7863],{},"        if self.progress > 100:\n",[80,7865,7866],{"class":82,"line":132},[80,7867,7868],{},"            self.progress = 100\n",[80,7870,7871],{"class":82,"line":4136},[80,7872,105],{"emptyLinePlaceholder":104},[80,7874,7875],{"class":82,"line":5801},[80,7876,7877],{},"record = LearningRecord(\"Python\", 40)\n",[80,7879,7880],{"class":82,"line":5806},[80,7881,7882],{},"record.advance(15)\n",[80,7884,7885],{"class":82,"line":7411},[80,7886,7887],{},"print(record.course, record.progress)\n",[10,7889,138],{},[71,7891,7894],{"className":7892,"code":7893,"language":144,"meta":76},[142],"Python 55\n",[33,7895,7893],{"__ignoreMap":76},[10,7897,149],{},[14,7899,152],{"id":152},[154,7901,7902,7912],{},[48,7903,7904,7905,7908,7909,7911],{},"调用 ",[33,7906,7907],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7910,7811],{}," 把课程和进度保存在该实例属性中。",[48,7913,7914,7917,7918,7921,7922,7924],{},[33,7915,7916],{},"record.advance(15)"," 自动把 ",[33,7919,7920],{},"record"," 作为 ",[33,7923,7805],{},"，方法更新同一实例的进度并限制上限。",[177,7926,179],{"id":179},[10,7928,7929],{},"类是共同定义，实例则各自保存状态。",[10,7931,7932],{},[26,7933],{"alt":7934,"src":7935},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7937,7938,7939,226,7941,7944],{},"两个实例共享同一套方法定义，但 ",[33,7940,4556],{},[33,7942,7943],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7946,194],{"id":194},[45,7948,7949,7955],{},[48,7950,7951,7952,7954],{},"调用实例方法时手工再传一次 ",[33,7953,7805],{},"。通过实例调用时 Python 会自动绑定。",[48,7956,7957],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7959,211],{"id":211},[154,7961,7962,7968],{},[48,7963,5269,7964,7967],{},[33,7965,7966],{},"Book"," 类，保存标题和阅读页数。",[48,7969,7970],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7972,231],{},[14,7974,234],{"id":234},[10,7976,7977],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,7979,241],{},{"title":76,"searchDepth":89,"depth":89,"links":7981},[7982,7983,7984,7985,7986,7989,7990,7991],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":7987},[7988],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7775,"description":7780},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[254,7999,8000],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":8003,"title":8004,"body":8005,"category":254,"cover":255,"description":8009,"extension":256,"meta":8187,"navigation":104,"path":8188,"pinned":259,"publishedAt":260,"seo":8189,"slug":8190,"stem":8191,"summary":8192,"tags":8193,"updatedAt":260,"visible":104,"__hash__":8196},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":8006,"toc":8177},[8007,8010,8012,8015,8017,8023,8026,8028,8039,8041,8043,8110,8112,8118,8120,8122,8141,8143,8151,8153,8168,8170,8172,8175],[10,8008,8009],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8011,16],{"id":16},[10,8013,8014],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8016,22],{"id":22},[10,8018,8019],{},[26,8020],{"alt":8021,"src":8022},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8024,8025],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8027,43],{"id":43},[45,8029,8030,8033,8036],{},[48,8031,8032],{},"封装让对象通过方法维护自己的有效状态。",[48,8034,8035],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[48,8037,8038],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8040,66],{"id":66},[10,8042,69],{},[71,8044,8046],{"className":73,"code":8045,"language":75,"meta":76,"style":76},"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,8047,8048,8053,8058,8063,8067,8072,8077,8082,8086,8091,8096,8100,8105],{"__ignoreMap":76},[80,8049,8050],{"class":82,"line":83},[80,8051,8052],{},"class Storage:\n",[80,8054,8055],{"class":82,"line":89},[80,8056,8057],{},"    def save(self, text):\n",[80,8059,8060],{"class":82,"line":95},[80,8061,8062],{},"        print(\"保存：\", text)\n",[80,8064,8065],{"class":82,"line":101},[80,8066,105],{"emptyLinePlaceholder":104},[80,8068,8069],{"class":82,"line":108},[80,8070,8071],{},"class LearningService:\n",[80,8073,8074],{"class":82,"line":114},[80,8075,8076],{},"    def __init__(self, storage):\n",[80,8078,8079],{"class":82,"line":120},[80,8080,8081],{},"        self.storage = storage\n",[80,8083,8084],{"class":82,"line":126},[80,8085,105],{"emptyLinePlaceholder":104},[80,8087,8088],{"class":82,"line":132},[80,8089,8090],{},"    def finish_lesson(self, title):\n",[80,8092,8093],{"class":82,"line":4136},[80,8094,8095],{},"        self.storage.save(title)\n",[80,8097,8098],{"class":82,"line":5801},[80,8099,105],{"emptyLinePlaceholder":104},[80,8101,8102],{"class":82,"line":5806},[80,8103,8104],{},"service = LearningService(Storage())\n",[80,8106,8107],{"class":82,"line":7411},[80,8108,8109],{},"service.finish_lesson(\"异常处理\")\n",[10,8111,138],{},[71,8113,8116],{"className":8114,"code":8115,"language":144,"meta":76},[142],"保存： 异常处理\n",[33,8117,8115],{"__ignoreMap":76},[10,8119,149],{},[14,8121,152],{"id":152},[154,8123,8124,8134],{},[48,8125,8126,8129,8130,8133],{},[33,8127,8128],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8131,8132],{},"save()"," 的协作对象。",[48,8135,8136,8137,8140],{},"调用业务方法时，服务把保存动作委托给 ",[33,8138,8139],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8142,194],{"id":194},[45,8144,8145,8148],{},[48,8146,8147],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[48,8149,8150],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8152,211],{"id":211},[154,8154,8155,8165],{},[48,8156,8157,8158,8161,8162,205],{},"用组合让 ",[33,8159,8160],{},"OrderService"," 使用一个 ",[33,8163,8164],{},"Notifier",[48,8166,8167],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8169,231],{},[14,8171,234],{"id":234},[10,8173,8174],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,8176,241],{},{"title":76,"searchDepth":89,"depth":89,"links":8178},[8179,8180,8181,8182,8183,8184,8185,8186],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":8004,"description":8009},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[254,8194,8195],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8198,"title":8199,"body":8200,"category":254,"cover":255,"description":8204,"extension":256,"meta":8407,"navigation":104,"path":8408,"pinned":259,"publishedAt":260,"seo":8409,"slug":8410,"stem":8411,"summary":8412,"tags":8413,"updatedAt":260,"visible":104,"__hash__":8416},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8201,"toc":8395},[8202,8205,8207,8210,8212,8218,8225,8227,8252,8254,8256,8308,8310,8316,8318,8320,8341,8343,8349,8355,8361,8363,8371,8373,8386,8388,8390,8393],[10,8203,8204],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8206,16],{"id":16},[10,8208,8209],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8211,22],{"id":22},[10,8213,8214],{},[26,8215],{"alt":8216,"src":8217},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8219,8220,8221,8224],{},"生成器运行到 ",[33,8222,8223],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8226,43],{"id":43},[45,8228,8229,8239,8249],{},[48,8230,8231,8234,8235,8238],{},[33,8232,8233],{},"iter()"," 从可迭代对象取得迭代器，",[33,8236,8237],{},"next()"," 请求下一个值。",[48,8240,8241,8242,8245,8246,8248],{},"没有更多值时迭代器抛出 ",[33,8243,8244],{},"StopIteration","，",[33,8247,4310],{}," 会自动处理。",[48,8250,8251],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8253,66],{"id":66},[10,8255,69],{},[71,8257,8259],{"className":73,"code":8258,"language":75,"meta":76,"style":76},"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,8260,8261,8266,8271,8276,8281,8286,8290,8295,8300,8304],{"__ignoreMap":76},[80,8262,8263],{"class":82,"line":83},[80,8264,8265],{},"def countdown(start):\n",[80,8267,8268],{"class":82,"line":89},[80,8269,8270],{},"    current = start\n",[80,8272,8273],{"class":82,"line":95},[80,8274,8275],{},"    while current > 0:\n",[80,8277,8278],{"class":82,"line":101},[80,8279,8280],{},"        yield current\n",[80,8282,8283],{"class":82,"line":108},[80,8284,8285],{},"        current = current - 1\n",[80,8287,8288],{"class":82,"line":114},[80,8289,105],{"emptyLinePlaceholder":104},[80,8291,8292],{"class":82,"line":120},[80,8293,8294],{},"iterator = countdown(3)\n",[80,8296,8297],{"class":82,"line":126},[80,8298,8299],{},"print(next(iterator))\n",[80,8301,8302],{"class":82,"line":132},[80,8303,8299],{},[80,8305,8306],{"class":82,"line":4136},[80,8307,8299],{},[10,8309,138],{},[71,8311,8314],{"className":8312,"code":8313,"language":144,"meta":76},[142],"3\n2\n1\n",[33,8315,8313],{"__ignoreMap":76},[10,8317,149],{},[14,8319,152],{"id":152},[154,8321,8322,8328],{},[48,8323,7904,8324,8327],{},[33,8325,8326],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[48,8329,8330,8331,8333,8334,8336,8337,8340],{},"每次 ",[33,8332,8237],{}," 运行到下一个 ",[33,8335,8223],{}," 并暂停，局部变量 ",[33,8338,8339],{},"current"," 和执行位置被保留。",[177,8342,179],{"id":179},[10,8344,8345,8346,8348],{},"生成器的暂停位置可以展开成多次 ",[33,8347,8237],{}," 的时间线。",[10,8350,8351],{},[26,8352],{"alt":8353,"src":8354},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8356,8357,8358,8360],{},"每次请求只推进到下一个 ",[33,8359,8223],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8362,194],{"id":194},[45,8364,8365,8368],{},[48,8366,8367],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[48,8369,8370],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8372,211],{"id":211},[154,8374,8375,8378],{},[48,8376,8377],{},"编写产生 1 到指定上限偶数的生成器。",[48,8379,199,8380,8382,8383,8385],{},[33,8381,4310],{}," 遍历生成器，比较手动 ",[33,8384,8237],{}," 的差异。",[10,8387,231],{},[14,8389,234],{"id":234},[10,8391,8392],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,8394,241],{},{"title":76,"searchDepth":89,"depth":89,"links":8396},[8397,8398,8399,8400,8401,8404,8405,8406],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":8402},[8403],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8199,"description":8204},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[254,8414,8415],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8418,"title":8419,"body":8420,"category":254,"cover":255,"description":8424,"extension":256,"meta":8648,"navigation":104,"path":8649,"pinned":259,"publishedAt":260,"seo":8650,"slug":8651,"stem":8652,"summary":8653,"tags":8654,"updatedAt":260,"visible":104,"__hash__":8656},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8421,"toc":8636},[8422,8425,8427,8430,8432,8438,8441,8443,8463,8465,8467,8549,8551,8557,8559,8561,8583,8585,8588,8594,8601,8603,8613,8615,8627,8629,8631,8634],[10,8423,8424],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8426,16],{"id":16},[10,8428,8429],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8431,22],{"id":22},[10,8433,8434],{},[26,8435],{"alt":8436,"src":8437},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8439,8440],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8442,43],{"id":43},[45,8444,8445,8454,8457],{},[48,8446,8447,8450,8451,205],{},[33,8448,8449],{},"@trace"," 等价于 ",[33,8452,8453],{},"add = trace(add)",[48,8455,8456],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[48,8458,8459,8462],{},[33,8460,8461],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8464,66],{"id":66},[10,8466,69],{},[71,8468,8470],{"className":73,"code":8469,"language":75,"meta":76,"style":76},"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,8471,8472,8477,8481,8486,8491,8496,8501,8506,8511,8516,8521,8525,8530,8534,8538,8543],{"__ignoreMap":76},[80,8473,8474],{"class":82,"line":83},[80,8475,8476],{},"from functools import wraps\n",[80,8478,8479],{"class":82,"line":89},[80,8480,105],{"emptyLinePlaceholder":104},[80,8482,8483],{"class":82,"line":95},[80,8484,8485],{},"def trace(function):\n",[80,8487,8488],{"class":82,"line":101},[80,8489,8490],{},"    @wraps(function)\n",[80,8492,8493],{"class":82,"line":108},[80,8494,8495],{},"    def wrapper(*args, **kwargs):\n",[80,8497,8498],{"class":82,"line":114},[80,8499,8500],{},"        print(\"开始：\", function.__name__)\n",[80,8502,8503],{"class":82,"line":120},[80,8504,8505],{},"        result = function(*args, **kwargs)\n",[80,8507,8508],{"class":82,"line":126},[80,8509,8510],{},"        print(\"结束：\", function.__name__)\n",[80,8512,8513],{"class":82,"line":132},[80,8514,8515],{},"        return result\n",[80,8517,8518],{"class":82,"line":4136},[80,8519,8520],{},"    return wrapper\n",[80,8522,8523],{"class":82,"line":5801},[80,8524,105],{"emptyLinePlaceholder":104},[80,8526,8527],{"class":82,"line":5806},[80,8528,8529],{},"@trace\n",[80,8531,8532],{"class":82,"line":7411},[80,8533,6154],{},[80,8535,8536],{"class":82,"line":7417},[80,8537,6159],{},[80,8539,8541],{"class":82,"line":8540},15,[80,8542,105],{"emptyLinePlaceholder":104},[80,8544,8546],{"class":82,"line":8545},16,[80,8547,8548],{},"print(add(2, 3))\n",[10,8550,138],{},[71,8552,8555],{"className":8553,"code":8554,"language":144,"meta":76},[142],"开始： add\n结束： add\n5\n",[33,8556,8554],{"__ignoreMap":76},[10,8558,149],{},[14,8560,152],{"id":152},[154,8562,8563,8580],{},[48,8564,8565,8566,8569,8570,8573,8574,8577,8578,205],{},"解释器执行定义时，把原 ",[33,8567,8568],{},"add"," 函数交给 ",[33,8571,8572],{},"trace","，返回的 ",[33,8575,8576],{},"wrapper"," 重新绑定到名字 ",[33,8579,8568],{},[48,8581,8582],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[177,8584,179],{"id":179},[10,8586,8587],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8589,8590],{},[26,8591],{"alt":8592,"src":8593},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8595,8596,8598,8599,205],{},[33,8597,8449],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8600,8453],{},[14,8602,194],{"id":194},[45,8604,8605,8610],{},[48,8606,8607,8608,205],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8609,5352],{},[48,8611,8612],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8614,211],{"id":211},[154,8616,8617,8620],{},[48,8618,8619],{},"编写只记录调用次数的简单装饰器。",[48,8621,8622,8623,8626],{},"删除包装函数的 ",[33,8624,8625],{},"return result","，观察调用方得到什么。",[10,8628,231],{},[14,8630,234],{"id":234},[10,8632,8633],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,8635,241],{},{"title":76,"searchDepth":89,"depth":89,"links":8637},[8638,8639,8640,8641,8642,8645,8646,8647],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":8643},[8644],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8419,"description":8424},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[254,8655,5303],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8658,"title":8659,"body":8660,"category":254,"cover":255,"description":8664,"extension":256,"meta":8851,"navigation":104,"path":8852,"pinned":259,"publishedAt":260,"seo":8853,"slug":8854,"stem":8855,"summary":8856,"tags":8857,"updatedAt":260,"visible":104,"__hash__":8860},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8661,"toc":8839},[8662,8665,8667,8670,8672,8678,8681,8683,8694,8696,8698,8773,8775,8781,8783,8785,8796,8798,8801,8807,8810,8812,8820,8822,8830,8832,8834,8837],[10,8663,8664],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8666,16],{"id":16},[10,8668,8669],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8671,22],{"id":22},[10,8673,8674],{},[26,8675],{"alt":8676,"src":8677},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8679,8680],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8682,43],{"id":43},[45,8684,8685,8688,8691],{},[48,8686,8687],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[48,8689,8690],{},"日志记录运行状态，测试判断结果是否符合约定。",[48,8692,8693],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8695,66],{"id":66},[10,8697,69],{},[71,8699,8701],{"className":73,"code":8700,"language":75,"meta":76,"style":76},"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,8702,8703,8708,8713,8717,8722,8726,8731,8736,8741,8745,8750,8755,8760,8764,8768],{"__ignoreMap":76},[80,8704,8705],{"class":82,"line":83},[80,8706,8707],{},"import logging\n",[80,8709,8710],{"class":82,"line":89},[80,8711,8712],{},"import unittest\n",[80,8714,8715],{"class":82,"line":95},[80,8716,105],{"emptyLinePlaceholder":104},[80,8718,8719],{"class":82,"line":101},[80,8720,8721],{},"logging.basicConfig(level=logging.INFO)\n",[80,8723,8724],{"class":82,"line":108},[80,8725,105],{"emptyLinePlaceholder":104},[80,8727,8728],{"class":82,"line":114},[80,8729,8730],{},"def clamp_progress(value):\n",[80,8732,8733],{"class":82,"line":120},[80,8734,8735],{},"    logging.info(\"检查进度：%s\", value)\n",[80,8737,8738],{"class":82,"line":126},[80,8739,8740],{},"    return max(0, min(100, value))\n",[80,8742,8743],{"class":82,"line":132},[80,8744,105],{"emptyLinePlaceholder":104},[80,8746,8747],{"class":82,"line":4136},[80,8748,8749],{},"class ProgressTest(unittest.TestCase):\n",[80,8751,8752],{"class":82,"line":5801},[80,8753,8754],{},"    def test_upper_limit(self):\n",[80,8756,8757],{"class":82,"line":5806},[80,8758,8759],{},"        self.assertEqual(clamp_progress(120), 100)\n",[80,8761,8762],{"class":82,"line":7411},[80,8763,105],{"emptyLinePlaceholder":104},[80,8765,8766],{"class":82,"line":7417},[80,8767,6168],{},[80,8769,8770],{"class":82,"line":8540},[80,8771,8772],{},"    unittest.main()\n",[10,8774,138],{},[71,8776,8779],{"className":8777,"code":8778,"language":144,"meta":76},[142],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8780,8778],{"__ignoreMap":76},[10,8782,149],{},[14,8784,152],{"id":152},[154,8786,8787,8793],{},[48,8788,8789,8792],{},[33,8790,8791],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[48,8794,8795],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[177,8797,179],{"id":179},[10,8799,8800],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8802,8803],{},[26,8804],{"alt":8805,"src":8806},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8808,8809],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8811,194],{"id":194},[45,8813,8814,8817],{},[48,8815,8816],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[48,8818,8819],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8821,211],{"id":211},[154,8823,8824,8827],{},[48,8825,8826],{},"为负数进度增加测试。",[48,8828,8829],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8831,231],{},[14,8833,234],{"id":234},[10,8835,8836],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,8838,241],{},{"title":76,"searchDepth":89,"depth":89,"links":8840},[8841,8842,8843,8844,8845,8848,8849,8850],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":8846},[8847],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8659,"description":8664},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[254,8858,8859],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8862,"title":8863,"body":8864,"category":254,"cover":255,"description":8868,"extension":256,"meta":9168,"navigation":104,"path":9169,"pinned":259,"publishedAt":260,"seo":9170,"slug":9171,"stem":9172,"summary":9173,"tags":9174,"updatedAt":260,"visible":104,"__hash__":9177},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8865,"toc":9155},[8866,8869,8871,8874,8876,8882,8885,8887,8902,8904,8906,9053,9055,9061,9063,9065,9078,9080,9083,9089,9092,9094,9097,9103,9110,9112,9123,9125,9146,9148,9150,9153],[10,8867,8868],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8870,16],{"id":16},[10,8872,8873],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8875,22],{"id":22},[10,8877,8878],{},[26,8879],{"alt":8880,"src":8881},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8883,8884],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8886,43],{"id":43},[45,8888,8889,8892,8895],{},[48,8890,8891],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[48,8893,8894],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[48,8896,8897,8898,8901],{},"实际扩展前先为 ",[33,8899,8900],{},"add()"," 和存储边界补充测试。",[14,8903,66],{"id":66},[10,8905,69],{},[71,8907,8909],{"className":73,"code":8908,"language":75,"meta":76,"style":76},"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,8910,8911,8915,8919,8923,8928,8933,8938,8943,8947,8952,8957,8962,8967,8972,8976,8981,8986,8992,8997,9003,9008,9013,9019,9025,9031,9036,9042,9047],{"__ignoreMap":76},[80,8912,8913],{"class":82,"line":83},[80,8914,6966],{},[80,8916,8917],{"class":82,"line":89},[80,8918,6575],{},[80,8920,8921],{"class":82,"line":95},[80,8922,105],{"emptyLinePlaceholder":104},[80,8924,8925],{"class":82,"line":101},[80,8926,8927],{},"class LearningRecords:\n",[80,8929,8930],{"class":82,"line":108},[80,8931,8932],{},"    def __init__(self, file_path):\n",[80,8934,8935],{"class":82,"line":114},[80,8936,8937],{},"        self.file_path = Path(file_path)\n",[80,8939,8940],{"class":82,"line":120},[80,8941,8942],{},"        self.items = []\n",[80,8944,8945],{"class":82,"line":126},[80,8946,105],{"emptyLinePlaceholder":104},[80,8948,8949],{"class":82,"line":132},[80,8950,8951],{},"    def add(self, title):\n",[80,8953,8954],{"class":82,"line":4136},[80,8955,8956],{},"        title = title.strip()\n",[80,8958,8959],{"class":82,"line":5801},[80,8960,8961],{},"        if not title:\n",[80,8963,8964],{"class":82,"line":5806},[80,8965,8966],{},"            raise ValueError(\"课程名称不能为空\")\n",[80,8968,8969],{"class":82,"line":7411},[80,8970,8971],{},"        self.items.append({\"title\": title, \"done\": False})\n",[80,8973,8974],{"class":82,"line":7417},[80,8975,105],{"emptyLinePlaceholder":104},[80,8977,8978],{"class":82,"line":8540},[80,8979,8980],{},"    def save(self):\n",[80,8982,8983],{"class":82,"line":8545},[80,8984,8985],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[80,8987,8989],{"class":82,"line":8988},17,[80,8990,8991],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[80,8993,8995],{"class":82,"line":8994},18,[80,8996,105],{"emptyLinePlaceholder":104},[80,8998,9000],{"class":82,"line":8999},19,[80,9001,9002],{},"records = LearningRecords(\"learning-records.json\")\n",[80,9004,9006],{"class":82,"line":9005},20,[80,9007,105],{"emptyLinePlaceholder":104},[80,9009,9011],{"class":82,"line":9010},21,[80,9012,7384],{},[80,9014,9016],{"class":82,"line":9015},22,[80,9017,9018],{},"    title = input(\"输入已学习课程：\")\n",[80,9020,9022],{"class":82,"line":9021},23,[80,9023,9024],{},"    records.add(title)\n",[80,9026,9028],{"class":82,"line":9027},24,[80,9029,9030],{},"    records.save()\n",[80,9032,9034],{"class":82,"line":9033},25,[80,9035,7394],{},[80,9037,9039],{"class":82,"line":9038},26,[80,9040,9041],{},"    print(\"无法保存：\", error)\n",[80,9043,9045],{"class":82,"line":9044},27,[80,9046,1173],{},[80,9048,9050],{"class":82,"line":9049},28,[80,9051,9052],{},"    print(\"已保存 1 条学习记录\")\n",[10,9054,138],{},[71,9056,9059],{"className":9057,"code":9058,"language":144,"meta":76},[142],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9060,9058],{"__ignoreMap":76},[10,9062,149],{},[14,9064,152],{"id":152},[154,9066,9067,9073],{},[48,9068,9069,9070,9072],{},"输入层取得课程名后，",[33,9071,8900],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[48,9074,9075,9077],{},[33,9076,8132],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[177,9079,179],{"id":179},[10,9081,9082],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9084,9085],{},[26,9086],{"alt":9087,"src":9088},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9090,9091],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[177,9093,179],{"id":4191},[10,9095,9096],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9098,9099],{},[26,9100],{"alt":9101,"src":9102},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9104,9105,9106,9109],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9107,9108],{},"load()"," 把文件状态恢复到内存。",[14,9111,194],{"id":194},[45,9113,9114,9117],{},[48,9115,9116],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[48,9118,9119,9120,9122],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9121,9108],{}," 是下一项必要扩展。",[14,9124,211],{"id":211},[154,9126,9127,9133,9136],{},[48,9128,9129,9130,9132],{},"增加 ",[33,9131,9108],{},"，文件不存在时从空列表开始。",[48,9134,9135],{},"增加按序号标记完成的功能，并校验序号范围。",[48,9137,9138,9139,9142,9143,9145],{},"把输入循环放进 ",[33,9140,9141],{},"main()","，通过 ",[33,9144,6110],{}," 控制程序入口。",[10,9147,231],{},[14,9149,234],{"id":234},[10,9151,9152],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[239,9154,241],{},{"title":76,"searchDepth":89,"depth":89,"links":9156},[9157,9158,9159,9160,9161,9165,9166,9167],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":9162},[9163,9164],{"id":179,"depth":95,"text":179},{"id":4191,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8863,"description":8868},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[254,9175,9176],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9179,9282,9401,9532,9675,9800,9937,10074,10215,10384,10521,10654,10777,10906,11033,11196,11372,11513,11642,11791,11934,12055,12178,12327,12480,12645,12772,12953,13096,13253,13404,13551,13706,13924,14079,14254,14405,14572,14759,14922,15164,15404],{"id":1419,"title":1420,"body":9180,"category":254,"cover":255,"description":1425,"extension":256,"meta":9279,"navigation":104,"path":1544,"pinned":259,"publishedAt":260,"seo":9280,"slug":1546,"stem":1547,"summary":1548,"tags":9281,"updatedAt":260,"visible":104,"__hash__":1551},{"type":7,"value":9181,"toc":9269},[9182,9184,9186,9188,9190,9194,9198,9200,9210,9212,9214,9222,9224,9229,9231,9233,9243,9245,9253,9255,9261,9263,9265,9267],[10,9183,1425],{},[14,9185,16],{"id":16},[10,9187,1430],{},[14,9189,22],{"id":22},[10,9191,9192],{},[26,9193],{"alt":1437,"src":1438},[10,9195,9196,1443],{},[33,9197,1197],{},[14,9199,43],{"id":43},[45,9201,9202,9206,9208],{},[48,9203,1450,9204,1453],{},[33,9205,1197],{},[48,9207,1456],{},[48,9209,1459],{},[14,9211,66],{"id":66},[10,9213,69],{},[71,9215,9216],{"className":73,"code":1466,"language":75,"meta":76,"style":76},[33,9217,9218],{"__ignoreMap":76},[80,9219,9220],{"class":82,"line":83},[80,9221,1466],{},[10,9223,138],{},[71,9225,9227],{"className":9226,"code":1478,"language":144,"meta":76},[142],[33,9228,1478],{"__ignoreMap":76},[10,9230,149],{},[14,9232,152],{"id":152},[154,9234,9235,9239],{},[48,9236,1489,9237,1493],{},[33,9238,1492],{},[48,9240,1496,9241,1500],{},[33,9242,1499],{},[14,9244,194],{"id":194},[45,9246,9247,9249],{},[48,9248,1507],{},[48,9250,1510,9251,1513],{},[33,9252,1197],{},[14,9254,211],{"id":211},[154,9256,9257,9259],{},[48,9258,1520],{},[48,9260,1523],{},[10,9262,231],{},[14,9264,234],{"id":234},[10,9266,1530],{},[239,9268,241],{},{"title":76,"searchDepth":89,"depth":89,"links":9270},[9271,9272,9273,9274,9275,9276,9277,9278],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":1420,"description":1425},[254,1415,1550],{"id":1553,"title":1554,"body":9283,"category":254,"cover":255,"description":1559,"extension":256,"meta":9398,"navigation":104,"path":1696,"pinned":259,"publishedAt":260,"seo":9399,"slug":1698,"stem":1699,"summary":1700,"tags":9400,"updatedAt":260,"visible":104,"__hash__":1703},{"type":7,"value":9284,"toc":9388},[9285,9287,9289,9291,9293,9297,9301,9303,9313,9315,9317,9337,9339,9344,9346,9348,9358,9360,9370,9372,9380,9382,9384,9386],[10,9286,1559],{},[14,9288,16],{"id":16},[10,9290,1564],{},[14,9292,22],{"id":22},[10,9294,9295],{},[26,9296],{"alt":1571,"src":1572},[10,9298,1575,9299,1578],{},[33,9300,718],{},[14,9302,43],{"id":43},[45,9304,9305,9307,9309],{},[48,9306,1585],{},[48,9308,1588],{},[48,9310,1591,9311,1595],{},[33,9312,1594],{},[14,9314,66],{"id":66},[10,9316,1600],{},[71,9318,9319],{"className":618,"code":763,"language":620,"meta":76,"style":76},[33,9320,9321,9327],{"__ignoreMap":76},[80,9322,9323,9325],{"class":82,"line":83},[80,9324,718],{"class":627},[80,9326,631],{"class":630},[80,9328,9329,9331,9333,9335],{"class":82,"line":89},[80,9330,718],{"class":627},[80,9332,660],{"class":630},[80,9334,664],{"class":663},[80,9336,631],{"class":630},[10,9338,138],{},[71,9340,9342],{"className":9341,"code":1626,"language":144,"meta":76},[142],[33,9343,1626],{"__ignoreMap":76},[10,9345,149],{},[14,9347,152],{"id":152},[154,9349,9350,9354],{},[48,9351,9352,1640],{},[33,9353,1639],{},[48,9355,9356,1645],{},[33,9357,726],{},[14,9359,194],{"id":194},[45,9361,9362,9366],{},[48,9363,1652,9364,1655],{},[33,9365,718],{},[48,9367,1658,9368,1661],{},[33,9369,718],{},[14,9371,211],{"id":211},[154,9373,9374,9378],{},[48,9375,965,9376,1671],{},[33,9377,1670],{},[48,9379,1674],{},[10,9381,231],{},[14,9383,234],{"id":234},[10,9385,1681],{},[239,9387,1684],{},{"title":76,"searchDepth":89,"depth":89,"links":9389},[9390,9391,9392,9393,9394,9395,9396,9397],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":1554,"description":1559},[254,1702,1079],{"id":1705,"title":1706,"body":9402,"category":254,"cover":255,"description":1872,"extension":256,"meta":9529,"navigation":104,"path":1874,"pinned":259,"publishedAt":260,"seo":9530,"slug":1876,"stem":1877,"summary":1878,"tags":9531,"updatedAt":260,"visible":104,"__hash__":1882},{"type":7,"value":9403,"toc":9519},[9404,9408,9410,9412,9414,9418,9420,9422,9438,9440,9442,9462,9464,9469,9471,9473,9485,9487,9497,9499,9509,9511,9513,9517],[10,9405,1711,9406,1714],{},[33,9407,1197],{},[14,9409,16],{"id":16},[10,9411,1719],{},[14,9413,22],{"id":22},[10,9415,9416],{},[26,9417],{"alt":1726,"src":1727},[10,9419,1730],{},[14,9421,43],{"id":43},[45,9423,9424,9430,9434],{},[48,9425,1737,9426,1740,9428,205],{},[33,9427,718],{},[33,9429,1743],{},[48,9431,1746,9432,1750],{},[33,9433,1749],{},[48,9435,1753,9436,1756],{},[33,9437,1197],{},[14,9439,66],{"id":66},[10,9441,69],{},[71,9443,9444],{"className":1763,"code":1764,"language":1765,"meta":76,"style":76},[33,9445,9446,9450,9454,9458],{"__ignoreMap":76},[80,9447,9448],{"class":82,"line":83},[80,9449,1772],{},[80,9451,9452],{"class":82,"line":89},[80,9453,1777],{},[80,9455,9456],{"class":82,"line":95},[80,9457,1782],{},[80,9459,9460],{"class":82,"line":101},[80,9461,1787],{},[10,9463,138],{},[71,9465,9467],{"className":9466,"code":1793,"language":144,"meta":76},[142],[33,9468,1793],{"__ignoreMap":76},[10,9470,149],{},[14,9472,152],{"id":152},[154,9474,9475,9481],{},[48,9476,1804,9477,1808,9479,205],{},[33,9478,1807],{},[33,9480,1811],{},[48,9482,1814,9483,1817],{},[33,9484,1499],{},[14,9486,194],{"id":194},[45,9488,9489,9495],{},[48,9490,1824,9491,1827,9493,1830],{},[33,9492,1743],{},[33,9494,1197],{},[48,9496,1833],{},[14,9498,211],{"id":211},[154,9500,9501,9505],{},[48,9502,1840,9503,205],{},[33,9504,1843],{},[48,9506,1846,9507,1849],{},[33,9508,1499],{},[10,9510,231],{},[14,9512,234],{"id":234},[10,9514,1856,9515,1859],{},[33,9516,1197],{},[239,9518,241],{},{"title":76,"searchDepth":89,"depth":89,"links":9520},[9521,9522,9523,9524,9525,9526,9527,9528],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":1706,"description":1872},[254,1880,1881],{"id":1884,"title":1885,"body":9533,"category":254,"cover":255,"description":1890,"extension":256,"meta":9672,"navigation":104,"path":2062,"pinned":259,"publishedAt":260,"seo":9673,"slug":2064,"stem":2065,"summary":2066,"tags":9674,"updatedAt":260,"visible":104,"__hash__":2070},{"type":7,"value":9534,"toc":9662},[9535,9537,9539,9541,9543,9547,9551,9553,9565,9567,9569,9605,9607,9612,9614,9616,9632,9634,9644,9646,9654,9656,9658,9660],[10,9536,1890],{},[14,9538,16],{"id":16},[10,9540,1895],{},[14,9542,22],{"id":22},[10,9544,9545],{},[26,9546],{"alt":1902,"src":1903},[10,9548,9549,1909],{},[33,9550,1908],{},[14,9552,43],{"id":43},[45,9554,9555,9557,9563],{},[48,9556,1916],{},[48,9558,9559,1922,9561,1926],{},[33,9560,1921],{},[33,9562,1925],{},[48,9564,1929],{},[14,9566,66],{"id":66},[10,9568,1600],{},[71,9570,9571],{"className":618,"code":1936,"language":620,"meta":76,"style":76},[33,9572,9573,9579,9585,9589,9599],{"__ignoreMap":76},[80,9574,9575,9577],{"class":82,"line":83},[80,9576,1943],{"class":627},[80,9578,1946],{"class":663},[80,9580,9581,9583],{"class":82,"line":89},[80,9582,1951],{"class":630},[80,9584,1946],{"class":663},[80,9586,9587],{"class":82,"line":95},[80,9588,1958],{"class":630},[80,9590,9591,9593,9595,9597],{"class":82,"line":101},[80,9592,1963],{"class":630},[80,9594,1966],{"class":663},[80,9596,1970],{"class":1969},[80,9598,1241],{"class":663},[80,9600,9601,9603],{"class":82,"line":108},[80,9602,718],{"class":627},[80,9604,1241],{"class":663},[10,9606,138],{},[71,9608,9610],{"className":9609,"code":1984,"language":144,"meta":76},[142],[33,9611,1984],{"__ignoreMap":76},[10,9613,149],{},[14,9615,152],{"id":152},[154,9617,9618,9626],{},[48,9619,9620,1997,9622,2000,9624,2003],{},[33,9621,1943],{},[33,9623,1951],{},[33,9625,1921],{},[48,9627,9628,2008,9630,2012],{},[33,9629,1908],{},[33,9631,2011],{},[14,9633,194],{"id":194},[45,9635,9636,9642],{},[48,9637,2019,9638,226,9640,205],{},[33,9639,1921],{},[33,9641,1925],{},[48,9643,2026],{},[14,9645,211],{"id":211},[154,9647,9648,9652],{},[48,9649,2033,9650,2037],{},[33,9651,2036],{},[48,9653,2040],{},[10,9655,231],{},[14,9657,234],{"id":234},[10,9659,2047],{},[239,9661,2050],{},{"title":76,"searchDepth":89,"depth":89,"links":9663},[9664,9665,9666,9667,9668,9669,9670,9671],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":1885,"description":1890},[254,2068,2069],{"id":2072,"title":2073,"body":9676,"category":254,"cover":255,"description":2078,"extension":256,"meta":9797,"navigation":104,"path":2227,"pinned":259,"publishedAt":260,"seo":9798,"slug":2229,"stem":2230,"summary":2231,"tags":9799,"updatedAt":260,"visible":104,"__hash__":2235},{"type":7,"value":9677,"toc":9787},[9678,9680,9682,9684,9686,9690,9698,9700,9714,9716,9718,9734,9736,9741,9743,9745,9759,9761,9767,9769,9779,9781,9783,9785],[10,9679,2078],{},[14,9681,16],{"id":16},[10,9683,2083],{},[14,9685,22],{"id":22},[10,9687,9688],{},[26,9689],{"alt":2090,"src":2091},[10,9691,2094,9692,205,9694,2100,9696,205],{},[33,9693,1499],{},[33,9695,2099],{},[33,9697,1807],{},[14,9699,43],{"id":43},[45,9701,9702,9706,9712],{},[48,9703,9704,2112],{},[33,9705,2111],{},[48,9707,9708,2118,9710,205],{},[33,9709,2117],{},[33,9711,2121],{},[48,9713,2124],{},[14,9715,66],{"id":66},[10,9717,69],{},[71,9719,9720],{"className":73,"code":2131,"language":75,"meta":76,"style":76},[33,9721,9722,9726,9730],{"__ignoreMap":76},[80,9723,9724],{"class":82,"line":83},[80,9725,2138],{},[80,9727,9728],{"class":82,"line":89},[80,9729,2143],{},[80,9731,9732],{"class":82,"line":95},[80,9733,2148],{},[10,9735,138],{},[71,9737,9739],{"className":9738,"code":2154,"language":144,"meta":76},[142],[33,9740,2154],{"__ignoreMap":76},[10,9742,149],{},[14,9744,152],{"id":152},[154,9746,9747,9753],{},[48,9748,9749,2168,9751,205],{},[33,9750,2167],{},[33,9752,2121],{},[48,9754,9755,2175,9757,2179],{},[33,9756,1499],{},[33,9758,2178],{},[14,9760,194],{"id":194},[45,9762,9763,9765],{},[48,9764,2186],{},[48,9766,2189],{},[14,9768,211],{"id":211},[154,9770,9771,9773],{},[48,9772,2196],{},[48,9774,2199,9775,2202,9777,2206],{},[33,9776,2099],{},[33,9778,2205],{},[10,9780,231],{},[14,9782,234],{"id":234},[10,9784,2213],{},[239,9786,241],{},{"title":76,"searchDepth":89,"depth":89,"links":9788},[9789,9790,9791,9792,9793,9794,9795,9796],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":2073,"description":2078},[254,2233,2234],{"id":2237,"title":2238,"body":9801,"category":254,"cover":255,"description":2243,"extension":256,"meta":9934,"navigation":104,"path":2410,"pinned":259,"publishedAt":260,"seo":9935,"slug":2412,"stem":2413,"summary":2414,"tags":9936,"updatedAt":260,"visible":104,"__hash__":2418},{"type":7,"value":9802,"toc":9924},[9803,9805,9807,9809,9811,9815,9817,9819,9835,9837,9839,9863,9865,9870,9872,9874,9890,9892,9904,9906,9916,9918,9920,9922],[10,9804,2243],{},[14,9806,16],{"id":16},[10,9808,2248],{},[14,9810,22],{"id":22},[10,9812,9813],{},[26,9814],{"alt":2255,"src":2256},[10,9816,2259],{},[14,9818,43],{"id":43},[45,9820,9821,9823,9829],{},[48,9822,2266],{},[48,9824,2269,9825,2202,9827,2276],{},[33,9826,2272],{},[33,9828,2275],{},[48,9830,2279,9831,2283,9833,2287],{},[33,9832,2282],{},[33,9834,2286],{},[14,9836,66],{"id":66},[10,9838,69],{},[71,9840,9841],{"className":73,"code":2294,"language":75,"meta":76,"style":76},[33,9842,9843,9847,9851,9855,9859],{"__ignoreMap":76},[80,9844,9845],{"class":82,"line":83},[80,9846,2301],{},[80,9848,9849],{"class":82,"line":89},[80,9850,2306],{},[80,9852,9853],{"class":82,"line":95},[80,9854,105],{"emptyLinePlaceholder":104},[80,9856,9857],{"class":82,"line":101},[80,9858,2315],{},[80,9860,9861],{"class":82,"line":108},[80,9862,2306],{},[10,9864,138],{},[71,9866,9868],{"className":9867,"code":2325,"language":144,"meta":76},[142],[33,9869,2325],{"__ignoreMap":76},[10,9871,149],{},[14,9873,152],{"id":152},[154,9875,9876,9882],{},[48,9877,965,9878,2339,9880,2342],{},[33,9879,2338],{},[33,9881,2272],{},[48,9883,965,9884,2348,9886,2352,9888,205],{},[33,9885,2347],{},[33,9887,2351],{},[33,9889,2355],{},[14,9891,194],{"id":194},[45,9893,9894,9896],{},[48,9895,2362],{},[48,9897,219,9898,2283,9900,2283,9902,2372],{},[33,9899,2282],{},[33,9901,2286],{},[33,9903,2371],{},[14,9905,211],{"id":211},[154,9907,9908,9914],{},[48,9909,2379,9910,226,9912,2386],{},[33,9911,2382],{},[33,9913,2385],{},[48,9915,2389],{},[10,9917,231],{},[14,9919,234],{"id":234},[10,9921,2396],{},[239,9923,241],{},{"title":76,"searchDepth":89,"depth":89,"links":9925},[9926,9927,9928,9929,9930,9931,9932,9933],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":2238,"description":2243},[254,2416,2417],{"id":2420,"title":2421,"body":9938,"category":254,"cover":255,"description":2426,"extension":256,"meta":10071,"navigation":104,"path":2591,"pinned":259,"publishedAt":260,"seo":10072,"slug":2593,"stem":2594,"summary":2595,"tags":10073,"updatedAt":260,"visible":104,"__hash__":2599},{"type":7,"value":9939,"toc":10061},[9940,9942,9944,9946,9948,9952,9954,9956,9974,9976,9978,10014,10016,10021,10023,10025,10035,10037,10045,10047,10053,10055,10057,10059],[10,9941,2426],{},[14,9943,16],{"id":16},[10,9945,2431],{},[14,9947,22],{"id":22},[10,9949,9950],{},[26,9951],{"alt":2438,"src":2439},[10,9953,2442],{},[14,9955,43],{"id":43},[45,9957,9958,9964,9972],{},[48,9959,9960,2452,9962,2456],{},[33,9961,2451],{},[33,9963,2455],{},[48,9965,9966,2462,9968,2466,9970,2470],{},[33,9967,2461],{},[33,9969,2465],{},[33,9971,2469],{},[48,9973,2473],{},[14,9975,66],{"id":66},[10,9977,69],{},[71,9979,9980],{"className":73,"code":2480,"language":75,"meta":76,"style":76},[33,9981,9982,9986,9990,9994,9998,10002,10006,10010],{"__ignoreMap":76},[80,9983,9984],{"class":82,"line":83},[80,9985,2487],{},[80,9987,9988],{"class":82,"line":89},[80,9989,2492],{},[80,9991,9992],{"class":82,"line":95},[80,9993,2497],{},[80,9995,9996],{"class":82,"line":101},[80,9997,105],{"emptyLinePlaceholder":104},[80,9999,10000],{"class":82,"line":108},[80,10001,2506],{},[80,10003,10004],{"class":82,"line":114},[80,10005,2511],{},[80,10007,10008],{"class":82,"line":120},[80,10009,2516],{},[80,10011,10012],{"class":82,"line":126},[80,10013,2521],{},[10,10015,138],{},[71,10017,10019],{"className":10018,"code":2527,"language":144,"meta":76},[142],[33,10020,2527],{"__ignoreMap":76},[10,10022,149],{},[14,10024,152],{"id":152},[154,10026,10027,10031],{},[48,10028,10029,2541],{},[33,10030,2540],{},[48,10032,10033,2547],{},[33,10034,2546],{},[14,10036,194],{"id":194},[45,10038,10039,10043],{},[48,10040,2554,10041,205],{},[33,10042,2557],{},[48,10044,2560],{},[14,10046,211],{"id":211},[154,10048,10049,10051],{},[48,10050,2567],{},[48,10052,2570],{},[10,10054,231],{},[14,10056,234],{"id":234},[10,10058,2577],{},[239,10060,241],{},{"title":76,"searchDepth":89,"depth":89,"links":10062},[10063,10064,10065,10066,10067,10068,10069,10070],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":2421,"description":2426},[254,2597,2598],{"id":2601,"title":2602,"body":10075,"category":254,"cover":255,"description":2607,"extension":256,"meta":10212,"navigation":104,"path":2783,"pinned":259,"publishedAt":260,"seo":10213,"slug":2785,"stem":2786,"summary":2787,"tags":10214,"updatedAt":260,"visible":104,"__hash__":2791},{"type":7,"value":10076,"toc":10200},[10077,10079,10081,10083,10085,10089,10095,10097,10105,10107,10109,10133,10135,10140,10142,10144,10162,10164,10166,10170,10172,10174,10180,10182,10192,10194,10196,10198],[10,10078,2607],{},[14,10080,16],{"id":16},[10,10082,2612],{},[14,10084,22],{"id":22},[10,10086,10087],{},[26,10088],{"alt":2619,"src":2620},[10,10090,2623,10091,2627,10093,205],{},[33,10092,2626],{},[33,10094,2630],{},[14,10096,43],{"id":43},[45,10098,10099,10101,10103],{},[48,10100,2637],{},[48,10102,2640],{},[48,10104,2643],{},[14,10106,66],{"id":66},[10,10108,69],{},[71,10110,10111],{"className":73,"code":2650,"language":75,"meta":76,"style":76},[33,10112,10113,10117,10121,10125,10129],{"__ignoreMap":76},[80,10114,10115],{"class":82,"line":83},[80,10116,2657],{},[80,10118,10119],{"class":82,"line":89},[80,10120,2662],{},[80,10122,10123],{"class":82,"line":95},[80,10124,2667],{},[80,10126,10127],{"class":82,"line":101},[80,10128,2672],{},[80,10130,10131],{"class":82,"line":108},[80,10132,2677],{},[10,10134,138],{},[71,10136,10138],{"className":10137,"code":2683,"language":144,"meta":76},[142],[33,10139,2683],{"__ignoreMap":76},[10,10141,149],{},[14,10143,152],{"id":152},[154,10145,10146,10154],{},[48,10147,2694,10148,2697,10150,2701,10152,2705],{},[33,10149,254],{},[33,10151,2700],{},[33,10153,2704],{},[48,10155,10156,2711,10158,2715,10160,2719],{},[33,10157,2710],{},[33,10159,2714],{},[33,10161,2718],{},[177,10163,179],{"id":179},[10,10165,2724],{},[10,10167,10168],{},[26,10169],{"alt":2729,"src":2730},[10,10171,2733],{},[14,10173,194],{"id":194},[45,10175,10176,10178],{},[48,10177,2740],{},[48,10179,2743],{},[14,10181,211],{"id":211},[154,10183,10184,10190],{},[48,10185,2750,10186,2754,10188,205],{},[33,10187,2753],{},[33,10189,2757],{},[48,10191,2760],{},[10,10193,231],{},[14,10195,234],{"id":234},[10,10197,2767],{},[239,10199,241],{},{"title":76,"searchDepth":89,"depth":89,"links":10201},[10202,10203,10204,10205,10206,10209,10210,10211],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":10207},[10208],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":2602,"description":2607},[254,2789,2790],{"id":2793,"title":2794,"body":10216,"category":254,"cover":255,"description":2799,"extension":256,"meta":10381,"navigation":104,"path":3013,"pinned":259,"publishedAt":260,"seo":10382,"slug":3015,"stem":3016,"summary":3017,"tags":10383,"updatedAt":260,"visible":104,"__hash__":3021},{"type":7,"value":10217,"toc":10369},[10218,10220,10222,10224,10226,10230,10236,10238,10258,10260,10262,10298,10300,10305,10307,10309,10323,10325,10327,10331,10337,10339,10349,10351,10361,10363,10365,10367],[10,10219,2799],{},[14,10221,16],{"id":16},[10,10223,2804],{},[14,10225,22],{"id":22},[10,10227,10228],{},[26,10229],{"alt":2811,"src":2812},[10,10231,2815,10232,1036,10234,2822],{},[33,10233,2818],{},[33,10235,2821],{},[14,10237,43],{"id":43},[45,10239,10240,10248,10256],{},[48,10241,10242,2831,10244,2835,10246,2839],{},[33,10243,52],{},[33,10245,2834],{},[33,10247,2838],{},[48,10249,10250,2845,10252,2849,10254,2853],{},[33,10251,2844],{},[33,10253,2848],{},[33,10255,2852],{},[48,10257,2856],{},[14,10259,66],{"id":66},[10,10261,69],{},[71,10263,10264],{"className":73,"code":2863,"language":75,"meta":76,"style":76},[33,10265,10266,10270,10274,10278,10282,10286,10290,10294],{"__ignoreMap":76},[80,10267,10268],{"class":82,"line":83},[80,10269,2870],{},[80,10271,10272],{"class":82,"line":89},[80,10273,2875],{},[80,10275,10276],{"class":82,"line":95},[80,10277,105],{"emptyLinePlaceholder":104},[80,10279,10280],{"class":82,"line":101},[80,10281,2884],{},[80,10283,10284],{"class":82,"line":108},[80,10285,2889],{},[80,10287,10288],{"class":82,"line":114},[80,10289,2894],{},[80,10291,10292],{"class":82,"line":120},[80,10293,2899],{},[80,10295,10296],{"class":82,"line":126},[80,10297,2904],{},[10,10299,138],{},[71,10301,10303],{"className":10302,"code":2910,"language":144,"meta":76},[142],[33,10304,2910],{"__ignoreMap":76},[10,10306,149],{},[14,10308,152],{"id":152},[154,10310,10311,10317],{},[48,10312,10313,2924,10315,2928],{},[33,10314,2923],{},[33,10316,2927],{},[48,10318,10319,2934,10321,2937],{},[33,10320,2933],{},[33,10322,2852],{},[177,10324,179],{"id":179},[10,10326,2942],{},[10,10328,10329],{},[26,10330],{"alt":2947,"src":2948},[10,10332,10333,2953,10335,2956],{},[33,10334,2844],{},[33,10336,2848],{},[14,10338,194],{"id":194},[45,10340,10341,10347],{},[48,10342,2963,10343,2966,10345,2969],{},[33,10344,2838],{},[33,10346,52],{},[48,10348,2972],{},[14,10350,211],{"id":211},[154,10352,10353,10357],{},[48,10354,2979,10355,2983],{},[33,10356,2982],{},[48,10358,2986,10359,2990],{},[33,10360,2989],{},[10,10362,231],{},[14,10364,234],{"id":234},[10,10366,2997],{},[239,10368,241],{},{"title":76,"searchDepth":89,"depth":89,"links":10370},[10371,10372,10373,10374,10375,10378,10379,10380],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":10376},[10377],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":2794,"description":2799},[254,3019,3020],{"id":3023,"title":3024,"body":10385,"category":254,"cover":255,"description":3029,"extension":256,"meta":10518,"navigation":104,"path":3198,"pinned":259,"publishedAt":260,"seo":10519,"slug":3200,"stem":3201,"summary":3202,"tags":10520,"updatedAt":260,"visible":104,"__hash__":3205},{"type":7,"value":10386,"toc":10508},[10387,10389,10391,10393,10395,10399,10409,10411,10421,10423,10425,10453,10455,10460,10462,10464,10478,10480,10488,10490,10500,10502,10504,10506],[10,10388,3029],{},[14,10390,16],{"id":16},[10,10392,3034],{},[14,10394,22],{"id":22},[10,10396,10397],{},[26,10398],{"alt":3041,"src":3042},[10,10400,10401,3048,10403,3052,10405,3056,10407,3060],{},[33,10402,3047],{},[33,10404,3051],{},[33,10406,3055],{},[33,10408,3059],{},[14,10410,43],{"id":43},[45,10412,10413,10415,10419],{},[48,10414,3067],{},[48,10416,10417,3072],{},[33,10418,3059],{},[48,10420,3075],{},[14,10422,66],{"id":66},[10,10424,69],{},[71,10426,10427],{"className":73,"code":3082,"language":75,"meta":76,"style":76},[33,10428,10429,10433,10437,10441,10445,10449],{"__ignoreMap":76},[80,10430,10431],{"class":82,"line":83},[80,10432,3089],{},[80,10434,10435],{"class":82,"line":89},[80,10436,3094],{},[80,10438,10439],{"class":82,"line":95},[80,10440,3099],{},[80,10442,10443],{"class":82,"line":101},[80,10444,105],{"emptyLinePlaceholder":104},[80,10446,10447],{"class":82,"line":108},[80,10448,3108],{},[80,10450,10451],{"class":82,"line":114},[80,10452,3113],{},[10,10454,138],{},[71,10456,10458],{"className":10457,"code":3119,"language":144,"meta":76},[142],[33,10459,3119],{"__ignoreMap":76},[10,10461,149],{},[14,10463,152],{"id":152},[154,10465,10466,10472],{},[48,10467,3130,10468,3133,10470,3137],{},[33,10469,3047],{},[33,10471,3136],{},[48,10473,10474,3143,10476,3147],{},[33,10475,3142],{},[33,10477,3146],{},[14,10479,194],{"id":194},[45,10481,10482,10486],{},[48,10483,3154,10484,3158],{},[33,10485,3157],{},[48,10487,3161],{},[14,10489,211],{"id":211},[154,10491,10492,10494],{},[48,10493,3168],{},[48,10495,1746,10496,3174,10498,3177],{},[33,10497,3173],{},[33,10499,3059],{},[10,10501,231],{},[14,10503,234],{"id":234},[10,10505,3184],{},[239,10507,241],{},{"title":76,"searchDepth":89,"depth":89,"links":10509},[10510,10511,10512,10513,10514,10515,10516,10517],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":3024,"description":3029},[254,2371,3204],{"id":3207,"title":3208,"body":10522,"category":254,"cover":255,"description":3213,"extension":256,"meta":10651,"navigation":104,"path":3374,"pinned":259,"publishedAt":260,"seo":10652,"slug":3376,"stem":3377,"summary":3378,"tags":10653,"updatedAt":260,"visible":104,"__hash__":3382},{"type":7,"value":10523,"toc":10641},[10524,10526,10528,10530,10532,10536,10540,10542,10552,10554,10556,10588,10590,10595,10597,10599,10611,10613,10623,10625,10633,10635,10637,10639],[10,10525,3213],{},[14,10527,16],{"id":16},[10,10529,3218],{},[14,10531,22],{"id":22},[10,10533,10534],{},[26,10535],{"alt":3225,"src":3226},[10,10537,3229,10538,3233],{},[33,10539,3232],{},[14,10541,43],{"id":43},[45,10543,10544,10546,10548],{},[48,10545,3240],{},[48,10547,3243],{},[48,10549,3246,10550,205],{},[33,10551,3249],{},[14,10553,66],{"id":66},[10,10555,69],{},[71,10557,10558],{"className":73,"code":3256,"language":75,"meta":76,"style":76},[33,10559,10560,10564,10568,10572,10576,10580,10584],{"__ignoreMap":76},[80,10561,10562],{"class":82,"line":83},[80,10563,3263],{},[80,10565,10566],{"class":82,"line":89},[80,10567,3268],{},[80,10569,10570],{"class":82,"line":95},[80,10571,105],{"emptyLinePlaceholder":104},[80,10573,10574],{"class":82,"line":101},[80,10575,3277],{},[80,10577,10578],{"class":82,"line":108},[80,10579,3282],{},[80,10581,10582],{"class":82,"line":114},[80,10583,3287],{},[80,10585,10586],{"class":82,"line":120},[80,10587,3292],{},[10,10589,138],{},[71,10591,10593],{"className":10592,"code":3298,"language":144,"meta":76},[142],[33,10594,3298],{"__ignoreMap":76},[10,10596,149],{},[14,10598,152],{"id":152},[154,10600,10601,10603],{},[48,10602,3309],{},[48,10604,10605,3315,10607,3319,10609,3323],{},[33,10606,3314],{},[33,10608,3318],{},[33,10610,3322],{},[14,10612,194],{"id":194},[45,10614,10615,10621],{},[48,10616,3330,10617,3334,10619,205],{},[33,10618,3333],{},[33,10620,3337],{},[48,10622,3340],{},[14,10624,211],{"id":211},[154,10626,10627,10629],{},[48,10628,3347],{},[48,10630,3350,10631,3353],{},[33,10632,3322],{},[10,10634,231],{},[14,10636,234],{"id":234},[10,10638,3360],{},[239,10640,241],{},{"title":76,"searchDepth":89,"depth":89,"links":10642},[10643,10644,10645,10646,10647,10648,10649,10650],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":3208,"description":3213},[254,3380,3381],{"id":3384,"title":3385,"body":10655,"category":254,"cover":255,"description":3390,"extension":256,"meta":10774,"navigation":104,"path":3532,"pinned":259,"publishedAt":260,"seo":10775,"slug":3534,"stem":3535,"summary":3536,"tags":10776,"updatedAt":260,"visible":104,"__hash__":3539},{"type":7,"value":10656,"toc":10764},[10657,10659,10661,10663,10665,10669,10671,10673,10681,10683,10685,10713,10715,10720,10722,10724,10734,10736,10744,10746,10756,10758,10760,10762],[10,10658,3390],{},[14,10660,16],{"id":16},[10,10662,3395],{},[14,10664,22],{"id":22},[10,10666,10667],{},[26,10668],{"alt":3402,"src":3403},[10,10670,3406],{},[14,10672,43],{"id":43},[45,10674,10675,10677,10679],{},[48,10676,3413],{},[48,10678,3416],{},[48,10680,3419],{},[14,10682,66],{"id":66},[10,10684,69],{},[71,10686,10687],{"className":73,"code":3426,"language":75,"meta":76,"style":76},[33,10688,10689,10693,10697,10701,10705,10709],{"__ignoreMap":76},[80,10690,10691],{"class":82,"line":83},[80,10692,3433],{},[80,10694,10695],{"class":82,"line":89},[80,10696,3438],{},[80,10698,10699],{"class":82,"line":95},[80,10700,3443],{},[80,10702,10703],{"class":82,"line":101},[80,10704,105],{"emptyLinePlaceholder":104},[80,10706,10707],{"class":82,"line":108},[80,10708,3452],{},[80,10710,10711],{"class":82,"line":114},[80,10712,3457],{},[10,10714,138],{},[71,10716,10718],{"className":10717,"code":3463,"language":144,"meta":76},[142],[33,10719,3463],{"__ignoreMap":76},[10,10721,149],{},[14,10723,152],{"id":152},[154,10725,10726,10730],{},[48,10727,10728,3477],{},[33,10729,3476],{},[48,10731,10732,3483],{},[33,10733,3482],{},[14,10735,194],{"id":194},[45,10737,10738,10742],{},[48,10739,3490,10740,3494],{},[33,10741,3493],{},[48,10743,3497],{},[14,10745,211],{"id":211},[154,10747,10748,10750],{},[48,10749,3504],{},[48,10751,2199,10752,2202,10754,3511],{},[33,10753,3493],{},[33,10755,3482],{},[10,10757,231],{},[14,10759,234],{"id":234},[10,10761,3518],{},[239,10763,241],{},{"title":76,"searchDepth":89,"depth":89,"links":10765},[10766,10767,10768,10769,10770,10771,10772,10773],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":3385,"description":3390},[254,3538,3381],{"id":3541,"title":3542,"body":10778,"category":254,"cover":255,"description":3547,"extension":256,"meta":10903,"navigation":104,"path":3703,"pinned":259,"publishedAt":260,"seo":10904,"slug":3705,"stem":3706,"summary":3707,"tags":10905,"updatedAt":260,"visible":104,"__hash__":3710},{"type":7,"value":10779,"toc":10893},[10780,10782,10784,10786,10788,10792,10798,10800,10810,10812,10814,10842,10844,10849,10851,10853,10863,10865,10877,10879,10885,10887,10889,10891],[10,10781,3547],{},[14,10783,16],{"id":16},[10,10785,3552],{},[14,10787,22],{"id":22},[10,10789,10790],{},[26,10791],{"alt":3559,"src":3560},[10,10793,3563,10794,3567,10796,3570],{},[33,10795,3566],{},[33,10797,2272],{},[14,10799,43],{"id":43},[45,10801,10802,10804,10808],{},[48,10803,3577],{},[48,10805,219,10806,3583],{},[33,10807,3582],{},[48,10809,3586],{},[14,10811,66],{"id":66},[10,10813,69],{},[71,10815,10816],{"className":73,"code":3593,"language":75,"meta":76,"style":76},[33,10817,10818,10822,10826,10830,10834,10838],{"__ignoreMap":76},[80,10819,10820],{"class":82,"line":83},[80,10821,3600],{},[80,10823,10824],{"class":82,"line":89},[80,10825,3605],{},[80,10827,10828],{"class":82,"line":95},[80,10829,105],{"emptyLinePlaceholder":104},[80,10831,10832],{"class":82,"line":101},[80,10833,3614],{},[80,10835,10836],{"class":82,"line":108},[80,10837,3619],{},[80,10839,10840],{"class":82,"line":114},[80,10841,3624],{},[10,10843,138],{},[71,10845,10847],{"className":10846,"code":3630,"language":144,"meta":76},[142],[33,10848,3630],{"__ignoreMap":76},[10,10850,149],{},[14,10852,152],{"id":152},[154,10854,10855,10857],{},[48,10856,3641],{},[48,10858,3644,10859,3647,10861,3651],{},[33,10860,2272],{},[33,10862,3650],{},[14,10864,194],{"id":194},[45,10866,10867,10871],{},[48,10868,3658,10869,3662],{},[33,10870,3661],{},[48,10872,3665,10873,3669,10875,205],{},[33,10874,3668],{},[33,10876,3672],{},[14,10878,211],{"id":211},[154,10880,10881,10883],{},[48,10882,3679],{},[48,10884,3682],{},[10,10886,231],{},[14,10888,234],{"id":234},[10,10890,3689],{},[239,10892,241],{},{"title":76,"searchDepth":89,"depth":89,"links":10894},[10895,10896,10897,10898,10899,10900,10901,10902],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":3542,"description":3547},[254,3709,3381],{"id":3712,"title":3713,"body":10907,"category":254,"cover":255,"description":3718,"extension":256,"meta":11030,"navigation":104,"path":3868,"pinned":259,"publishedAt":260,"seo":11031,"slug":3870,"stem":3871,"summary":3872,"tags":11032,"updatedAt":260,"visible":104,"__hash__":3875},{"type":7,"value":10908,"toc":11020},[10909,10911,10913,10915,10917,10921,10923,10925,10937,10939,10941,10969,10971,10976,10978,10980,10990,10992,11002,11004,11012,11014,11016,11018],[10,10910,3718],{},[14,10912,16],{"id":16},[10,10914,3723],{},[14,10916,22],{"id":22},[10,10918,10919],{},[26,10920],{"alt":3730,"src":3731},[10,10922,3734],{},[14,10924,43],{"id":43},[45,10926,10927,10929,10931],{},[48,10928,3741],{},[48,10930,3744],{},[48,10932,3747,10933,3751,10935,3755],{},[33,10934,3750],{},[33,10936,3754],{},[14,10938,66],{"id":66},[10,10940,69],{},[71,10942,10943],{"className":73,"code":3762,"language":75,"meta":76,"style":76},[33,10944,10945,10949,10953,10957,10961,10965],{"__ignoreMap":76},[80,10946,10947],{"class":82,"line":83},[80,10948,3769],{},[80,10950,10951],{"class":82,"line":89},[80,10952,3774],{},[80,10954,10955],{"class":82,"line":95},[80,10956,105],{"emptyLinePlaceholder":104},[80,10958,10959],{"class":82,"line":101},[80,10960,3783],{},[80,10962,10963],{"class":82,"line":108},[80,10964,3788],{},[80,10966,10967],{"class":82,"line":114},[80,10968,3793],{},[10,10970,138],{},[71,10972,10974],{"className":10973,"code":3799,"language":144,"meta":76},[142],[33,10975,3799],{"__ignoreMap":76},[10,10977,149],{},[14,10979,152],{"id":152},[154,10981,10982,10984],{},[48,10983,3810],{},[48,10985,10986,3816,10988,3820],{},[33,10987,3815],{},[33,10989,3819],{},[14,10991,194],{"id":194},[45,10993,10994,11000],{},[48,10995,219,10996,3829,10998,205],{},[33,10997,3754],{},[33,10999,3750],{},[48,11001,3834],{},[14,11003,211],{"id":211},[154,11005,11006,11010],{},[48,11007,3841,11008,3844],{},[33,11009,3750],{},[48,11011,3847],{},[10,11013,231],{},[14,11015,234],{"id":234},[10,11017,3854],{},[239,11019,241],{},{"title":76,"searchDepth":89,"depth":89,"links":11021},[11022,11023,11024,11025,11026,11027,11028,11029],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":3713,"description":3718},[254,3874,3381],{"id":4,"title":5,"body":11034,"category":254,"cover":255,"description":12,"extension":256,"meta":11193,"navigation":104,"path":258,"pinned":259,"publishedAt":260,"seo":11194,"slug":262,"stem":263,"summary":264,"tags":11195,"updatedAt":260,"visible":104,"__hash__":268},{"type":7,"value":11035,"toc":11181},[11036,11038,11040,11042,11044,11048,11054,11056,11068,11070,11072,11112,11114,11119,11121,11123,11137,11139,11141,11145,11147,11149,11159,11161,11173,11175,11177,11179],[10,11037,12],{},[14,11039,16],{"id":16},[10,11041,19],{},[14,11043,22],{"id":22},[10,11045,11046],{},[26,11047],{"alt":28,"src":29},[10,11049,11050,36,11052,40],{},[33,11051,35],{},[33,11053,39],{},[14,11055,43],{"id":43},[45,11057,11058,11064,11066],{},[48,11059,11060,53,11062,57],{},[33,11061,52],{},[33,11063,56],{},[48,11065,60],{},[48,11067,63],{},[14,11069,66],{"id":66},[10,11071,69],{},[71,11073,11074],{"className":73,"code":74,"language":75,"meta":76,"style":76},[33,11075,11076,11080,11084,11088,11092,11096,11100,11104,11108],{"__ignoreMap":76},[80,11077,11078],{"class":82,"line":83},[80,11079,86],{},[80,11081,11082],{"class":82,"line":89},[80,11083,92],{},[80,11085,11086],{"class":82,"line":95},[80,11087,98],{},[80,11089,11090],{"class":82,"line":101},[80,11091,105],{"emptyLinePlaceholder":104},[80,11093,11094],{"class":82,"line":108},[80,11095,111],{},[80,11097,11098],{"class":82,"line":114},[80,11099,117],{},[80,11101,11102],{"class":82,"line":120},[80,11103,123],{},[80,11105,11106],{"class":82,"line":126},[80,11107,129],{},[80,11109,11110],{"class":82,"line":132},[80,11111,135],{},[10,11113,138],{},[71,11115,11117],{"className":11116,"code":143,"language":144,"meta":76},[142],[33,11118,143],{"__ignoreMap":76},[10,11120,149],{},[14,11122,152],{"id":152},[154,11124,11125,11129],{},[48,11126,11127,161],{},[33,11128,160],{},[48,11130,11131,167,11133,171,11135,175],{},[33,11132,166],{},[33,11134,170],{},[33,11136,174],{},[177,11138,179],{"id":179},[10,11140,182],{},[10,11142,11143],{},[26,11144],{"alt":187,"src":188},[10,11146,191],{},[14,11148,194],{"id":194},[45,11150,11151,11157],{},[48,11152,199,11153,202,11155,205],{},[33,11154,52],{},[33,11156,56],{},[48,11158,208],{},[14,11160,211],{"id":211},[154,11162,11163,11165],{},[48,11164,216],{},[48,11166,219,11167,223,11169,226,11171,205],{},[33,11168,222],{},[33,11170,56],{},[33,11172,52],{},[10,11174,231],{},[14,11176,234],{"id":234},[10,11178,237],{},[239,11180,241],{},{"title":76,"searchDepth":89,"depth":89,"links":11182},[11183,11184,11185,11186,11187,11190,11191,11192],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":11188},[11189],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":5,"description":12},[254,266,267],{"id":4040,"title":4041,"body":11197,"category":254,"cover":255,"description":4046,"extension":256,"meta":11369,"navigation":104,"path":4260,"pinned":259,"publishedAt":260,"seo":11370,"slug":4262,"stem":4263,"summary":4264,"tags":11371,"updatedAt":260,"visible":104,"__hash__":4267},{"type":7,"value":11198,"toc":11356},[11199,11201,11203,11205,11207,11211,11219,11221,11229,11231,11233,11277,11279,11284,11286,11288,11300,11302,11304,11308,11314,11316,11318,11322,11326,11328,11340,11342,11348,11350,11352,11354],[10,11200,4046],{},[14,11202,16],{"id":16},[10,11204,4051],{},[14,11206,22],{"id":22},[10,11208,11209],{},[26,11210],{"alt":4058,"src":4059},[10,11212,11213,2283,11215,2283,11217,4069],{},[33,11214,1183],{},[33,11216,4066],{},[33,11218,1186],{},[14,11220,43],{"id":43},[45,11222,11223,11225,11227],{},[48,11224,4076],{},[48,11226,4079],{},[48,11228,4082],{},[14,11230,66],{"id":66},[10,11232,69],{},[71,11234,11235],{"className":73,"code":4089,"language":75,"meta":76,"style":76},[33,11236,11237,11241,11245,11249,11253,11257,11261,11265,11269,11273],{"__ignoreMap":76},[80,11238,11239],{"class":82,"line":83},[80,11240,4096],{},[80,11242,11243],{"class":82,"line":89},[80,11244,105],{"emptyLinePlaceholder":104},[80,11246,11247],{"class":82,"line":95},[80,11248,4105],{},[80,11250,11251],{"class":82,"line":101},[80,11252,4110],{},[80,11254,11255],{"class":82,"line":108},[80,11256,4115],{},[80,11258,11259],{"class":82,"line":114},[80,11260,4120],{},[80,11262,11263],{"class":82,"line":120},[80,11264,1173],{},[80,11266,11267],{"class":82,"line":126},[80,11268,4129],{},[80,11270,11271],{"class":82,"line":132},[80,11272,105],{"emptyLinePlaceholder":104},[80,11274,11275],{"class":82,"line":4136},[80,11276,4139],{},[10,11278,138],{},[71,11280,11282],{"className":11281,"code":4145,"language":144,"meta":76},[142],[33,11283,4145],{"__ignoreMap":76},[10,11285,149],{},[14,11287,152],{"id":152},[154,11289,11290,11294],{},[48,11291,4156,11292,4160],{},[33,11293,4159],{},[48,11295,11296,4166,11298,4169],{},[33,11297,4165],{},[33,11299,1186],{},[177,11301,179],{"id":179},[10,11303,4174],{},[10,11305,11306],{},[26,11307],{"alt":4179,"src":4180},[10,11309,11310,4185,11312,4188],{},[33,11311,4159],{},[33,11313,4165],{},[177,11315,179],{"id":4191},[10,11317,4194],{},[10,11319,11320],{},[26,11321],{"alt":4199,"src":4200},[10,11323,4203,11324,4206],{},[33,11325,1183],{},[14,11327,194],{"id":194},[45,11329,11330,11334],{},[48,11331,4213,11332,4216],{},[33,11333,4165],{},[48,11335,4219,11336,4222,11338,4226],{},[33,11337,1183],{},[33,11339,4225],{},[14,11341,211],{"id":211},[154,11343,11344,11346],{},[48,11345,4233],{},[48,11347,4236],{},[10,11349,231],{},[14,11351,234],{"id":234},[10,11353,4243],{},[239,11355,241],{},{"title":76,"searchDepth":89,"depth":89,"links":11357},[11358,11359,11360,11361,11362,11366,11367,11368],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":11363},[11364,11365],{"id":179,"depth":95,"text":179},{"id":4191,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":4041,"description":4046},[254,1183,4266],{"id":4269,"title":4270,"body":11373,"category":254,"cover":255,"description":4275,"extension":256,"meta":11510,"navigation":104,"path":4442,"pinned":259,"publishedAt":260,"seo":11511,"slug":4444,"stem":4445,"summary":4446,"tags":11512,"updatedAt":260,"visible":104,"__hash__":4449},{"type":7,"value":11374,"toc":11498},[11375,11377,11379,11381,11383,11387,11391,11393,11403,11405,11407,11439,11441,11446,11448,11450,11460,11462,11464,11468,11472,11474,11480,11482,11490,11492,11494,11496],[10,11376,4275],{},[14,11378,16],{"id":16},[10,11380,4280],{},[14,11382,22],{"id":22},[10,11384,11385],{},[26,11386],{"alt":4287,"src":4288},[10,11388,11389,4294],{},[33,11390,4293],{},[14,11392,43],{"id":43},[45,11394,11395,11397,11399],{},[48,11396,4301],{},[48,11398,4304],{},[48,11400,4307,11401,4311],{},[33,11402,4310],{},[14,11404,66],{"id":66},[10,11406,69],{},[71,11408,11409],{"className":73,"code":4318,"language":75,"meta":76,"style":76},[33,11410,11411,11415,11419,11423,11427,11431,11435],{"__ignoreMap":76},[80,11412,11413],{"class":82,"line":83},[80,11414,4325],{},[80,11416,11417],{"class":82,"line":89},[80,11418,105],{"emptyLinePlaceholder":104},[80,11420,11421],{"class":82,"line":95},[80,11422,4334],{},[80,11424,11425],{"class":82,"line":101},[80,11426,4339],{},[80,11428,11429],{"class":82,"line":108},[80,11430,4344],{},[80,11432,11433],{"class":82,"line":114},[80,11434,105],{"emptyLinePlaceholder":104},[80,11436,11437],{"class":82,"line":120},[80,11438,4353],{},[10,11440,138],{},[71,11442,11444],{"className":11443,"code":4359,"language":144,"meta":76},[142],[33,11445,4359],{"__ignoreMap":76},[10,11447,149],{},[14,11449,152],{"id":152},[154,11451,11452,11456],{},[48,11453,4370,11454,4374],{},[33,11455,4373],{},[48,11457,4377,11458,4380],{},[33,11459,4373],{},[177,11461,179],{"id":179},[10,11463,4385],{},[10,11465,11466],{},[26,11467],{"alt":4390,"src":4391},[10,11469,4394,11470,4397],{},[33,11471,4373],{},[14,11473,194],{"id":194},[45,11475,11476,11478],{},[48,11477,4404],{},[48,11479,4407],{},[14,11481,211],{"id":211},[154,11483,11484,11488],{},[48,11485,219,11486,4416],{},[33,11487,4293],{},[48,11489,4419],{},[10,11491,231],{},[14,11493,234],{"id":234},[10,11495,4426],{},[239,11497,241],{},{"title":76,"searchDepth":89,"depth":89,"links":11499},[11500,11501,11502,11503,11504,11507,11508,11509],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":11505},[11506],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":4270,"description":4275},[254,4293,4448],{"id":4451,"title":4452,"body":11514,"category":254,"cover":255,"description":4457,"extension":256,"meta":11639,"navigation":104,"path":4606,"pinned":259,"publishedAt":260,"seo":11640,"slug":4608,"stem":4609,"summary":4610,"tags":11641,"updatedAt":260,"visible":104,"__hash__":4613},{"type":7,"value":11515,"toc":11629},[11516,11518,11520,11522,11524,11528,11532,11534,11544,11546,11548,11580,11582,11587,11589,11591,11603,11605,11611,11613,11621,11623,11625,11627],[10,11517,4457],{},[14,11519,16],{"id":16},[10,11521,4462],{},[14,11523,22],{"id":22},[10,11525,11526],{},[26,11527],{"alt":4469,"src":4470},[10,11529,11530,4475],{},[33,11531,4310],{},[14,11533,43],{"id":43},[45,11535,11536,11540,11542],{},[48,11537,11538,4485],{},[33,11539,4484],{},[48,11541,4488],{},[48,11543,4491],{},[14,11545,66],{"id":66},[10,11547,69],{},[71,11549,11550],{"className":73,"code":4498,"language":75,"meta":76,"style":76},[33,11551,11552,11556,11560,11564,11568,11572,11576],{"__ignoreMap":76},[80,11553,11554],{"class":82,"line":83},[80,11555,4505],{},[80,11557,11558],{"class":82,"line":89},[80,11559,105],{"emptyLinePlaceholder":104},[80,11561,11562],{"class":82,"line":95},[80,11563,4514],{},[80,11565,11566],{"class":82,"line":101},[80,11567,4519],{},[80,11569,11570],{"class":82,"line":108},[80,11571,105],{"emptyLinePlaceholder":104},[80,11573,11574],{"class":82,"line":114},[80,11575,4528],{},[80,11577,11578],{"class":82,"line":120},[80,11579,4533],{},[10,11581,138],{},[71,11583,11585],{"className":11584,"code":4539,"language":144,"meta":76},[142],[33,11586,4539],{"__ignoreMap":76},[10,11588,149],{},[14,11590,152],{"id":152},[154,11592,11593,11599],{},[48,11594,4550,11595,4553,11597,4557],{},[33,11596,4310],{},[33,11598,4556],{},[48,11600,11601,4562],{},[33,11602,4484],{},[14,11604,194],{"id":194},[45,11606,11607,11609],{},[48,11608,4569],{},[48,11610,4572],{},[14,11612,211],{"id":211},[154,11614,11615,11617],{},[48,11616,4579],{},[48,11618,219,11619,4585],{},[33,11620,4584],{},[10,11622,231],{},[14,11624,234],{"id":234},[10,11626,4592],{},[239,11628,241],{},{"title":76,"searchDepth":89,"depth":89,"links":11630},[11631,11632,11633,11634,11635,11636,11637,11638],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":4452,"description":4457},[254,4310,4612],{"id":4615,"title":4616,"body":11643,"category":254,"cover":255,"description":4621,"extension":256,"meta":11788,"navigation":104,"path":4796,"pinned":259,"publishedAt":260,"seo":11789,"slug":4798,"stem":4799,"summary":4800,"tags":11790,"updatedAt":260,"visible":104,"__hash__":4802},{"type":7,"value":11644,"toc":11778},[11645,11647,11649,11651,11653,11657,11663,11665,11679,11681,11683,11727,11729,11734,11736,11738,11748,11750,11762,11764,11770,11772,11774,11776],[10,11646,4621],{},[14,11648,16],{"id":16},[10,11650,4626],{},[14,11652,22],{"id":22},[10,11654,11655],{},[26,11656],{"alt":4633,"src":4634},[10,11658,11659,4640,11661,4644],{},[33,11660,4639],{},[33,11662,4643],{},[14,11664,43],{"id":43},[45,11666,11667,11669,11675],{},[48,11668,4651],{},[48,11670,11671,4656,11673,4659],{},[33,11672,4639],{},[33,11674,4293],{},[48,11676,4662,11677,4665],{},[33,11678,4643],{},[14,11680,66],{"id":66},[10,11682,69],{},[71,11684,11685],{"className":73,"code":4672,"language":75,"meta":76,"style":76},[33,11686,11687,11691,11695,11699,11703,11707,11711,11715,11719,11723],{"__ignoreMap":76},[80,11688,11689],{"class":82,"line":83},[80,11690,4679],{},[80,11692,11693],{"class":82,"line":89},[80,11694,105],{"emptyLinePlaceholder":104},[80,11696,11697],{"class":82,"line":95},[80,11698,4688],{},[80,11700,11701],{"class":82,"line":101},[80,11702,4693],{},[80,11704,11705],{"class":82,"line":108},[80,11706,4698],{},[80,11708,11709],{"class":82,"line":114},[80,11710,4703],{},[80,11712,11713],{"class":82,"line":120},[80,11714,4708],{},[80,11716,11717],{"class":82,"line":126},[80,11718,4533],{},[80,11720,11721],{"class":82,"line":132},[80,11722,105],{"emptyLinePlaceholder":104},[80,11724,11725],{"class":82,"line":4136},[80,11726,4721],{},[10,11728,138],{},[71,11730,11732],{"className":11731,"code":4727,"language":144,"meta":76},[142],[33,11733,4727],{"__ignoreMap":76},[10,11735,149],{},[14,11737,152],{"id":152},[154,11739,11740,11744],{},[48,11741,4738,11742,4741],{},[33,11743,4639],{},[48,11745,4744,11746,4747],{},[33,11747,4643],{},[14,11749,194],{"id":194},[45,11751,11752,11756],{},[48,11753,3490,11754,4756],{},[33,11755,4639],{},[48,11757,4759,11758,4762,11760,4765],{},[33,11759,4293],{},[33,11761,4639],{},[14,11763,211],{"id":211},[154,11765,11766,11768],{},[48,11767,4772],{},[48,11769,4775],{},[10,11771,231],{},[14,11773,234],{"id":234},[10,11775,4782],{},[239,11777,241],{},{"title":76,"searchDepth":89,"depth":89,"links":11779},[11780,11781,11782,11783,11784,11785,11786,11787],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":4616,"description":4621},[254,4643,4639],{"id":4804,"title":4805,"body":11792,"category":254,"cover":255,"description":4810,"extension":256,"meta":11931,"navigation":104,"path":4982,"pinned":259,"publishedAt":260,"seo":11932,"slug":4984,"stem":4985,"summary":4986,"tags":11933,"updatedAt":260,"visible":104,"__hash__":4990},{"type":7,"value":11793,"toc":11919},[11794,11796,11798,11800,11802,11806,11808,11810,11826,11828,11830,11858,11860,11865,11867,11869,11881,11883,11885,11889,11891,11893,11903,11905,11911,11913,11915,11917],[10,11795,4810],{},[14,11797,16],{"id":16},[10,11799,4815],{},[14,11801,22],{"id":22},[10,11803,11804],{},[26,11805],{"alt":4822,"src":4823},[10,11807,4826],{},[14,11809,43],{"id":43},[45,11811,11812,11814,11816],{},[48,11813,4833],{},[48,11815,4836],{},[48,11817,4839,11818,2283,11820,4846,11822,2283,11824,205],{},[33,11819,4842],{},[33,11821,4845],{},[33,11823,4849],{},[33,11825,4852],{},[14,11827,66],{"id":66},[10,11829,69],{},[71,11831,11832],{"className":73,"code":4859,"language":75,"meta":76,"style":76},[33,11833,11834,11838,11842,11846,11850,11854],{"__ignoreMap":76},[80,11835,11836],{"class":82,"line":83},[80,11837,4866],{},[80,11839,11840],{"class":82,"line":89},[80,11841,105],{"emptyLinePlaceholder":104},[80,11843,11844],{"class":82,"line":95},[80,11845,4875],{},[80,11847,11848],{"class":82,"line":101},[80,11849,4880],{},[80,11851,11852],{"class":82,"line":108},[80,11853,4885],{},[80,11855,11856],{"class":82,"line":114},[80,11857,4890],{},[10,11859,138],{},[71,11861,11863],{"className":11862,"code":4896,"language":144,"meta":76},[142],[33,11864,4896],{"__ignoreMap":76},[10,11866,149],{},[14,11868,152],{"id":152},[154,11870,11871,11879],{},[48,11872,4907,11873,4910,11875,226,11877,205],{},[33,11874,4842],{},[33,11876,4913],{},[33,11878,4916],{},[48,11880,4919],{},[177,11882,179],{"id":179},[10,11884,4924],{},[10,11886,11887],{},[26,11888],{"alt":4929,"src":4930},[10,11890,4933],{},[14,11892,194],{"id":194},[45,11894,11895,11901],{},[48,11896,4940,11897,1036,11899,4946],{},[33,11898,4943],{},[33,11900,4849],{},[48,11902,4949],{},[14,11904,211],{"id":211},[154,11906,11907,11909],{},[48,11908,4956],{},[48,11910,4959],{},[10,11912,231],{},[14,11914,234],{"id":234},[10,11916,4966],{},[239,11918,241],{},{"title":76,"searchDepth":89,"depth":89,"links":11920},[11921,11922,11923,11924,11925,11928,11929,11930],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":11926},[11927],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":4805,"description":4810},[254,4988,4989],{"id":4992,"title":4993,"body":11935,"category":254,"cover":255,"description":4998,"extension":256,"meta":12052,"navigation":104,"path":5137,"pinned":259,"publishedAt":260,"seo":12053,"slug":5139,"stem":5140,"summary":5141,"tags":12054,"updatedAt":260,"visible":104,"__hash__":5145},{"type":7,"value":11936,"toc":12042},[11937,11939,11941,11943,11945,11949,11951,11953,11961,11963,11965,11997,11999,12004,12006,12008,12016,12018,12026,12028,12034,12036,12038,12040],[10,11938,4998],{},[14,11940,16],{"id":16},[10,11942,5003],{},[14,11944,22],{"id":22},[10,11946,11947],{},[26,11948],{"alt":5010,"src":5011},[10,11950,5014],{},[14,11952,43],{"id":43},[45,11954,11955,11957,11959],{},[48,11956,5021],{},[48,11958,5024],{},[48,11960,5027],{},[14,11962,66],{"id":66},[10,11964,69],{},[71,11966,11967],{"className":73,"code":5034,"language":75,"meta":76,"style":76},[33,11968,11969,11973,11977,11981,11985,11989,11993],{"__ignoreMap":76},[80,11970,11971],{"class":82,"line":83},[80,11972,5041],{},[80,11974,11975],{"class":82,"line":89},[80,11976,105],{"emptyLinePlaceholder":104},[80,11978,11979],{"class":82,"line":95},[80,11980,5050],{},[80,11982,11983],{"class":82,"line":101},[80,11984,5055],{},[80,11986,11987],{"class":82,"line":108},[80,11988,105],{"emptyLinePlaceholder":104},[80,11990,11991],{"class":82,"line":114},[80,11992,5064],{},[80,11994,11995],{"class":82,"line":120},[80,11996,5069],{},[10,11998,138],{},[71,12000,12002],{"className":12001,"code":5075,"language":144,"meta":76},[142],[33,12003,5075],{"__ignoreMap":76},[10,12005,149],{},[14,12007,152],{"id":152},[154,12009,12010,12012],{},[48,12011,5086],{},[48,12013,5089,12014,5093],{},[33,12015,5092],{},[14,12017,194],{"id":194},[45,12019,12020,12024],{},[48,12021,5100,12022,5103],{},[33,12023,4310],{},[48,12025,5106],{},[14,12027,211],{"id":211},[154,12029,12030,12032],{},[48,12031,5113],{},[48,12033,5116],{},[10,12035,231],{},[14,12037,234],{"id":234},[10,12039,5123],{},[239,12041,241],{},{"title":76,"searchDepth":89,"depth":89,"links":12043},[12044,12045,12046,12047,12048,12049,12050,12051],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":4993,"description":4998},[254,5143,5144],{"id":5147,"title":5148,"body":12056,"category":254,"cover":255,"description":5153,"extension":256,"meta":12175,"navigation":104,"path":5297,"pinned":259,"publishedAt":260,"seo":12176,"slug":5299,"stem":5300,"summary":5301,"tags":12177,"updatedAt":260,"visible":104,"__hash__":5305},{"type":7,"value":12057,"toc":12165},[12058,12060,12062,12064,12066,12070,12072,12074,12082,12084,12086,12118,12120,12125,12127,12129,12139,12141,12147,12149,12157,12159,12161,12163],[10,12059,5153],{},[14,12061,16],{"id":16},[10,12063,5158],{},[14,12065,22],{"id":22},[10,12067,12068],{},[26,12069],{"alt":5165,"src":5166},[10,12071,5169],{},[14,12073,43],{"id":43},[45,12075,12076,12078,12080],{},[48,12077,5176],{},[48,12079,5179],{},[48,12081,5182],{},[14,12083,66],{"id":66},[10,12085,69],{},[71,12087,12088],{"className":73,"code":5189,"language":75,"meta":76,"style":76},[33,12089,12090,12094,12098,12102,12106,12110,12114],{"__ignoreMap":76},[80,12091,12092],{"class":82,"line":83},[80,12093,5196],{},[80,12095,12096],{"class":82,"line":89},[80,12097,5201],{},[80,12099,12100],{"class":82,"line":95},[80,12101,5206],{},[80,12103,12104],{"class":82,"line":101},[80,12105,105],{"emptyLinePlaceholder":104},[80,12107,12108],{"class":82,"line":108},[80,12109,5215],{},[80,12111,12112],{"class":82,"line":114},[80,12113,5220],{},[80,12115,12116],{"class":82,"line":120},[80,12117,5225],{},[10,12119,138],{},[71,12121,12123],{"className":12122,"code":5231,"language":144,"meta":76},[142],[33,12124,5231],{"__ignoreMap":76},[10,12126,149],{},[14,12128,152],{"id":152},[154,12130,12131,12135],{},[48,12132,965,12133,5245],{},[33,12134,5244],{},[48,12136,5248,12137,5252],{},[33,12138,5251],{},[14,12140,194],{"id":194},[45,12142,12143,12145],{},[48,12144,5259],{},[48,12146,5262],{},[14,12148,211],{"id":211},[154,12150,12151,12155],{},[48,12152,5269,12153,5273],{},[33,12154,5272],{},[48,12156,5276],{},[10,12158,231],{},[14,12160,234],{"id":234},[10,12162,5283],{},[239,12164,241],{},{"title":76,"searchDepth":89,"depth":89,"links":12166},[12167,12168,12169,12170,12171,12172,12173,12174],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":5148,"description":5153},[254,5303,5304],{"id":5307,"title":5308,"body":12179,"category":254,"cover":255,"description":5313,"extension":256,"meta":12324,"navigation":104,"path":5494,"pinned":259,"publishedAt":260,"seo":12325,"slug":5496,"stem":5497,"summary":5498,"tags":12326,"updatedAt":260,"visible":104,"__hash__":5502},{"type":7,"value":12180,"toc":12312},[12181,12183,12185,12187,12189,12193,12197,12199,12211,12213,12215,12243,12245,12250,12252,12254,12268,12270,12272,12276,12284,12286,12296,12298,12304,12306,12308,12310],[10,12182,5313],{},[14,12184,16],{"id":16},[10,12186,5318],{},[14,12188,22],{"id":22},[10,12190,12191],{},[26,12192],{"alt":5325,"src":5326},[10,12194,5329,12195,5333],{},[33,12196,5332],{},[14,12198,43],{"id":43},[45,12200,12201,12203,12205],{},[48,12202,5340],{},[48,12204,5343],{},[48,12206,5346,12207,5349,12209,205],{},[33,12208,5332],{},[33,12210,5352],{},[14,12212,66],{"id":66},[10,12214,69],{},[71,12216,12217],{"className":73,"code":5359,"language":75,"meta":76,"style":76},[33,12218,12219,12223,12227,12231,12235,12239],{"__ignoreMap":76},[80,12220,12221],{"class":82,"line":83},[80,12222,5366],{},[80,12224,12225],{"class":82,"line":89},[80,12226,5371],{},[80,12228,12229],{"class":82,"line":95},[80,12230,5376],{},[80,12232,12233],{"class":82,"line":101},[80,12234,105],{"emptyLinePlaceholder":104},[80,12236,12237],{"class":82,"line":108},[80,12238,5385],{},[80,12240,12241],{"class":82,"line":114},[80,12242,5390],{},[10,12244,138],{},[71,12246,12248],{"className":12247,"code":5396,"language":144,"meta":76},[142],[33,12249,5396],{"__ignoreMap":76},[10,12251,149],{},[14,12253,152],{"id":152},[154,12255,12256,12262],{},[48,12257,5407,12258,2283,12260,5413],{},[33,12259,5410],{},[33,12261,4373],{},[48,12263,12264,5419,12266,5423],{},[33,12265,5418],{},[33,12267,5422],{},[177,12269,179],{"id":179},[10,12271,5428],{},[10,12273,12274],{},[26,12275],{"alt":5433,"src":5434},[10,12277,12278,2283,12280,226,12282,5444],{},[33,12279,5410],{},[33,12281,4373],{},[33,12283,5443],{},[14,12285,194],{"id":194},[45,12287,12288,12292],{},[48,12289,5451,12290,5455],{},[33,12291,5454],{},[48,12293,5458,12294,5461],{},[33,12295,5443],{},[14,12297,211],{"id":211},[154,12299,12300,12302],{},[48,12301,5468],{},[48,12303,5471],{},[10,12305,231],{},[14,12307,234],{"id":234},[10,12309,5478],{},[239,12311,241],{},{"title":76,"searchDepth":89,"depth":89,"links":12313},[12314,12315,12316,12317,12318,12321,12322,12323],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":12319},[12320],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":5308,"description":5313},[254,5500,5501],{"id":5504,"title":5505,"body":12328,"category":254,"cover":255,"description":5510,"extension":256,"meta":12477,"navigation":104,"path":5691,"pinned":259,"publishedAt":260,"seo":12478,"slug":5693,"stem":5694,"summary":5695,"tags":12479,"updatedAt":260,"visible":104,"__hash__":5699},{"type":7,"value":12329,"toc":12465},[12330,12332,12334,12336,12338,12342,12344,12346,12358,12360,12362,12406,12408,12413,12415,12417,12429,12431,12433,12437,12439,12441,12449,12451,12457,12459,12461,12463],[10,12331,5510],{},[14,12333,16],{"id":16},[10,12335,5515],{},[14,12337,22],{"id":22},[10,12339,12340],{},[26,12341],{"alt":5522,"src":5523},[10,12343,5526],{},[14,12345,43],{"id":43},[45,12347,12348,12350,12354],{},[48,12349,5533],{},[48,12351,12352,5539],{},[33,12353,5538],{},[48,12355,12356,5545],{},[33,12357,5544],{},[14,12359,66],{"id":66},[10,12361,69],{},[71,12363,12364],{"className":73,"code":5552,"language":75,"meta":76,"style":76},[33,12365,12366,12370,12374,12378,12382,12386,12390,12394,12398,12402],{"__ignoreMap":76},[80,12367,12368],{"class":82,"line":83},[80,12369,5559],{},[80,12371,12372],{"class":82,"line":89},[80,12373,5564],{},[80,12375,12376],{"class":82,"line":95},[80,12377,105],{"emptyLinePlaceholder":104},[80,12379,12380],{"class":82,"line":101},[80,12381,5573],{},[80,12383,12384],{"class":82,"line":108},[80,12385,5578],{},[80,12387,12388],{"class":82,"line":114},[80,12389,105],{"emptyLinePlaceholder":104},[80,12391,12392],{"class":82,"line":120},[80,12393,5587],{},[80,12395,12396],{"class":82,"line":126},[80,12397,5592],{},[80,12399,12400],{"class":82,"line":132},[80,12401,105],{"emptyLinePlaceholder":104},[80,12403,12404],{"class":82,"line":4136},[80,12405,5601],{},[10,12407,138],{},[71,12409,12411],{"className":12410,"code":5607,"language":144,"meta":76},[142],[33,12412,5607],{"__ignoreMap":76},[10,12414,149],{},[14,12416,152],{"id":152},[154,12418,12419,12423],{},[48,12420,5618,12421,5622],{},[33,12422,5621],{},[48,12424,12425,5628,12427,205],{},[33,12426,5627],{},[33,12428,5631],{},[177,12430,179],{"id":179},[10,12432,5636],{},[10,12434,12435],{},[26,12436],{"alt":5641,"src":5642},[10,12438,5645],{},[14,12440,194],{"id":194},[45,12442,12443,12447],{},[48,12444,5652,12445,5655],{},[33,12446,5352],{},[48,12448,5658],{},[14,12450,211],{"id":211},[154,12452,12453,12455],{},[48,12454,5665],{},[48,12456,5668],{},[10,12458,231],{},[14,12460,234],{"id":234},[10,12462,5675],{},[239,12464,241],{},{"title":76,"searchDepth":89,"depth":89,"links":12466},[12467,12468,12469,12470,12471,12474,12475,12476],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":12472},[12473],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":5505,"description":5510},[254,5697,5698],{"id":5701,"title":5702,"body":12481,"category":254,"cover":255,"description":5707,"extension":256,"meta":12642,"navigation":104,"path":5905,"pinned":259,"publishedAt":260,"seo":12643,"slug":5907,"stem":5908,"summary":5909,"tags":12644,"updatedAt":260,"visible":104,"__hash__":5913},{"type":7,"value":12482,"toc":12630},[12483,12485,12487,12489,12491,12495,12497,12499,12511,12513,12515,12567,12569,12574,12576,12578,12596,12598,12600,12604,12606,12608,12614,12616,12622,12624,12626,12628],[10,12484,5707],{},[14,12486,16],{"id":16},[10,12488,5712],{},[14,12490,22],{"id":22},[10,12492,12493],{},[26,12494],{"alt":5719,"src":5720},[10,12496,5723],{},[14,12498,43],{"id":43},[45,12500,12501,12503,12505],{},[48,12502,5730],{},[48,12504,5733],{},[48,12506,12507,2202,12509,5742],{},[33,12508,5738],{},[33,12510,5741],{},[14,12512,66],{"id":66},[10,12514,69],{},[71,12516,12517],{"className":73,"code":5749,"language":75,"meta":76,"style":76},[33,12518,12519,12523,12527,12531,12535,12539,12543,12547,12551,12555,12559,12563],{"__ignoreMap":76},[80,12520,12521],{"class":82,"line":83},[80,12522,5756],{},[80,12524,12525],{"class":82,"line":89},[80,12526,105],{"emptyLinePlaceholder":104},[80,12528,12529],{"class":82,"line":95},[80,12530,5765],{},[80,12532,12533],{"class":82,"line":101},[80,12534,5770],{},[80,12536,12537],{"class":82,"line":108},[80,12538,105],{"emptyLinePlaceholder":104},[80,12540,12541],{"class":82,"line":114},[80,12542,5779],{},[80,12544,12545],{"class":82,"line":120},[80,12546,5784],{},[80,12548,12549],{"class":82,"line":126},[80,12550,5789],{},[80,12552,12553],{"class":82,"line":132},[80,12554,105],{"emptyLinePlaceholder":104},[80,12556,12557],{"class":82,"line":4136},[80,12558,5798],{},[80,12560,12561],{"class":82,"line":5801},[80,12562,105],{"emptyLinePlaceholder":104},[80,12564,12565],{"class":82,"line":5806},[80,12566,5809],{},[10,12568,138],{},[71,12570,12572],{"className":12571,"code":5815,"language":144,"meta":76},[142],[33,12573,5815],{"__ignoreMap":76},[10,12575,149],{},[14,12577,152],{"id":152},[154,12579,12580,12590],{},[48,12581,12582,5829,12584,5833,12586,5836,12588,5840],{},[33,12583,5828],{},[33,12585,5832],{},[33,12587,5621],{},[33,12589,5839],{},[48,12591,12592,5845,12594,5848],{},[33,12593,4556],{},[33,12595,2234],{},[177,12597,179],{"id":179},[10,12599,5853],{},[10,12601,12602],{},[26,12603],{"alt":5858,"src":5859},[10,12605,5862],{},[14,12607,194],{"id":194},[45,12609,12610,12612],{},[48,12611,5869],{},[48,12613,5872],{},[14,12615,211],{"id":211},[154,12617,12618,12620],{},[48,12619,5879],{},[48,12621,5882],{},[10,12623,231],{},[14,12625,234],{"id":234},[10,12627,5889],{},[239,12629,241],{},{"title":76,"searchDepth":89,"depth":89,"links":12631},[12632,12633,12634,12635,12636,12639,12640,12641],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":12637},[12638],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":5702,"description":5707},[254,5911,5912],{"id":5915,"title":5916,"body":12646,"category":254,"cover":255,"description":5921,"extension":256,"meta":12769,"navigation":104,"path":6072,"pinned":259,"publishedAt":260,"seo":12770,"slug":6074,"stem":6075,"summary":6076,"tags":12771,"updatedAt":260,"visible":104,"__hash__":6080},{"type":7,"value":12647,"toc":12759},[12648,12650,12652,12654,12656,12660,12662,12664,12678,12680,12682,12710,12712,12717,12719,12721,12731,12733,12741,12743,12751,12753,12755,12757],[10,12649,5921],{},[14,12651,16],{"id":16},[10,12653,5926],{},[14,12655,22],{"id":22},[10,12657,12658],{},[26,12659],{"alt":5933,"src":5934},[10,12661,5937],{},[14,12663,43],{"id":43},[45,12665,12666,12668,12670],{},[48,12667,5944],{},[48,12669,5947],{},[48,12671,5950,12672,2283,12674,2283,12676,5958],{},[33,12673,2286],{},[33,12675,2451],{},[33,12677,5957],{},[14,12679,66],{"id":66},[10,12681,69],{},[71,12683,12684],{"className":73,"code":5965,"language":75,"meta":76,"style":76},[33,12685,12686,12690,12694,12698,12702,12706],{"__ignoreMap":76},[80,12687,12688],{"class":82,"line":83},[80,12689,5972],{},[80,12691,12692],{"class":82,"line":89},[80,12693,5977],{},[80,12695,12696],{"class":82,"line":95},[80,12697,5982],{},[80,12699,12700],{"class":82,"line":101},[80,12701,105],{"emptyLinePlaceholder":104},[80,12703,12704],{"class":82,"line":108},[80,12705,5991],{},[80,12707,12708],{"class":82,"line":114},[80,12709,5996],{},[10,12711,138],{},[71,12713,12715],{"className":12714,"code":6002,"language":144,"meta":76},[142],[33,12716,6002],{"__ignoreMap":76},[10,12718,149],{},[14,12720,152],{"id":152},[154,12722,12723,12729],{},[48,12724,6013,12725,6017,12727,6020],{},[33,12726,6016],{},[33,12728,2272],{},[48,12730,6023],{},[14,12732,194],{"id":194},[45,12734,12735,12739],{},[48,12736,6030,12737,6034],{},[33,12738,6033],{},[48,12740,6037],{},[14,12742,211],{"id":211},[154,12744,12745,12747],{},[48,12746,6044],{},[48,12748,6047,12749,6051],{},[33,12750,6050],{},[10,12752,231],{},[14,12754,234],{"id":234},[10,12756,6058],{},[239,12758,241],{},{"title":76,"searchDepth":89,"depth":89,"links":12760},[12761,12762,12763,12764,12765,12766,12767,12768],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":5916,"description":5921},[254,6078,6079],{"id":6082,"title":6083,"body":12773,"category":254,"cover":255,"description":6088,"extension":256,"meta":12950,"navigation":104,"path":6316,"pinned":259,"publishedAt":260,"seo":12951,"slug":6318,"stem":6319,"summary":6320,"tags":12952,"updatedAt":260,"visible":104,"__hash__":6324},{"type":7,"value":12774,"toc":12938},[12775,12777,12779,12783,12785,12789,12795,12797,12809,12811,12815,12839,12843,12859,12865,12867,12872,12874,12876,12892,12894,12896,12900,12904,12906,12918,12920,12930,12932,12934,12936],[10,12776,6088],{},[14,12778,16],{"id":16},[10,12780,6093,12781,6096],{},[323,12782,6016],{},[14,12784,22],{"id":22},[10,12786,12787],{},[26,12788],{"alt":6103,"src":6104},[10,12790,6107,12791,6111,12793,6115],{},[33,12792,6110],{},[33,12794,6114],{},[14,12796,43],{"id":43},[45,12798,12799,12803,12805],{},[48,12800,6122,12801,6125],{},[33,12802,1197],{},[48,12804,6128],{},[48,12806,6131,12807,6135],{},[33,12808,6134],{},[14,12810,66],{"id":66},[10,12812,6140,12813,6144],{},[33,12814,6143],{},[71,12816,12817],{"className":73,"code":6147,"language":75,"meta":76,"style":76},[33,12818,12819,12823,12827,12831,12835],{"__ignoreMap":76},[80,12820,12821],{"class":82,"line":83},[80,12822,6154],{},[80,12824,12825],{"class":82,"line":89},[80,12826,6159],{},[80,12828,12829],{"class":82,"line":95},[80,12830,105],{"emptyLinePlaceholder":104},[80,12832,12833],{"class":82,"line":101},[80,12834,6168],{},[80,12836,12837],{"class":82,"line":108},[80,12838,6173],{},[10,12840,6176,12841,6180],{},[33,12842,6179],{},[71,12844,12845],{"className":73,"code":6183,"language":75,"meta":76,"style":76},[33,12846,12847,12851,12855],{"__ignoreMap":76},[80,12848,12849],{"class":82,"line":83},[80,12850,6190],{},[80,12852,12853],{"class":82,"line":89},[80,12854,105],{"emptyLinePlaceholder":104},[80,12856,12857],{"class":82,"line":95},[80,12858,6199],{},[10,12860,6202,12861,226,12863,205],{},[33,12862,6205],{},[33,12864,6208],{},[10,12866,138],{},[71,12868,12870],{"className":12869,"code":6214,"language":144,"meta":76},[142],[33,12871,6214],{"__ignoreMap":76},[10,12873,149],{},[14,12875,152],{"id":152},[154,12877,12878,12884],{},[48,12879,6225,12880,6228,12882,6232],{},[33,12881,6143],{},[33,12883,6231],{},[48,12885,12886,6237,12888,6240,12890,6243],{},[33,12887,6179],{},[33,12889,6143],{},[33,12891,6179],{},[177,12893,179],{"id":179},[10,12895,6248],{},[10,12897,12898],{},[26,12899],{"alt":6253,"src":6254},[10,12901,6257,12902,6260],{},[33,12903,6231],{},[14,12905,194],{"id":194},[45,12907,12908,12914],{},[48,12909,6267,12910,226,12912,205],{},[33,12911,6143],{},[33,12913,6179],{},[48,12915,6274,12916,6278],{},[33,12917,6277],{},[14,12919,211],{"id":211},[154,12921,12922,12926],{},[48,12923,2379,12924,6288],{},[33,12925,6287],{},[48,12927,6291,12928,205],{},[33,12929,6110],{},[10,12931,231],{},[14,12933,234],{"id":234},[10,12935,6300],{},[239,12937,241],{},{"title":76,"searchDepth":89,"depth":89,"links":12939},[12940,12941,12942,12943,12944,12947,12948,12949],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":12945},[12946],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":6083,"description":6088},[254,6322,6323],{"id":6326,"title":6327,"body":12954,"category":254,"cover":255,"description":6332,"extension":256,"meta":13093,"navigation":104,"path":6498,"pinned":259,"publishedAt":260,"seo":13094,"slug":6500,"stem":6501,"summary":6502,"tags":13095,"updatedAt":260,"visible":104,"__hash__":6505},{"type":7,"value":12955,"toc":13083},[12956,12958,12960,12962,12964,12968,12970,12972,12982,12984,12986,13026,13028,13033,13035,13037,13055,13057,13065,13067,13075,13077,13079,13081],[10,12957,6332],{},[14,12959,16],{"id":16},[10,12961,6337],{},[14,12963,22],{"id":22},[10,12965,12966],{},[26,12967],{"alt":6344,"src":6345},[10,12969,6348],{},[14,12971,43],{"id":43},[45,12973,12974,12978,12980],{},[48,12975,12976,6358],{},[33,12977,6357],{},[48,12979,6361],{},[48,12981,6364],{},[14,12983,66],{"id":66},[10,12985,1600],{},[71,12987,12988],{"className":618,"code":6371,"language":620,"meta":76,"style":76},[33,12989,12990,13000,13006,13012,13022],{"__ignoreMap":76},[80,12991,12992,12994,12996,12998],{"class":82,"line":83},[80,12993,718],{"class":627},[80,12995,660],{"class":630},[80,12997,6382],{"class":663},[80,12999,6385],{"class":663},[80,13001,13002,13004],{"class":82,"line":89},[80,13003,6390],{"class":630},[80,13005,6393],{"class":663},[80,13007,13008,13010],{"class":82,"line":95},[80,13009,75],{"class":627},[80,13011,631],{"class":630},[80,13013,13014,13016,13018,13020],{"class":82,"line":101},[80,13015,75],{"class":627},[80,13017,660],{"class":630},[80,13019,664],{"class":663},[80,13021,631],{"class":630},[80,13023,13024],{"class":82,"line":108},[80,13025,6414],{"class":627},[10,13027,138],{},[71,13029,13031],{"className":13030,"code":6420,"language":144,"meta":76},[142],[33,13032,6420],{"__ignoreMap":76},[10,13034,149],{},[14,13036,152],{"id":152},[154,13038,13039,13045],{},[48,13040,13041,6434,13043,6437],{},[33,13042,6433],{},[33,13044,718],{},[48,13046,6440,13047,2202,13049,6446,13051,3751,13053,6452],{},[33,13048,75],{},[33,13050,6445],{},[33,13052,6357],{},[33,13054,6451],{},[14,13056,194],{"id":194},[45,13058,13059,13061],{},[48,13060,6459],{},[48,13062,3490,13063,6464],{},[33,13064,6357],{},[14,13066,211],{"id":211},[154,13068,13069,13073],{},[48,13070,6471,13071,205],{},[33,13072,6474],{},[48,13074,6477],{},[10,13076,231],{},[14,13078,234],{"id":234},[10,13080,6484],{},[239,13082,1684],{},{"title":76,"searchDepth":89,"depth":89,"links":13084},[13085,13086,13087,13088,13089,13090,13091,13092],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":6327,"description":6332},[254,6504,289],{"id":6507,"title":6508,"body":13097,"category":254,"cover":255,"description":6513,"extension":256,"meta":13250,"navigation":104,"path":6702,"pinned":259,"publishedAt":260,"seo":13251,"slug":6704,"stem":6705,"summary":6706,"tags":13252,"updatedAt":260,"visible":104,"__hash__":6710},{"type":7,"value":13098,"toc":13240},[13099,13101,13103,13105,13107,13111,13117,13119,13135,13137,13139,13183,13185,13190,13192,13194,13206,13208,13222,13224,13232,13234,13236,13238],[10,13100,6513],{},[14,13102,16],{"id":16},[10,13104,6518],{},[14,13106,22],{"id":22},[10,13108,13109],{},[26,13110],{"alt":6525,"src":6526},[10,13112,13113,6532,13115,6535],{},[33,13114,6531],{},[33,13116,2461],{},[14,13118,43],{"id":43},[45,13120,13121,13123,13131],{},[48,13122,6542],{},[48,13124,13125,2283,13127,2283,13129,6554],{},[33,13126,6547],{},[33,13128,6550],{},[33,13130,6553],{},[48,13132,6557,13133,6561],{},[33,13134,6560],{},[14,13136,66],{"id":66},[10,13138,69],{},[71,13140,13141],{"className":73,"code":6568,"language":75,"meta":76,"style":76},[33,13142,13143,13147,13151,13155,13159,13163,13167,13171,13175,13179],{"__ignoreMap":76},[80,13144,13145],{"class":82,"line":83},[80,13146,6575],{},[80,13148,13149],{"class":82,"line":89},[80,13150,105],{"emptyLinePlaceholder":104},[80,13152,13153],{"class":82,"line":95},[80,13154,6584],{},[80,13156,13157],{"class":82,"line":101},[80,13158,6589],{},[80,13160,13161],{"class":82,"line":108},[80,13162,6594],{},[80,13164,13165],{"class":82,"line":114},[80,13166,105],{"emptyLinePlaceholder":104},[80,13168,13169],{"class":82,"line":120},[80,13170,6603],{},[80,13172,13173],{"class":82,"line":126},[80,13174,6608],{},[80,13176,13177],{"class":82,"line":132},[80,13178,6613],{},[80,13180,13181],{"class":82,"line":4136},[80,13182,6618],{},[10,13184,138],{},[71,13186,13188],{"className":13187,"code":6624,"language":144,"meta":76},[142],[33,13189,6624],{"__ignoreMap":76},[10,13191,149],{},[14,13193,152],{"id":152},[154,13195,13196,13200],{},[48,13197,13198,6638],{},[33,13199,6637],{},[48,13201,219,13202,6643,13204,6646],{},[33,13203,2461],{},[33,13205,6531],{},[14,13207,194],{"id":194},[45,13209,13210,13216],{},[48,13211,3490,13212,6655,13214,6658],{},[33,13213,6531],{},[33,13215,6547],{},[48,13217,6661,13218,1036,13220,6667],{},[33,13219,2461],{},[33,13221,6666],{},[14,13223,211],{"id":211},[154,13225,13226,13230],{},[48,13227,6674,13228,6678],{},[33,13229,6677],{},[48,13231,6681],{},[10,13233,231],{},[14,13235,234],{"id":234},[10,13237,6688],{},[239,13239,241],{},{"title":76,"searchDepth":89,"depth":89,"links":13241},[13242,13243,13244,13245,13246,13247,13248,13249],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":6508,"description":6513},[254,6708,6709],{"id":6712,"title":6713,"body":13254,"category":254,"cover":255,"description":6718,"extension":256,"meta":13401,"navigation":104,"path":6897,"pinned":259,"publishedAt":260,"seo":13402,"slug":6899,"stem":6900,"summary":6901,"tags":13403,"updatedAt":260,"visible":104,"__hash__":6905},{"type":7,"value":13255,"toc":13391},[13256,13258,13260,13262,13264,13268,13270,13272,13290,13292,13294,13342,13344,13349,13351,13353,13361,13363,13373,13375,13383,13385,13387,13389],[10,13257,6718],{},[14,13259,16],{"id":16},[10,13261,6723],{},[14,13263,22],{"id":22},[10,13265,13266],{},[26,13267],{"alt":6730,"src":6731},[10,13269,6734],{},[14,13271,43],{"id":43},[45,13273,13274,13278,13284],{},[48,13275,13276,6744],{},[33,13277,6743],{},[48,13279,13280,6750,13282,205],{},[33,13281,6749],{},[33,13283,6753],{},[48,13285,6756,13286,6760,13288,6764],{},[33,13287,6759],{},[33,13289,6763],{},[14,13291,66],{"id":66},[10,13293,69],{},[71,13295,13296],{"className":73,"code":6771,"language":75,"meta":76,"style":76},[33,13297,13298,13302,13306,13310,13314,13318,13322,13326,13330,13334,13338],{"__ignoreMap":76},[80,13299,13300],{"class":82,"line":83},[80,13301,6575],{},[80,13303,13304],{"class":82,"line":89},[80,13305,105],{"emptyLinePlaceholder":104},[80,13307,13308],{"class":82,"line":95},[80,13309,6786],{},[80,13311,13312],{"class":82,"line":101},[80,13313,6791],{},[80,13315,13316],{"class":82,"line":108},[80,13317,6796],{},[80,13319,13320],{"class":82,"line":114},[80,13321,6801],{},[80,13323,13324],{"class":82,"line":120},[80,13325,105],{"emptyLinePlaceholder":104},[80,13327,13328],{"class":82,"line":126},[80,13329,6810],{},[80,13331,13332],{"class":82,"line":132},[80,13333,6815],{},[80,13335,13336],{"class":82,"line":4136},[80,13337,6820],{},[80,13339,13340],{"class":82,"line":5801},[80,13341,6825],{},[10,13343,138],{},[71,13345,13347],{"className":13346,"code":6831,"language":144,"meta":76},[142],[33,13348,6831],{"__ignoreMap":76},[10,13350,149],{},[14,13352,152],{"id":152},[154,13354,13355,13359],{},[48,13356,6842,13357,6845],{},[33,13358,6759],{},[48,13360,6848],{},[14,13362,194],{"id":194},[45,13364,13365,13369],{},[48,13366,219,13367,6857],{},[33,13368,6743],{},[48,13370,6860,13371,205],{},[33,13372,6863],{},[14,13374,211],{"id":211},[154,13376,13377,13379],{},[48,13378,6870],{},[48,13380,6873,13381,6876],{},[33,13382,364],{},[10,13384,231],{},[14,13386,234],{"id":234},[10,13388,6883],{},[239,13390,241],{},{"title":76,"searchDepth":89,"depth":89,"links":13392},[13393,13394,13395,13396,13397,13398,13399,13400],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":6713,"description":6718},[254,6903,6904],{"id":6907,"title":6908,"body":13405,"category":254,"cover":255,"description":6913,"extension":256,"meta":13548,"navigation":104,"path":7081,"pinned":259,"publishedAt":260,"seo":13549,"slug":7083,"stem":7084,"summary":7085,"tags":13550,"updatedAt":260,"visible":104,"__hash__":7089},{"type":7,"value":13406,"toc":13538},[13407,13409,13411,13413,13415,13419,13425,13427,13437,13439,13441,13493,13495,13500,13502,13504,13514,13516,13522,13524,13530,13532,13534,13536],[10,13408,6913],{},[14,13410,16],{"id":16},[10,13412,6918],{},[14,13414,22],{"id":22},[10,13416,13417],{},[26,13418],{"alt":6925,"src":6926},[10,13420,13421,6932,13423,6936],{},[33,13422,6931],{},[33,13424,6935],{},[14,13426,43],{"id":43},[45,13428,13429,13431,13435],{},[48,13430,6943],{},[48,13432,13433,6949],{},[33,13434,6948],{},[48,13436,6952],{},[14,13438,66],{"id":66},[10,13440,69],{},[71,13442,13443],{"className":73,"code":6959,"language":75,"meta":76,"style":76},[33,13444,13445,13449,13453,13457,13461,13465,13469,13473,13477,13481,13485,13489],{"__ignoreMap":76},[80,13446,13447],{"class":82,"line":83},[80,13448,6966],{},[80,13450,13451],{"class":82,"line":89},[80,13452,105],{"emptyLinePlaceholder":104},[80,13454,13455],{"class":82,"line":95},[80,13456,6975],{},[80,13458,13459],{"class":82,"line":101},[80,13460,105],{"emptyLinePlaceholder":104},[80,13462,13463],{"class":82,"line":108},[80,13464,6984],{},[80,13466,13467],{"class":82,"line":114},[80,13468,6989],{},[80,13470,13471],{"class":82,"line":120},[80,13472,6801],{},[80,13474,13475],{"class":82,"line":126},[80,13476,105],{"emptyLinePlaceholder":104},[80,13478,13479],{"class":82,"line":132},[80,13480,7002],{},[80,13482,13483],{"class":82,"line":4136},[80,13484,7007],{},[80,13486,13487],{"class":82,"line":5801},[80,13488,6820],{},[80,13490,13491],{"class":82,"line":5806},[80,13492,7016],{},[10,13494,138],{},[71,13496,13498],{"className":13497,"code":7022,"language":144,"meta":76},[142],[33,13499,7022],{"__ignoreMap":76},[10,13501,149],{},[14,13503,152],{"id":152},[154,13505,13506,13510],{},[48,13507,13508,7035],{},[33,13509,6931],{},[48,13511,13512,7040],{},[33,13513,6935],{},[14,13515,194],{"id":194},[45,13517,13518,13520],{},[48,13519,7047],{},[48,13521,7050],{},[14,13523,211],{"id":211},[154,13525,13526,13528],{},[48,13527,7057],{},[48,13529,7060],{},[10,13531,231],{},[14,13533,234],{"id":234},[10,13535,7067],{},[239,13537,241],{},{"title":76,"searchDepth":89,"depth":89,"links":13539},[13540,13541,13542,13543,13544,13545,13546,13547],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":6908,"description":6913},[254,7087,7088],{"id":7091,"title":7092,"body":13552,"category":254,"cover":255,"description":7097,"extension":256,"meta":13703,"navigation":104,"path":7282,"pinned":259,"publishedAt":260,"seo":13704,"slug":7284,"stem":7285,"summary":7286,"tags":13705,"updatedAt":260,"visible":104,"__hash__":7290},{"type":7,"value":13553,"toc":13693},[13554,13556,13558,13560,13562,13566,13570,13572,13586,13588,13590,13642,13644,13649,13651,13653,13665,13667,13677,13679,13685,13687,13689,13691],[10,13555,7097],{},[14,13557,16],{"id":16},[10,13559,7102],{},[14,13561,22],{"id":22},[10,13563,13564],{},[26,13565],{"alt":7109,"src":7110},[10,13567,13568,7116],{},[33,13569,7115],{},[14,13571,43],{"id":43},[45,13573,13574,13580,13584],{},[48,13575,219,13576,7126,13578,7130],{},[33,13577,7125],{},[33,13579,7129],{},[48,13581,7133,13582,7137],{},[33,13583,7136],{},[48,13585,7140],{},[14,13587,66],{"id":66},[10,13589,69],{},[71,13591,13592],{"className":73,"code":7147,"language":75,"meta":76,"style":76},[33,13593,13594,13598,13602,13606,13610,13614,13618,13622,13626,13630,13634,13638],{"__ignoreMap":76},[80,13595,13596],{"class":82,"line":83},[80,13597,7154],{},[80,13599,13600],{"class":82,"line":89},[80,13601,105],{"emptyLinePlaceholder":104},[80,13603,13604],{"class":82,"line":95},[80,13605,7163],{},[80,13607,13608],{"class":82,"line":101},[80,13609,7168],{},[80,13611,13612],{"class":82,"line":108},[80,13613,7173],{},[80,13615,13616],{"class":82,"line":114},[80,13617,7178],{},[80,13619,13620],{"class":82,"line":120},[80,13621,7183],{},[80,13623,13624],{"class":82,"line":126},[80,13625,105],{"emptyLinePlaceholder":104},[80,13627,13628],{"class":82,"line":132},[80,13629,7192],{},[80,13631,13632],{"class":82,"line":4136},[80,13633,7197],{},[80,13635,13636],{"class":82,"line":5801},[80,13637,7202],{},[80,13639,13640],{"class":82,"line":5806},[80,13641,7207],{},[10,13643,138],{},[71,13645,13647],{"className":13646,"code":7213,"language":144,"meta":76},[142],[33,13648,7213],{"__ignoreMap":76},[10,13650,149],{},[14,13652,152],{"id":152},[154,13654,13655,13661],{},[48,13656,13657,7227,13659,7230],{},[33,13658,7226],{},[33,13660,7136],{},[48,13662,13663,7235],{},[33,13664,7115],{},[14,13666,194],{"id":194},[45,13668,13669,13671],{},[48,13670,7242],{},[48,13672,7245,13673,7248,13675,7251],{},[33,13674,7125],{},[33,13676,7129],{},[14,13678,211],{"id":211},[154,13680,13681,13683],{},[48,13682,7258],{},[48,13684,7261],{},[10,13686,231],{},[14,13688,234],{"id":234},[10,13690,7268],{},[239,13692,241],{},{"title":76,"searchDepth":89,"depth":89,"links":13694},[13695,13696,13697,13698,13699,13700,13701,13702],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":7092,"description":7097},[254,7288,7289],{"id":7292,"title":7293,"body":13707,"category":254,"cover":255,"description":7298,"extension":256,"meta":13921,"navigation":104,"path":7572,"pinned":259,"publishedAt":260,"seo":13922,"slug":7574,"stem":7575,"summary":7576,"tags":13923,"updatedAt":260,"visible":104,"__hash__":7580},{"type":7,"value":13708,"toc":13908},[13709,13711,13713,13715,13717,13721,13727,13729,13741,13743,13745,13805,13807,13812,13814,13816,13834,13836,13844,13848,13856,13858,13862,13866,13872,13874,13884,13886,13900,13902,13904,13906],[10,13710,7298],{},[14,13712,16],{"id":16},[10,13714,7303],{},[14,13716,22],{"id":22},[10,13718,13719],{},[26,13720],{"alt":7310,"src":7311},[10,13722,7314,13723,7318,13725,7322],{},[33,13724,7317],{},[33,13726,7321],{},[14,13728,43],{"id":43},[45,13730,13731,13735,13739],{},[48,13732,7329,13733,7332],{},[33,13734,7317],{},[48,13736,13737,7338],{},[33,13738,7337],{},[48,13740,7341],{},[14,13742,66],{"id":66},[10,13744,69],{},[71,13746,13747],{"className":73,"code":7348,"language":75,"meta":76,"style":76},[33,13748,13749,13753,13757,13761,13765,13769,13773,13777,13781,13785,13789,13793,13797,13801],{"__ignoreMap":76},[80,13750,13751],{"class":82,"line":83},[80,13752,7355],{},[80,13754,13755],{"class":82,"line":89},[80,13756,7360],{},[80,13758,13759],{"class":82,"line":95},[80,13760,7365],{},[80,13762,13763],{"class":82,"line":101},[80,13764,7370],{},[80,13766,13767],{"class":82,"line":108},[80,13768,7375],{},[80,13770,13771],{"class":82,"line":114},[80,13772,105],{"emptyLinePlaceholder":104},[80,13774,13775],{"class":82,"line":120},[80,13776,7384],{},[80,13778,13779],{"class":82,"line":126},[80,13780,7389],{},[80,13782,13783],{"class":82,"line":132},[80,13784,7394],{},[80,13786,13787],{"class":82,"line":4136},[80,13788,7399],{},[80,13790,13791],{"class":82,"line":5801},[80,13792,1173],{},[80,13794,13795],{"class":82,"line":5806},[80,13796,7408],{},[80,13798,13799],{"class":82,"line":7411},[80,13800,7414],{},[80,13802,13803],{"class":82,"line":7417},[80,13804,7420],{},[10,13806,138],{},[71,13808,13810],{"className":13809,"code":7426,"language":144,"meta":76},[142],[33,13811,7426],{"__ignoreMap":76},[10,13813,149],{},[14,13815,152],{"id":152},[154,13817,13818,13826],{},[48,13819,13820,7439,13822,7442,13824,7446],{},[33,13821,3059],{},[33,13823,7337],{},[33,13825,7445],{},[48,13827,7449,13828,7452,13830,7455,13832,205],{},[33,13829,7317],{},[33,13831,1186],{},[33,13833,7321],{},[177,13835,179],{"id":179},[10,13837,13838,2283,13840,226,13842,7468],{},[33,13839,7317],{},[33,13841,1186],{},[33,13843,7321],{},[10,13845,13846],{},[26,13847],{"alt":7473,"src":7474},[10,13849,13850,7479,13852,7482,13854,7485],{},[33,13851,7317],{},[33,13853,1186],{},[33,13855,7321],{},[177,13857,179],{"id":4191},[10,13859,13860,7493],{},[33,13861,7492],{},[10,13863,13864],{},[26,13865],{"alt":7498,"src":7499},[10,13867,7502,13868,7505,13870,7508],{},[33,13869,7492],{},[33,13871,1186],{},[14,13873,194],{"id":194},[45,13875,13876,13880],{},[48,13877,7515,13878,7519],{},[33,13879,7518],{},[48,13881,7522,13882,7525],{},[33,13883,7492],{},[14,13885,211],{"id":211},[154,13887,13888,13896],{},[48,13889,7532,13890,7536,13892,226,13894,205],{},[33,13891,7535],{},[33,13893,7539],{},[33,13895,7542],{},[48,13897,7545,13898,7548],{},[33,13899,6753],{},[10,13901,231],{},[14,13903,234],{"id":234},[10,13905,7555],{},[239,13907,241],{},{"title":76,"searchDepth":89,"depth":89,"links":13909},[13910,13911,13912,13913,13914,13918,13919,13920],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":13915},[13916,13917],{"id":179,"depth":95,"text":179},{"id":4191,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":7293,"description":7298},[254,7578,7579],{"id":7582,"title":7583,"body":13925,"category":254,"cover":255,"description":7588,"extension":256,"meta":14076,"navigation":104,"path":7765,"pinned":259,"publishedAt":260,"seo":14077,"slug":7767,"stem":7768,"summary":7769,"tags":14078,"updatedAt":260,"visible":104,"__hash__":7772},{"type":7,"value":13926,"toc":14066},[13927,13929,13931,13933,13935,13939,13943,13945,13957,13959,13961,14009,14011,14016,14018,14020,14030,14032,14042,14044,14058,14060,14062,14064],[10,13928,7588],{},[14,13930,16],{"id":16},[10,13932,7593],{},[14,13934,22],{"id":22},[10,13936,13937],{},[26,13938],{"alt":7600,"src":7601},[10,13940,7604,13941,7607],{},[33,13942,6763],{},[14,13944,43],{"id":43},[45,13946,13947,13951,13955],{},[48,13948,13949,7616],{},[33,13950,6763],{},[48,13952,13953,7622],{},[33,13954,7621],{},[48,13956,7625],{},[14,13958,66],{"id":66},[10,13960,69],{},[71,13962,13963],{"className":73,"code":7632,"language":75,"meta":76,"style":76},[33,13964,13965,13969,13973,13977,13981,13985,13989,13993,13997,14001,14005],{"__ignoreMap":76},[80,13966,13967],{"class":82,"line":83},[80,13968,6575],{},[80,13970,13971],{"class":82,"line":89},[80,13972,105],{"emptyLinePlaceholder":104},[80,13974,13975],{"class":82,"line":95},[80,13976,6786],{},[80,13978,13979],{"class":82,"line":101},[80,13980,105],{"emptyLinePlaceholder":104},[80,13982,13983],{"class":82,"line":108},[80,13984,7655],{},[80,13986,13987],{"class":82,"line":114},[80,13988,7660],{},[80,13990,13991],{"class":82,"line":120},[80,13992,105],{"emptyLinePlaceholder":104},[80,13994,13995],{"class":82,"line":126},[80,13996,7669],{},[80,13998,13999],{"class":82,"line":132},[80,14000,7674],{},[80,14002,14003],{"class":82,"line":4136},[80,14004,105],{"emptyLinePlaceholder":104},[80,14006,14007],{"class":82,"line":5801},[80,14008,7683],{},[10,14010,138],{},[71,14012,14014],{"className":14013,"code":7689,"language":144,"meta":76},[142],[33,14015,7689],{"__ignoreMap":76},[10,14017,149],{},[14,14019,152],{"id":152},[154,14021,14022,14028],{},[48,14023,7604,14024,7702,14026,205],{},[33,14025,6763],{},[33,14027,7705],{},[48,14029,7708],{},[14,14031,194],{"id":194},[45,14033,14034,14038],{},[48,14035,4759,14036,7717],{},[33,14037,6763],{},[48,14039,7720,14040,7723],{},[33,14041,6763],{},[14,14043,211],{"id":211},[154,14045,14046,14052],{},[48,14047,7730,14048,7734,14050,205],{},[33,14049,7733],{},[33,14051,6763],{},[48,14053,4759,14054,7741,14056,205],{},[33,14055,6763],{},[33,14057,7744],{},[10,14059,231],{},[14,14061,234],{"id":234},[10,14063,7751],{},[239,14065,241],{},{"title":76,"searchDepth":89,"depth":89,"links":14067},[14068,14069,14070,14071,14072,14073,14074,14075],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":7583,"description":7588},[254,6763,7771],{"id":7774,"title":7775,"body":14080,"category":254,"cover":255,"description":7780,"extension":256,"meta":14251,"navigation":104,"path":7993,"pinned":259,"publishedAt":260,"seo":14252,"slug":7995,"stem":7996,"summary":7997,"tags":14253,"updatedAt":260,"visible":104,"__hash__":8001},{"type":7,"value":14081,"toc":14239},[14082,14084,14086,14088,14090,14094,14096,14098,14110,14112,14114,14170,14172,14177,14179,14181,14197,14199,14201,14205,14211,14213,14221,14223,14231,14233,14235,14237],[10,14083,7780],{},[14,14085,16],{"id":16},[10,14087,7785],{},[14,14089,22],{"id":22},[10,14091,14092],{},[26,14093],{"alt":7792,"src":7793},[10,14095,7796],{},[14,14097,43],{"id":43},[45,14099,14100,14104,14108],{},[48,14101,14102,7806],{},[33,14103,7805],{},[48,14105,14106,7812],{},[33,14107,7811],{},[48,14109,7815],{},[14,14111,66],{"id":66},[10,14113,69],{},[71,14115,14116],{"className":73,"code":7822,"language":75,"meta":76,"style":76},[33,14117,14118,14122,14126,14130,14134,14138,14142,14146,14150,14154,14158,14162,14166],{"__ignoreMap":76},[80,14119,14120],{"class":82,"line":83},[80,14121,7829],{},[80,14123,14124],{"class":82,"line":89},[80,14125,7834],{},[80,14127,14128],{"class":82,"line":95},[80,14129,7839],{},[80,14131,14132],{"class":82,"line":101},[80,14133,7844],{},[80,14135,14136],{"class":82,"line":108},[80,14137,105],{"emptyLinePlaceholder":104},[80,14139,14140],{"class":82,"line":114},[80,14141,7853],{},[80,14143,14144],{"class":82,"line":120},[80,14145,7858],{},[80,14147,14148],{"class":82,"line":126},[80,14149,7863],{},[80,14151,14152],{"class":82,"line":132},[80,14153,7868],{},[80,14155,14156],{"class":82,"line":4136},[80,14157,105],{"emptyLinePlaceholder":104},[80,14159,14160],{"class":82,"line":5801},[80,14161,7877],{},[80,14163,14164],{"class":82,"line":5806},[80,14165,7882],{},[80,14167,14168],{"class":82,"line":7411},[80,14169,7887],{},[10,14171,138],{},[71,14173,14175],{"className":14174,"code":7893,"language":144,"meta":76},[142],[33,14176,7893],{"__ignoreMap":76},[10,14178,149],{},[14,14180,152],{"id":152},[154,14182,14183,14189],{},[48,14184,7904,14185,7908,14187,7911],{},[33,14186,7907],{},[33,14188,7811],{},[48,14190,14191,7917,14193,7921,14195,7924],{},[33,14192,7916],{},[33,14194,7920],{},[33,14196,7805],{},[177,14198,179],{"id":179},[10,14200,7929],{},[10,14202,14203],{},[26,14204],{"alt":7934,"src":7935},[10,14206,7938,14207,226,14209,7944],{},[33,14208,4556],{},[33,14210,7943],{},[14,14212,194],{"id":194},[45,14214,14215,14219],{},[48,14216,7951,14217,7954],{},[33,14218,7805],{},[48,14220,7957],{},[14,14222,211],{"id":211},[154,14224,14225,14229],{},[48,14226,5269,14227,7967],{},[33,14228,7966],{},[48,14230,7970],{},[10,14232,231],{},[14,14234,234],{"id":234},[10,14236,7977],{},[239,14238,241],{},{"title":76,"searchDepth":89,"depth":89,"links":14240},[14241,14242,14243,14244,14245,14248,14249,14250],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":14246},[14247],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":7775,"description":7780},[254,7999,8000],{"id":8003,"title":8004,"body":14255,"category":254,"cover":255,"description":8009,"extension":256,"meta":14402,"navigation":104,"path":8188,"pinned":259,"publishedAt":260,"seo":14403,"slug":8190,"stem":8191,"summary":8192,"tags":14404,"updatedAt":260,"visible":104,"__hash__":8196},{"type":7,"value":14256,"toc":14392},[14257,14259,14261,14263,14265,14269,14271,14273,14281,14283,14285,14341,14343,14348,14350,14352,14364,14366,14372,14374,14384,14386,14388,14390],[10,14258,8009],{},[14,14260,16],{"id":16},[10,14262,8014],{},[14,14264,22],{"id":22},[10,14266,14267],{},[26,14268],{"alt":8021,"src":8022},[10,14270,8025],{},[14,14272,43],{"id":43},[45,14274,14275,14277,14279],{},[48,14276,8032],{},[48,14278,8035],{},[48,14280,8038],{},[14,14282,66],{"id":66},[10,14284,69],{},[71,14286,14287],{"className":73,"code":8045,"language":75,"meta":76,"style":76},[33,14288,14289,14293,14297,14301,14305,14309,14313,14317,14321,14325,14329,14333,14337],{"__ignoreMap":76},[80,14290,14291],{"class":82,"line":83},[80,14292,8052],{},[80,14294,14295],{"class":82,"line":89},[80,14296,8057],{},[80,14298,14299],{"class":82,"line":95},[80,14300,8062],{},[80,14302,14303],{"class":82,"line":101},[80,14304,105],{"emptyLinePlaceholder":104},[80,14306,14307],{"class":82,"line":108},[80,14308,8071],{},[80,14310,14311],{"class":82,"line":114},[80,14312,8076],{},[80,14314,14315],{"class":82,"line":120},[80,14316,8081],{},[80,14318,14319],{"class":82,"line":126},[80,14320,105],{"emptyLinePlaceholder":104},[80,14322,14323],{"class":82,"line":132},[80,14324,8090],{},[80,14326,14327],{"class":82,"line":4136},[80,14328,8095],{},[80,14330,14331],{"class":82,"line":5801},[80,14332,105],{"emptyLinePlaceholder":104},[80,14334,14335],{"class":82,"line":5806},[80,14336,8104],{},[80,14338,14339],{"class":82,"line":7411},[80,14340,8109],{},[10,14342,138],{},[71,14344,14346],{"className":14345,"code":8115,"language":144,"meta":76},[142],[33,14347,8115],{"__ignoreMap":76},[10,14349,149],{},[14,14351,152],{"id":152},[154,14353,14354,14360],{},[48,14355,14356,8129,14358,8133],{},[33,14357,8128],{},[33,14359,8132],{},[48,14361,8136,14362,8140],{},[33,14363,8139],{},[14,14365,194],{"id":194},[45,14367,14368,14370],{},[48,14369,8147],{},[48,14371,8150],{},[14,14373,211],{"id":211},[154,14375,14376,14382],{},[48,14377,8157,14378,8161,14380,205],{},[33,14379,8160],{},[33,14381,8164],{},[48,14383,8167],{},[10,14385,231],{},[14,14387,234],{"id":234},[10,14389,8174],{},[239,14391,241],{},{"title":76,"searchDepth":89,"depth":89,"links":14393},[14394,14395,14396,14397,14398,14399,14400,14401],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":8004,"description":8009},[254,8194,8195],{"id":8198,"title":8199,"body":14406,"category":254,"cover":255,"description":8204,"extension":256,"meta":14569,"navigation":104,"path":8408,"pinned":259,"publishedAt":260,"seo":14570,"slug":8410,"stem":8411,"summary":8412,"tags":14571,"updatedAt":260,"visible":104,"__hash__":8416},{"type":7,"value":14407,"toc":14557},[14408,14410,14412,14414,14416,14420,14424,14426,14442,14444,14446,14490,14492,14497,14499,14501,14515,14517,14521,14525,14529,14531,14537,14539,14549,14551,14553,14555],[10,14409,8204],{},[14,14411,16],{"id":16},[10,14413,8209],{},[14,14415,22],{"id":22},[10,14417,14418],{},[26,14419],{"alt":8216,"src":8217},[10,14421,8220,14422,8224],{},[33,14423,8223],{},[14,14425,43],{"id":43},[45,14427,14428,14434,14440],{},[48,14429,14430,8234,14432,8238],{},[33,14431,8233],{},[33,14433,8237],{},[48,14435,8241,14436,8245,14438,8248],{},[33,14437,8244],{},[33,14439,4310],{},[48,14441,8251],{},[14,14443,66],{"id":66},[10,14445,69],{},[71,14447,14448],{"className":73,"code":8258,"language":75,"meta":76,"style":76},[33,14449,14450,14454,14458,14462,14466,14470,14474,14478,14482,14486],{"__ignoreMap":76},[80,14451,14452],{"class":82,"line":83},[80,14453,8265],{},[80,14455,14456],{"class":82,"line":89},[80,14457,8270],{},[80,14459,14460],{"class":82,"line":95},[80,14461,8275],{},[80,14463,14464],{"class":82,"line":101},[80,14465,8280],{},[80,14467,14468],{"class":82,"line":108},[80,14469,8285],{},[80,14471,14472],{"class":82,"line":114},[80,14473,105],{"emptyLinePlaceholder":104},[80,14475,14476],{"class":82,"line":120},[80,14477,8294],{},[80,14479,14480],{"class":82,"line":126},[80,14481,8299],{},[80,14483,14484],{"class":82,"line":132},[80,14485,8299],{},[80,14487,14488],{"class":82,"line":4136},[80,14489,8299],{},[10,14491,138],{},[71,14493,14495],{"className":14494,"code":8313,"language":144,"meta":76},[142],[33,14496,8313],{"__ignoreMap":76},[10,14498,149],{},[14,14500,152],{"id":152},[154,14502,14503,14507],{},[48,14504,7904,14505,8327],{},[33,14506,8326],{},[48,14508,8330,14509,8333,14511,8336,14513,8340],{},[33,14510,8237],{},[33,14512,8223],{},[33,14514,8339],{},[177,14516,179],{"id":179},[10,14518,8345,14519,8348],{},[33,14520,8237],{},[10,14522,14523],{},[26,14524],{"alt":8353,"src":8354},[10,14526,8357,14527,8360],{},[33,14528,8223],{},[14,14530,194],{"id":194},[45,14532,14533,14535],{},[48,14534,8367],{},[48,14536,8370],{},[14,14538,211],{"id":211},[154,14540,14541,14543],{},[48,14542,8377],{},[48,14544,199,14545,8382,14547,8385],{},[33,14546,4310],{},[33,14548,8237],{},[10,14550,231],{},[14,14552,234],{"id":234},[10,14554,8392],{},[239,14556,241],{},{"title":76,"searchDepth":89,"depth":89,"links":14558},[14559,14560,14561,14562,14563,14566,14567,14568],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":14564},[14565],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":8199,"description":8204},[254,8414,8415],{"id":8418,"title":8419,"body":14573,"category":254,"cover":255,"description":8424,"extension":256,"meta":14756,"navigation":104,"path":8649,"pinned":259,"publishedAt":260,"seo":14757,"slug":8651,"stem":8652,"summary":8653,"tags":14758,"updatedAt":260,"visible":104,"__hash__":8656},{"type":7,"value":14574,"toc":14744},[14575,14577,14579,14581,14583,14587,14589,14591,14605,14607,14609,14677,14679,14684,14686,14688,14702,14704,14706,14710,14716,14718,14726,14728,14736,14738,14740,14742],[10,14576,8424],{},[14,14578,16],{"id":16},[10,14580,8429],{},[14,14582,22],{"id":22},[10,14584,14585],{},[26,14586],{"alt":8436,"src":8437},[10,14588,8440],{},[14,14590,43],{"id":43},[45,14592,14593,14599,14601],{},[48,14594,14595,8450,14597,205],{},[33,14596,8449],{},[33,14598,8453],{},[48,14600,8456],{},[48,14602,14603,8462],{},[33,14604,8461],{},[14,14606,66],{"id":66},[10,14608,69],{},[71,14610,14611],{"className":73,"code":8469,"language":75,"meta":76,"style":76},[33,14612,14613,14617,14621,14625,14629,14633,14637,14641,14645,14649,14653,14657,14661,14665,14669,14673],{"__ignoreMap":76},[80,14614,14615],{"class":82,"line":83},[80,14616,8476],{},[80,14618,14619],{"class":82,"line":89},[80,14620,105],{"emptyLinePlaceholder":104},[80,14622,14623],{"class":82,"line":95},[80,14624,8485],{},[80,14626,14627],{"class":82,"line":101},[80,14628,8490],{},[80,14630,14631],{"class":82,"line":108},[80,14632,8495],{},[80,14634,14635],{"class":82,"line":114},[80,14636,8500],{},[80,14638,14639],{"class":82,"line":120},[80,14640,8505],{},[80,14642,14643],{"class":82,"line":126},[80,14644,8510],{},[80,14646,14647],{"class":82,"line":132},[80,14648,8515],{},[80,14650,14651],{"class":82,"line":4136},[80,14652,8520],{},[80,14654,14655],{"class":82,"line":5801},[80,14656,105],{"emptyLinePlaceholder":104},[80,14658,14659],{"class":82,"line":5806},[80,14660,8529],{},[80,14662,14663],{"class":82,"line":7411},[80,14664,6154],{},[80,14666,14667],{"class":82,"line":7417},[80,14668,6159],{},[80,14670,14671],{"class":82,"line":8540},[80,14672,105],{"emptyLinePlaceholder":104},[80,14674,14675],{"class":82,"line":8545},[80,14676,8548],{},[10,14678,138],{},[71,14680,14682],{"className":14681,"code":8554,"language":144,"meta":76},[142],[33,14683,8554],{"__ignoreMap":76},[10,14685,149],{},[14,14687,152],{"id":152},[154,14689,14690,14700],{},[48,14691,8565,14692,8569,14694,8573,14696,8577,14698,205],{},[33,14693,8568],{},[33,14695,8572],{},[33,14697,8576],{},[33,14699,8568],{},[48,14701,8582],{},[177,14703,179],{"id":179},[10,14705,8587],{},[10,14707,14708],{},[26,14709],{"alt":8592,"src":8593},[10,14711,14712,8598,14714,205],{},[33,14713,8449],{},[33,14715,8453],{},[14,14717,194],{"id":194},[45,14719,14720,14724],{},[48,14721,8607,14722,205],{},[33,14723,5352],{},[48,14725,8612],{},[14,14727,211],{"id":211},[154,14729,14730,14732],{},[48,14731,8619],{},[48,14733,8622,14734,8626],{},[33,14735,8625],{},[10,14737,231],{},[14,14739,234],{"id":234},[10,14741,8633],{},[239,14743,241],{},{"title":76,"searchDepth":89,"depth":89,"links":14745},[14746,14747,14748,14749,14750,14753,14754,14755],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":14751},[14752],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":8419,"description":8424},[254,8655,5303],{"id":8658,"title":8659,"body":14760,"category":254,"cover":255,"description":8664,"extension":256,"meta":14919,"navigation":104,"path":8852,"pinned":259,"publishedAt":260,"seo":14920,"slug":8854,"stem":8855,"summary":8856,"tags":14921,"updatedAt":260,"visible":104,"__hash__":8860},{"type":7,"value":14761,"toc":14907},[14762,14764,14766,14768,14770,14774,14776,14778,14786,14788,14790,14854,14856,14861,14863,14865,14873,14875,14877,14881,14883,14885,14891,14893,14899,14901,14903,14905],[10,14763,8664],{},[14,14765,16],{"id":16},[10,14767,8669],{},[14,14769,22],{"id":22},[10,14771,14772],{},[26,14773],{"alt":8676,"src":8677},[10,14775,8680],{},[14,14777,43],{"id":43},[45,14779,14780,14782,14784],{},[48,14781,8687],{},[48,14783,8690],{},[48,14785,8693],{},[14,14787,66],{"id":66},[10,14789,69],{},[71,14791,14792],{"className":73,"code":8700,"language":75,"meta":76,"style":76},[33,14793,14794,14798,14802,14806,14810,14814,14818,14822,14826,14830,14834,14838,14842,14846,14850],{"__ignoreMap":76},[80,14795,14796],{"class":82,"line":83},[80,14797,8707],{},[80,14799,14800],{"class":82,"line":89},[80,14801,8712],{},[80,14803,14804],{"class":82,"line":95},[80,14805,105],{"emptyLinePlaceholder":104},[80,14807,14808],{"class":82,"line":101},[80,14809,8721],{},[80,14811,14812],{"class":82,"line":108},[80,14813,105],{"emptyLinePlaceholder":104},[80,14815,14816],{"class":82,"line":114},[80,14817,8730],{},[80,14819,14820],{"class":82,"line":120},[80,14821,8735],{},[80,14823,14824],{"class":82,"line":126},[80,14825,8740],{},[80,14827,14828],{"class":82,"line":132},[80,14829,105],{"emptyLinePlaceholder":104},[80,14831,14832],{"class":82,"line":4136},[80,14833,8749],{},[80,14835,14836],{"class":82,"line":5801},[80,14837,8754],{},[80,14839,14840],{"class":82,"line":5806},[80,14841,8759],{},[80,14843,14844],{"class":82,"line":7411},[80,14845,105],{"emptyLinePlaceholder":104},[80,14847,14848],{"class":82,"line":7417},[80,14849,6168],{},[80,14851,14852],{"class":82,"line":8540},[80,14853,8772],{},[10,14855,138],{},[71,14857,14859],{"className":14858,"code":8778,"language":144,"meta":76},[142],[33,14860,8778],{"__ignoreMap":76},[10,14862,149],{},[14,14864,152],{"id":152},[154,14866,14867,14871],{},[48,14868,14869,8792],{},[33,14870,8791],{},[48,14872,8795],{},[177,14874,179],{"id":179},[10,14876,8800],{},[10,14878,14879],{},[26,14880],{"alt":8805,"src":8806},[10,14882,8809],{},[14,14884,194],{"id":194},[45,14886,14887,14889],{},[48,14888,8816],{},[48,14890,8819],{},[14,14892,211],{"id":211},[154,14894,14895,14897],{},[48,14896,8826],{},[48,14898,8829],{},[10,14900,231],{},[14,14902,234],{"id":234},[10,14904,8836],{},[239,14906,241],{},{"title":76,"searchDepth":89,"depth":89,"links":14908},[14909,14910,14911,14912,14913,14916,14917,14918],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":14914},[14915],{"id":179,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":8659,"description":8664},[254,8858,8859],{"id":8862,"title":8863,"body":14923,"category":254,"cover":255,"description":8868,"extension":256,"meta":15161,"navigation":104,"path":9169,"pinned":259,"publishedAt":260,"seo":15162,"slug":9171,"stem":9172,"summary":9173,"tags":15163,"updatedAt":260,"visible":104,"__hash__":9177},{"type":7,"value":14924,"toc":15148},[14925,14927,14929,14931,14933,14937,14939,14941,14951,14953,14955,15071,15073,15078,15080,15082,15092,15094,15096,15100,15102,15104,15106,15110,15114,15116,15124,15126,15140,15142,15144,15146],[10,14926,8868],{},[14,14928,16],{"id":16},[10,14930,8873],{},[14,14932,22],{"id":22},[10,14934,14935],{},[26,14936],{"alt":8880,"src":8881},[10,14938,8884],{},[14,14940,43],{"id":43},[45,14942,14943,14945,14947],{},[48,14944,8891],{},[48,14946,8894],{},[48,14948,8897,14949,8901],{},[33,14950,8900],{},[14,14952,66],{"id":66},[10,14954,69],{},[71,14956,14957],{"className":73,"code":8908,"language":75,"meta":76,"style":76},[33,14958,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,15063,15067],{"__ignoreMap":76},[80,14960,14961],{"class":82,"line":83},[80,14962,6966],{},[80,14964,14965],{"class":82,"line":89},[80,14966,6575],{},[80,14968,14969],{"class":82,"line":95},[80,14970,105],{"emptyLinePlaceholder":104},[80,14972,14973],{"class":82,"line":101},[80,14974,8927],{},[80,14976,14977],{"class":82,"line":108},[80,14978,8932],{},[80,14980,14981],{"class":82,"line":114},[80,14982,8937],{},[80,14984,14985],{"class":82,"line":120},[80,14986,8942],{},[80,14988,14989],{"class":82,"line":126},[80,14990,105],{"emptyLinePlaceholder":104},[80,14992,14993],{"class":82,"line":132},[80,14994,8951],{},[80,14996,14997],{"class":82,"line":4136},[80,14998,8956],{},[80,15000,15001],{"class":82,"line":5801},[80,15002,8961],{},[80,15004,15005],{"class":82,"line":5806},[80,15006,8966],{},[80,15008,15009],{"class":82,"line":7411},[80,15010,8971],{},[80,15012,15013],{"class":82,"line":7417},[80,15014,105],{"emptyLinePlaceholder":104},[80,15016,15017],{"class":82,"line":8540},[80,15018,8980],{},[80,15020,15021],{"class":82,"line":8545},[80,15022,8985],{},[80,15024,15025],{"class":82,"line":8988},[80,15026,8991],{},[80,15028,15029],{"class":82,"line":8994},[80,15030,105],{"emptyLinePlaceholder":104},[80,15032,15033],{"class":82,"line":8999},[80,15034,9002],{},[80,15036,15037],{"class":82,"line":9005},[80,15038,105],{"emptyLinePlaceholder":104},[80,15040,15041],{"class":82,"line":9010},[80,15042,7384],{},[80,15044,15045],{"class":82,"line":9015},[80,15046,9018],{},[80,15048,15049],{"class":82,"line":9021},[80,15050,9024],{},[80,15052,15053],{"class":82,"line":9027},[80,15054,9030],{},[80,15056,15057],{"class":82,"line":9033},[80,15058,7394],{},[80,15060,15061],{"class":82,"line":9038},[80,15062,9041],{},[80,15064,15065],{"class":82,"line":9044},[80,15066,1173],{},[80,15068,15069],{"class":82,"line":9049},[80,15070,9052],{},[10,15072,138],{},[71,15074,15076],{"className":15075,"code":9058,"language":144,"meta":76},[142],[33,15077,9058],{"__ignoreMap":76},[10,15079,149],{},[14,15081,152],{"id":152},[154,15083,15084,15088],{},[48,15085,9069,15086,9072],{},[33,15087,8900],{},[48,15089,15090,9077],{},[33,15091,8132],{},[177,15093,179],{"id":179},[10,15095,9082],{},[10,15097,15098],{},[26,15099],{"alt":9087,"src":9088},[10,15101,9091],{},[177,15103,179],{"id":4191},[10,15105,9096],{},[10,15107,15108],{},[26,15109],{"alt":9101,"src":9102},[10,15111,9105,15112,9109],{},[33,15113,9108],{},[14,15115,194],{"id":194},[45,15117,15118,15120],{},[48,15119,9116],{},[48,15121,9119,15122,9122],{},[33,15123,9108],{},[14,15125,211],{"id":211},[154,15127,15128,15132,15134],{},[48,15129,9129,15130,9132],{},[33,15131,9108],{},[48,15133,9135],{},[48,15135,9138,15136,9142,15138,9145],{},[33,15137,9141],{},[33,15139,6110],{},[10,15141,231],{},[14,15143,234],{"id":234},[10,15145,9152],{},[239,15147,241],{},{"title":76,"searchDepth":89,"depth":89,"links":15149},[15150,15151,15152,15153,15154,15158,15159,15160],{"id":16,"depth":89,"text":16},{"id":22,"depth":89,"text":22},{"id":43,"depth":89,"text":43},{"id":66,"depth":89,"text":66},{"id":152,"depth":89,"text":152,"children":15155},[15156,15157],{"id":179,"depth":95,"text":179},{"id":4191,"depth":95,"text":179},{"id":194,"depth":89,"text":194},{"id":211,"depth":89,"text":211},{"id":234,"depth":89,"text":234},{},{"title":8863,"description":8868},[254,9175,9176],{"id":1083,"title":1084,"body":15165,"category":254,"cover":1092,"description":76,"extension":256,"meta":15401,"navigation":104,"path":1408,"pinned":259,"publishedAt":1409,"seo":15402,"slug":1411,"stem":1412,"summary":1413,"tags":15403,"updatedAt":1409,"visible":104,"__hash__":1417},{"type":7,"value":15166,"toc":15386},[15167,15171,15173,15175,15177,15179,15199,15201,15206,15208,15210,15238,15244,15246,15250,15252,15272,15274,15284,15286,15288,15290,15292,15294,15296,15298,15300,15302,15322,15324,15326,15330,15332,15334,15336,15338,15342,15344,15362,15364,15366,15368,15370,15372,15374,15376,15378,15380,15382,15384],[10,15168,15169],{},[26,15170],{"alt":1091,"src":1092},[10,15172,1095],{},[10,15174,1098],{},[14,15176,1102],{"id":1101},[10,15178,1105],{},[71,15180,15181],{"className":73,"code":1108,"language":75,"meta":76,"style":76},[33,15182,15183,15187,15191,15195],{"__ignoreMap":76},[80,15184,15185],{"class":82,"line":83},[80,15186,1115],{},[80,15188,15189],{"class":82,"line":89},[80,15190,1120],{},[80,15192,15193],{"class":82,"line":95},[80,15194,105],{"emptyLinePlaceholder":104},[80,15196,15197],{"class":82,"line":101},[80,15198,1129],{},[10,15200,1132],{},[71,15202,15204],{"className":15203,"code":1136,"language":144,"meta":76},[142],[33,15205,1136],{"__ignoreMap":76},[10,15207,1141],{},[10,15209,1144],{},[71,15211,15212],{"className":73,"code":1147,"language":75,"meta":76,"style":76},[33,15213,15214,15218,15222,15226,15230,15234],{"__ignoreMap":76},[80,15215,15216],{"class":82,"line":83},[80,15217,1154],{},[80,15219,15220],{"class":82,"line":89},[80,15221,105],{"emptyLinePlaceholder":104},[80,15223,15224],{"class":82,"line":95},[80,15225,1163],{},[80,15227,15228],{"class":82,"line":101},[80,15229,1168],{},[80,15231,15232],{"class":82,"line":108},[80,15233,1173],{},[80,15235,15236],{"class":82,"line":114},[80,15237,1178],{},[10,15239,15240,226,15242,1187],{},[33,15241,1183],{},[33,15243,1186],{},[14,15245,1191],{"id":1190},[10,15247,1194,15248,1198],{},[33,15249,1197],{},[10,15251,1201],{},[71,15253,15254],{"className":73,"code":1204,"language":75,"meta":76,"style":76},[33,15255,15256,15260,15264,15268],{"__ignoreMap":76},[80,15257,15258],{"class":82,"line":83},[80,15259,1211],{},[80,15261,15262],{"class":82,"line":89},[80,15263,1216],{},[80,15265,15266],{"class":82,"line":95},[80,15267,1221],{},[80,15269,15270],{"class":82,"line":101},[80,15271,1226],{},[10,15273,1229],{},[71,15275,15276],{"className":618,"code":1232,"language":620,"meta":76,"style":76},[33,15277,15278],{"__ignoreMap":76},[80,15279,15280,15282],{"class":82,"line":83},[80,15281,718],{"class":627},[80,15283,1241],{"class":663},[10,15285,1244],{},[14,15287,1248],{"id":1247},[177,15289,1251],{"id":1251},[10,15291,1254],{},[177,15293,1257],{"id":1257},[10,15295,1260],{},[177,15297,1263],{"id":1263},[10,15299,1266],{},[10,15301,1269],{},[71,15303,15304],{"className":73,"code":1272,"language":75,"meta":76,"style":76},[33,15305,15306,15310,15314,15318],{"__ignoreMap":76},[80,15307,15308],{"class":82,"line":83},[80,15309,1279],{},[80,15311,15312],{"class":82,"line":89},[80,15313,105],{"emptyLinePlaceholder":104},[80,15315,15316],{"class":82,"line":95},[80,15317,1288],{},[80,15319,15320],{"class":82,"line":101},[80,15321,1293],{},[10,15323,1296],{},[177,15325,1299],{"id":1299},[10,15327,1302,15328,1305],{},[33,15329,289],{},[10,15331,1308],{},[177,15333,1311],{"id":1311},[10,15335,1314],{},[14,15337,1318],{"id":1317},[10,15339,15340],{},[26,15341],{"alt":1323,"src":1324},[10,15343,1327],{},[45,15345,15346,15348,15350,15352,15354,15356,15358,15360],{},[48,15347,1332],{},[48,15349,1335],{},[48,15351,1338],{},[48,15353,1341],{},[48,15355,1344],{},[48,15357,1347],{},[48,15359,1350],{},[48,15361,1353],{},[10,15363,1356],{},[14,15365,1360],{"id":1359},[10,15367,1363],{},[10,15369,1366],{},[14,15371,1370],{"id":1369},[10,15373,1373],{},[10,15375,1376],{},[10,15377,1379],{},[14,15379,1382],{"id":1382},[10,15381,1385],{},[10,15383,1388],{},[239,15385,1391],{},{"title":76,"searchDepth":89,"depth":89,"links":15387},[15388,15389,15390,15397,15398,15399,15400],{"id":1101,"depth":89,"text":1102},{"id":1190,"depth":89,"text":1191},{"id":1247,"depth":89,"text":1248,"children":15391},[15392,15393,15394,15395,15396],{"id":1251,"depth":95,"text":1251},{"id":1257,"depth":95,"text":1257},{"id":1263,"depth":95,"text":1263},{"id":1299,"depth":95,"text":1299},{"id":1311,"depth":95,"text":1311},{"id":1317,"depth":89,"text":1318},{"id":1359,"depth":89,"text":1360},{"id":1369,"depth":89,"text":1370},{"id":1382,"depth":89,"text":1382},{},{"title":1084,"description":76},[254,1415,1416],{"id":271,"title":272,"body":15405,"category":254,"cover":255,"description":76,"extension":256,"meta":15984,"navigation":104,"path":1072,"pinned":259,"publishedAt":1073,"seo":15985,"slug":1075,"stem":1076,"summary":1077,"tags":15986,"updatedAt":1073,"visible":104,"__hash__":1081},{"type":7,"value":15406,"toc":15960},[15407,15409,15411,15413,15417,15419,15421,15445,15457,15459,15461,15466,15470,15474,15486,15490,15494,15498,15500,15534,15536,15540,15544,15546,15568,15598,15610,15620,15628,15630,15636,15646,15648,15653,15657,15659,15673,15679,15699,15701,15703,15705,15715,15719,15721,15730,15734,15736,15738,15758,15762,15764,15766,15768,15770,15790,15792,15794,15796,15822,15824,15840,15842,15858,15862,15864,15866,15886,15888,15890,15892,15896,15906,15908,15910,15912,15922,15930,15932,15934,15948,15958],[14,15408,277],{"id":277},[10,15410,280],{},[10,15412,283],{},[10,15414,286,15415,290],{},[33,15416,289],{},[14,15418,293],{"id":293},[10,15420,296],{},[298,15422,15423,15425],{},[10,15424,302],{},[298,15426,15427,15433,15435,15439,15441],{},[10,15428,307,15429,311,15431,315],{},[33,15430,310],{},[33,15432,314],{},[10,15434,318],{},[10,15436,321,15437,326],{},[323,15438,325],{},[10,15440,329],{},[10,15442,15443],{},[26,15444],{"alt":334,"src":335},[298,15446,15447,15449],{},[10,15448,340],{},[298,15450,15451,15453],{},[10,15452,345],{},[10,15454,15455],{},[26,15456],{"alt":350,"src":351},[14,15458,355],{"id":354},[177,15460,359],{"id":358},[10,15462,362,15463,370],{},[364,15464,369],{"href":366,"rel":15465},[368],[298,15467,15468],{},[10,15469,375],{},[10,15471,15472],{},[26,15473],{"alt":380,"src":381},[45,15475,15476,15480,15484],{},[48,15477,386,15478,205],{},[323,15479,389],{},[48,15481,392,15482,205],{},[323,15483,395],{},[48,15485,398],{},[10,15487,15488],{},[26,15489],{"alt":403,"src":404},[298,15491,15492],{},[10,15493,409],{},[10,15495,15496],{},[26,15497],{"alt":414,"src":415},[177,15499,419],{"id":418},[298,15501,15502,15506,15510,15530],{},[298,15503,15504],{},[10,15505,426],{},[10,15507,429,15508,433],{},[323,15509,432],{},[71,15511,15512],{"className":73,"code":436,"language":75,"meta":76,"style":76},[33,15513,15514,15518,15522,15526],{"__ignoreMap":76},[80,15515,15516],{"class":82,"line":83},[80,15517,443],{},[80,15519,15520],{"class":82,"line":89},[80,15521,448],{},[80,15523,15524],{"class":82,"line":95},[80,15525,453],{},[80,15527,15528],{"class":82,"line":101},[80,15529,458],{},[10,15531,461,15532,465],{},[323,15533,464],{},[10,15535,468],{},[10,15537,471,15538,474],{},[33,15539,75],{},[10,15541,15542],{},[26,15543],{"alt":479,"src":480},[10,15545,483],{},[298,15547,15548,15550,15554],{},[10,15549,488],{},[10,15551,15552],{},[323,15553,493],{},[298,15555,15556,15560,15564],{},[10,15557,498,15558,501],{},[33,15559,75],{},[10,15561,504,15562,507],{},[33,15563,75],{},[10,15565,510,15566,514],{},[323,15567,513],{},[298,15569,15570,15572,15576],{},[10,15571,519],{},[10,15573,15574],{},[323,15575,524],{},[298,15577,15578,15584,15592,15594],{},[10,15579,15580,532,15582,536],{},[33,15581,531],{},[33,15583,535],{},[10,15585,539,15586,542,15588,546,15590,550],{},[33,15587,531],{},[323,15589,545],{},[323,15591,549],{},[10,15593,553],{},[10,15595,15596,559],{},[323,15597,558],{},[298,15599,15600,15602],{},[10,15601,564],{},[298,15603,15604,15608],{},[10,15605,569,15606,573],{},[323,15607,572],{},[10,15609,576],{},[298,15611,15612,15616],{},[10,15613,581,15614],{},[323,15615,584],{},[10,15617,15618],{},[26,15619],{"alt":589,"src":590},[298,15621,15622,15624],{},[10,15623,595],{},[10,15625,15626],{},[26,15627],{"alt":589,"src":600},[177,15629,604],{"id":603},[10,15631,607,15632,611,15634,615],{},[33,15633,610],{},[33,15635,614],{},[71,15637,15638],{"className":618,"code":619,"language":620,"meta":76,"style":76},[33,15639,15640],{"__ignoreMap":76},[80,15641,15642,15644],{"class":82,"line":83},[80,15643,75],{"class":627},[80,15645,631],{"class":630},[10,15647,634],{},[71,15649,15651],{"className":15650,"code":638,"language":144,"meta":76},[142],[33,15652,638],{"__ignoreMap":76},[10,15654,15655],{},[26,15656],{"alt":589,"src":645},[10,15658,648],{},[71,15660,15661],{"className":618,"code":651,"language":620,"meta":76,"style":76},[33,15662,15663],{"__ignoreMap":76},[80,15664,15665,15667,15669,15671],{"class":82,"line":83},[80,15666,75],{"class":627},[80,15668,660],{"class":630},[80,15670,664],{"class":663},[80,15672,631],{"class":630},[10,15674,669,15675,672,15677,676],{},[33,15676,75],{},[33,15678,675],{},[71,15680,15681],{"className":618,"code":679,"language":620,"meta":76,"style":76},[33,15682,15683,15689],{"__ignoreMap":76},[80,15684,15685,15687],{"class":82,"line":83},[80,15686,535],{"class":627},[80,15688,631],{"class":630},[80,15690,15691,15693,15695,15697],{"class":82,"line":89},[80,15692,535],{"class":627},[80,15694,660],{"class":630},[80,15696,664],{"class":663},[80,15698,631],{"class":630},[14,15700,701],{"id":700},[177,15702,705],{"id":704},[10,15704,708],{},[71,15706,15707],{"className":618,"code":711,"language":620,"meta":76,"style":76},[33,15708,15709],{"__ignoreMap":76},[80,15710,15711,15713],{"class":82,"line":83},[80,15712,718],{"class":627},[80,15714,631],{"class":630},[10,15716,723,15717,727],{},[33,15718,726],{},[177,15720,731],{"id":730},[10,15722,362,15723,739,15726,205,15728,746],{},[364,15724,738],{"href":736,"rel":15725},[368],[323,15727,742],{},[33,15729,745],{},[10,15731,749,15732,753],{},[33,15733,752],{},[177,15735,757],{"id":756},[10,15737,760],{},[71,15739,15740],{"className":618,"code":763,"language":620,"meta":76,"style":76},[33,15741,15742,15748],{"__ignoreMap":76},[80,15743,15744,15746],{"class":82,"line":83},[80,15745,718],{"class":627},[80,15747,631],{"class":630},[80,15749,15750,15752,15754,15756],{"class":82,"line":89},[80,15751,718],{"class":627},[80,15753,660],{"class":630},[80,15755,664],{"class":663},[80,15757,631],{"class":630},[10,15759,784,15760,787],{},[33,15761,718],{},[14,15763,791],{"id":790},[10,15765,794],{},[177,15767,798],{"id":797},[10,15769,801],{},[71,15771,15772],{"className":618,"code":763,"language":620,"meta":76,"style":76},[33,15773,15774,15780],{"__ignoreMap":76},[80,15775,15776,15778],{"class":82,"line":83},[80,15777,718],{"class":627},[80,15779,631],{"class":630},[80,15781,15782,15784,15786,15788],{"class":82,"line":89},[80,15783,718],{"class":627},[80,15785,660],{"class":630},[80,15787,664],{"class":663},[80,15789,631],{"class":630},[10,15791,824],{},[177,15793,828],{"id":827},[10,15795,831],{},[71,15797,15798],{"className":618,"code":834,"language":620,"meta":76,"style":76},[33,15799,15800,15808],{"__ignoreMap":76},[80,15801,15802,15804,15806],{"class":82,"line":83},[80,15803,841],{"class":627},[80,15805,844],{"class":663},[80,15807,847],{"class":663},[80,15809,15810,15812,15814,15816,15818,15820],{"class":82,"line":89},[80,15811,841],{"class":627},[80,15813,844],{"class":663},[80,15815,856],{"class":663},[80,15817,859],{"class":663},[80,15819,862],{"class":663},[80,15821,865],{"class":663},[10,15823,868],{},[71,15825,15826],{"className":618,"code":871,"language":620,"meta":76,"style":76},[33,15827,15828],{"__ignoreMap":76},[80,15829,15830,15832,15834,15836,15838],{"class":82,"line":83},[80,15831,841],{"class":627},[80,15833,880],{"class":663},[80,15835,856],{"class":663},[80,15837,859],{"class":663},[80,15839,887],{"class":663},[10,15841,890],{},[71,15843,15844],{"className":618,"code":893,"language":620,"meta":76,"style":76},[33,15845,15846],{"__ignoreMap":76},[80,15847,15848,15850,15852,15854,15856],{"class":82,"line":83},[80,15849,841],{"class":627},[80,15851,902],{"class":663},[80,15853,905],{"class":630},[80,15855,908],{"class":663},[80,15857,911],{"class":663},[10,15859,15860,916],{},[33,15861,841],{},[177,15863,920],{"id":919},[10,15865,923],{},[71,15867,15868],{"className":618,"code":763,"language":620,"meta":76,"style":76},[33,15869,15870,15876],{"__ignoreMap":76},[80,15871,15872,15874],{"class":82,"line":83},[80,15873,718],{"class":627},[80,15875,631],{"class":630},[80,15877,15878,15880,15882,15884],{"class":82,"line":89},[80,15879,718],{"class":627},[80,15881,660],{"class":630},[80,15883,664],{"class":663},[80,15885,631],{"class":630},[10,15887,946],{},[14,15889,949],{"id":949},[177,15891,953],{"id":952},[10,15893,956,15894,960],{},[33,15895,959],{},[154,15897,15898,15902,15904],{},[48,15899,965,15900,968],{},[33,15901,675],{},[48,15903,971],{},[48,15905,974],{},[10,15907,977],{},[177,15909,981],{"id":980},[10,15911,984],{},[71,15913,15914],{"className":618,"code":711,"language":620,"meta":76,"style":76},[33,15915,15916],{"__ignoreMap":76},[80,15917,15918,15920],{"class":82,"line":83},[80,15919,718],{"class":627},[80,15921,631],{"class":630},[10,15923,997,15924,1000,15926,1003,15928,205],{},[33,15925,718],{},[33,15927,75],{},[33,15929,718],{},[177,15931,1009],{"id":1008},[10,15933,1012],{},[71,15935,15936],{"className":618,"code":1015,"language":620,"meta":76,"style":76},[33,15937,15938],{"__ignoreMap":76},[80,15939,15940,15942,15944,15946],{"class":82,"line":83},[80,15941,718],{"class":627},[80,15943,660],{"class":630},[80,15945,664],{"class":663},[80,15947,631],{"class":630},[10,15949,1030,15950,1033,15952,1036,15954,1039,15956,1043],{},[33,15951,718],{},[33,15953,75],{},[33,15955,535],{},[33,15957,1042],{},[239,15959,1046],{},{"title":76,"searchDepth":89,"depth":89,"links":15961},[15962,15963,15964,15969,15974,15979],{"id":277,"depth":89,"text":277},{"id":293,"depth":89,"text":293},{"id":354,"depth":89,"text":355,"children":15965},[15966,15967,15968],{"id":358,"depth":95,"text":359},{"id":418,"depth":95,"text":419},{"id":603,"depth":95,"text":604},{"id":700,"depth":89,"text":701,"children":15970},[15971,15972,15973],{"id":704,"depth":95,"text":705},{"id":730,"depth":95,"text":731},{"id":756,"depth":95,"text":757},{"id":790,"depth":89,"text":791,"children":15975},[15976,15977,15978],{"id":797,"depth":95,"text":798},{"id":827,"depth":95,"text":828},{"id":919,"depth":95,"text":920},{"id":949,"depth":89,"text":949,"children":15980},[15981,15982,15983],{"id":952,"depth":95,"text":953},{"id":980,"depth":95,"text":981},{"id":1008,"depth":95,"text":1009},{},{"title":272,"description":76},[254,1079,1080],1786973364692]