[{"data":1,"prerenderedAt":15824},["ShallowReactive",2],{"tag-函数":3,"sidebar-posts":9015},[4,178,343,525,716,881,1066,1250,1444,1676,1860,2037,2194,2365,2530,2745,2977,3159,3323,3512,3700,3855,4015,4212,4409,4623,4790,5035,5217,5422,5618,5802,6003,6293,6485,6714,6909,7129,7369,7573,7890,8220],{"id":5,"title":6,"body":7,"category":162,"cover":163,"description":13,"extension":164,"meta":165,"navigation":166,"path":167,"pinned":168,"publishedAt":169,"seo":170,"slug":171,"stem":172,"summary":173,"tags":174,"updatedAt":169,"visible":166,"__hash__":177},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":8,"value":9,"toc":151},"minimark",[10,14,18,21,24,31,38,41,57,60,63,79,82,90,93,96,113,116,127,130,138,141,144,147],[11,12,13],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[15,16,17],"h2",{"id":17},"本篇要解决的问题",[11,19,20],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,22,23],{"id":23},"先看清一个容易误解的细节",[11,25,26],{},[27,28],"img",{"alt":29,"src":30},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[11,32,33,37],{},[34,35,36],"code",{},".py"," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[15,39,40],{"id":40},"核心概念",[42,43,44,51,54],"ul",{},[45,46,47,48,50],"li",{},"源代码是人编写的文本，通常保存在 ",[34,49,36],{}," 文件中。",[45,52,53],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[45,55,56],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[15,58,59],{"id":59},"跟着示例运行",[11,61,62],{},"把下面代码保存到本课脚本并运行：",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-python shiki shiki-themes github-dark","print(\"你好，Python\")\n","python","",[34,71,72],{"__ignoreMap":69},[73,74,77],"span",{"class":75,"line":76},"line",1,[73,78,67],{},[11,80,81],{},"预期结果：",[64,83,88],{"className":84,"code":86,"language":87,"meta":69},[85],"language-text","你好，Python\n","text",[34,89,86],{"__ignoreMap":69},[11,91,92],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[15,94,95],{"id":95},"按执行顺序拆开看",[97,98,99,106],"ol",{},[45,100,101,102,105],{},"终端启动解释器后，解释器读取 ",[34,103,104],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[45,107,108,109,112],{},"字符串对象先准备好，再交给 ",[34,110,111],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[15,114,115],{"id":115},"初学者容易混淆的地方",[42,117,118,121],{},[45,119,120],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[45,122,123,124,126],{},"认为 ",[34,125,36],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[15,128,129],{"id":129},"练习",[97,131,132,135],{},[45,133,134],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[45,136,137],{},"把示例文字改成自己的学习目标并重新运行。",[11,139,140],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[15,142,143],{"id":143},"本篇边界",[11,145,146],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,149,150],"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":69,"searchDepth":152,"depth":152,"links":153},2,[154,155,156,157,158,159,160,161],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},"Python",null,"md",{},true,"\u002Fposts\u002F20260817\u002F01-python-source-to-output",false,"2026-08-17",{"title":6,"description":13},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[162,175,176],"编程入门","解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":179,"title":180,"body":181,"category":162,"cover":163,"description":185,"extension":164,"meta":333,"navigation":166,"path":334,"pinned":168,"publishedAt":169,"seo":335,"slug":336,"stem":337,"summary":338,"tags":339,"updatedAt":169,"visible":166,"__hash__":342},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":8,"value":182,"toc":323},[183,186,188,191,193,199,206,208,223,225,228,257,259,265,267,269,283,285,299,301,313,315,317,320],[11,184,185],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[15,187,17],{"id":17},[11,189,190],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,192,23],{"id":23},[11,194,195],{},[27,196],{"alt":197,"src":198},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[11,200,201,202,205],{},"终端收到 ",[34,203,204],{},"python3"," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[15,207,40],{"id":40},[42,209,210,213,216],{},[45,211,212],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[45,214,215],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[45,217,218,219,222],{},"检查 pip 时使用 ",[34,220,221],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[15,224,59],{"id":59},[11,226,227],{},"在 macOS 终端执行：",[64,229,233],{"className":230,"code":231,"language":232,"meta":69,"style":69},"language-bash shiki shiki-themes github-dark","python3 --version\npython3 -m pip --version\n","bash",[34,234,235,244],{"__ignoreMap":69},[73,236,237,240],{"class":75,"line":76},[73,238,204],{"class":239},"svObZ",[73,241,243],{"class":242},"sDLfK"," --version\n",[73,245,246,248,251,255],{"class":75,"line":152},[73,247,204],{"class":239},[73,249,250],{"class":242}," -m",[73,252,254],{"class":253},"sU2Wk"," pip",[73,256,243],{"class":242},[11,258,81],{},[64,260,263],{"className":261,"code":262,"language":87,"meta":69},[85],"Python 3.14.x\npip 版本信息与安装路径\n",[34,264,262],{"__ignoreMap":69},[11,266,92],{},[15,268,95],{"id":95},[97,270,271,277],{},[45,272,273,276],{},[34,274,275],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[45,278,279,282],{},[34,280,281],{},"python3 -m pip --version"," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[15,284,115],{"id":115},[42,286,287,293],{},[45,288,289,290,292],{},"看到系统已有 ",[34,291,204],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[45,294,295,296,298],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,297,204],{},"，不修改系统自带工具。",[15,300,129],{"id":129},[97,302,303,310],{},[45,304,305,306,309],{},"执行 ",[34,307,308],{},"which python3","，记录当前解释器路径。",[45,311,312],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[11,314,140],{},[15,316,143],{"id":143},[11,318,319],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,321,322],{},"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":69,"searchDepth":152,"depth":152,"links":324},[325,326,327,328,329,330,331,332],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":180,"description":185},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[162,340,341],"macOS","环境搭建","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":344,"title":345,"body":346,"category":162,"cover":163,"description":514,"extension":164,"meta":515,"navigation":166,"path":516,"pinned":168,"publishedAt":169,"seo":517,"slug":518,"stem":519,"summary":520,"tags":521,"updatedAt":169,"visible":166,"__hash__":524},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":8,"value":347,"toc":504},[348,354,356,359,361,367,370,372,397,399,401,430,432,438,440,442,460,462,476,478,492,494,496,502],[11,349,350,351,353],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,352,36],{}," 脚本。",[15,355,17],{"id":17},[11,357,358],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,360,23],{"id":23},[11,362,363],{},[27,364],{"alt":365,"src":366},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[11,368,369],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[15,371,40],{"id":40},[42,373,374,384,391],{},[45,375,376,377,379,380,383],{},"在终端输入 ",[34,378,204],{}," 进入 REPL，提示符通常是 ",[34,381,382],{},">>>","。",[45,385,386,387,390],{},"输入 ",[34,388,389],{},"exit()"," 或按 Control-D 退出 REPL。",[45,392,393,394,396],{},"需要保存、复查或多次运行的代码应写入 ",[34,395,36],{}," 文件。",[15,398,59],{"id":59},[11,400,62],{},[64,402,406],{"className":403,"code":404,"language":405,"meta":69,"style":69},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,407,408,413,418,424],{"__ignoreMap":69},[73,409,410],{"class":75,"line":76},[73,411,412],{},">>> 2 + 3\n",[73,414,415],{"class":75,"line":152},[73,416,417],{},"5\n",[73,419,421],{"class":75,"line":420},3,[73,422,423],{},">>> \"python\".upper()\n",[73,425,427],{"class":75,"line":426},4,[73,428,429],{},"'PYTHON'\n",[11,431,81],{},[64,433,436],{"className":434,"code":435,"language":87,"meta":69},[85],"REPL 会直接显示表达式结果\n",[34,437,435],{"__ignoreMap":69},[11,439,92],{},[15,441,95],{"id":95},[97,443,444,454],{},[45,445,446,447,450,451,383],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,448,449],{},"2 + 3"," 能直接看到 ",[34,452,453],{},"5",[45,455,456,457,459],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,458,111],{}," 才会写到标准输出。",[15,461,115],{"id":115},[42,463,464,473],{},[45,465,466,467,469,470,472],{},"把提示符 ",[34,468,382],{}," 复制进 ",[34,471,36],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[45,474,475],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[15,477,129],{"id":129},[97,479,480,486],{},[45,481,482,483,383],{},"在 REPL 计算 ",[34,484,485],{},"12 * 8",[45,487,488,489,491],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,490,111],{}," 时是否显示结果。",[11,493,140],{},[15,495,143],{"id":143},[11,497,498,499,501],{},"本篇目标是根据任务选择 REPL 或 ",[34,500,36],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,503,150],{},{"title":69,"searchDepth":152,"depth":152,"links":505},[506,507,508,509,510,511,512,513],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":345,"description":514},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[162,522,523],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":526,"title":527,"body":528,"category":162,"cover":163,"description":532,"extension":164,"meta":706,"navigation":166,"path":707,"pinned":168,"publishedAt":169,"seo":708,"slug":709,"stem":710,"summary":711,"tags":712,"updatedAt":169,"visible":166,"__hash__":715},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":8,"value":529,"toc":696},[530,533,535,538,540,546,552,554,572,574,576,623,625,631,633,635,657,659,672,674,686,688,690,693],[11,531,532],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[15,534,17],{"id":17},[11,536,537],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,539,23],{"id":23},[11,541,542],{},[27,543],{"alt":544,"src":545},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[11,547,548,551],{},[34,549,550],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[15,553,40],{"id":40},[42,555,556,559,569],{},[45,557,558],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[45,560,561,564,565,568],{},[34,562,563],{},"pwd"," 显示当前目录，",[34,566,567],{},"ls"," 显示目录里的文件。",[45,570,571],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[15,573,59],{"id":59},[11,575,227],{},[64,577,579],{"className":230,"code":578,"language":232,"meta":69,"style":69},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,580,581,589,596,601,616],{"__ignoreMap":69},[73,582,583,586],{"class":75,"line":76},[73,584,585],{"class":239},"mkdir",[73,587,588],{"class":253}," python-study\n",[73,590,591,594],{"class":75,"line":152},[73,592,593],{"class":242},"cd",[73,595,588],{"class":253},[73,597,598],{"class":75,"line":420},[73,599,600],{"class":242},"pwd\n",[73,602,603,606,609,613],{"class":75,"line":426},[73,604,605],{"class":242},"printf",[73,607,608],{"class":253}," 'print(\"项目已经运行\")\\n'",[73,610,612],{"class":611},"snl16"," >",[73,614,615],{"class":253}," hello.py\n",[73,617,619,621],{"class":75,"line":618},5,[73,620,204],{"class":239},[73,622,615],{"class":253},[11,624,81],{},[64,626,629],{"className":627,"code":628,"language":87,"meta":69},[85],"项目已经运行\n",[34,630,628],{"__ignoreMap":69},[11,632,92],{},[15,634,95],{"id":95},[97,636,637,648],{},[45,638,639,641,642,644,645,647],{},[34,640,585],{}," 创建目录，",[34,643,593],{}," 改变终端当前目录，",[34,646,563],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[45,649,650,652,653,656],{},[34,651,550],{}," 会在当前目录寻找 ",[34,654,655],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[15,658,115],{"id":115},[42,660,661,669],{},[45,662,663,664,666,667,383],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,665,563],{}," 和 ",[34,668,567],{},[45,670,671],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[15,673,129],{"id":129},[97,675,676,683],{},[45,677,678,679,682],{},"新建 ",[34,680,681],{},"lesson01.py"," 并输出课程编号。",[45,684,685],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[11,687,140],{},[15,689,143],{"id":143},[11,691,692],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,694,695],{},"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":69,"searchDepth":152,"depth":152,"links":697},[698,699,700,701,702,703,704,705],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":527,"description":532},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[162,713,714],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":717,"title":718,"body":719,"category":162,"cover":163,"description":723,"extension":164,"meta":871,"navigation":166,"path":872,"pinned":168,"publishedAt":169,"seo":873,"slug":874,"stem":875,"summary":876,"tags":877,"updatedAt":169,"visible":166,"__hash__":880},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":8,"value":720,"toc":861},[721,724,726,729,731,737,748,750,770,772,774,794,796,802,804,806,825,827,835,837,852,854,856,859],[11,722,723],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[15,725,17],{"id":17},[11,727,728],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,730,23],{"id":23},[11,732,733],{},[27,734],{"alt":735,"src":736},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[11,738,739,740,383,742,745,746,383],{},"Python 先计算表达式，再把得到的对象交给 ",[34,741,111],{},[34,743,744],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,747,449],{},[15,749,40],{"id":40},[42,751,752,758,767],{},[45,753,754,757],{},[34,755,756],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[45,759,760,763,764,383],{},[34,761,762],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,765,766],{},"12",[45,768,769],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[15,771,59],{"id":59},[11,773,62],{},[64,775,777],{"className":66,"code":776,"language":68,"meta":69,"style":69},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,778,779,784,789],{"__ignoreMap":69},[73,780,781],{"class":75,"line":76},[73,782,783],{},"print(42)\n",[73,785,786],{"class":75,"line":152},[73,787,788],{},"print(7 + 5)\n",[73,790,791],{"class":75,"line":420},[73,792,793],{},"print(\"Python 基础课\")\n",[11,795,81],{},[64,797,800],{"className":798,"code":799,"language":87,"meta":69},[85],"42\n12\nPython 基础课\n",[34,801,799],{"__ignoreMap":69},[11,803,92],{},[15,805,95],{"id":95},[97,807,808,816],{},[45,809,810,813,814,383],{},[34,811,812],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,815,766],{},[45,817,818,820,821,824],{},[34,819,111],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,822,823],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[15,826,115],{"id":115},[42,828,829,832],{},[45,830,831],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[45,833,834],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[15,836,129],{"id":129},[97,838,839,842],{},[45,840,841],{},"分别输出一个整数、一个小数和一段文本。",[45,843,844,845,847,848,851],{},"比较 ",[34,846,744],{}," 与 ",[34,849,850],{},"print(\"2 + 3\")"," 的结果。",[11,853,140],{},[15,855,143],{"id":143},[11,857,858],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,860,150],{},{"title":69,"searchDepth":152,"depth":152,"links":862},[863,864,865,866,867,868,869,870],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":718,"description":723},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[162,878,879],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":882,"title":883,"body":884,"category":162,"cover":163,"description":888,"extension":164,"meta":1056,"navigation":166,"path":1057,"pinned":168,"publishedAt":169,"seo":1058,"slug":1059,"stem":1060,"summary":1061,"tags":1062,"updatedAt":169,"visible":166,"__hash__":1065},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":8,"value":885,"toc":1046},[886,889,891,894,896,902,905,907,933,935,937,966,968,974,976,978,1002,1004,1020,1022,1037,1039,1041,1044],[11,887,888],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[15,890,17],{"id":17},[11,892,893],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,895,23],{"id":23},[11,897,898],{},[27,899],{"alt":900,"src":901},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[11,903,904],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[15,906,40],{"id":40},[42,908,909,912,922],{},[45,910,911],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[45,913,914,915,847,918,921],{},"变量名区分大小写，",[34,916,917],{},"score",[34,919,920],{},"Score"," 是两个名字。",[45,923,924,925,928,929,932],{},"使用能表达含义的名称；不要用 ",[34,926,927],{},"list","、",[34,930,931],{},"str"," 等内置名称作为普通变量名。",[15,934,59],{"id":59},[11,936,62],{},[64,938,940],{"className":66,"code":939,"language":68,"meta":69,"style":69},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,941,942,947,952,957,962],{"__ignoreMap":69},[73,943,944],{"class":75,"line":76},[73,945,946],{},"score = 90\n",[73,948,949],{"class":75,"line":152},[73,950,951],{},"print(score)\n",[73,953,954],{"class":75,"line":420},[73,955,956],{"emptyLinePlaceholder":166},"\n",[73,958,959],{"class":75,"line":426},[73,960,961],{},"score = 95\n",[73,963,964],{"class":75,"line":618},[73,965,951],{},[11,967,81],{},[64,969,972],{"className":970,"code":971,"language":87,"meta":69},[85],"90\n95\n",[34,973,971],{"__ignoreMap":69},[11,975,92],{},[15,977,95],{"id":95},[97,979,980,989],{},[45,981,305,982,985,986,988],{},[34,983,984],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,987,917],{}," 再绑定到它。",[45,990,305,991,994,995,998,999,383],{},[34,992,993],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,996,997],{},"90"," 没有被改造成 ",[34,1000,1001],{},"95",[15,1003,115],{"id":115},[42,1005,1006,1009],{},[45,1007,1008],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[45,1010,1011,1012,928,1014,928,1016,1019],{},"使用 ",[34,1013,927],{},[34,1015,931],{},[34,1017,1018],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[15,1021,129],{"id":129},[97,1023,1024,1034],{},[45,1025,1026,1027,666,1030,1033],{},"创建 ",[34,1028,1029],{},"course_name",[34,1031,1032],{},"lesson_count"," 两个变量并输出。",[45,1035,1036],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[11,1038,140],{},[15,1040,143],{"id":143},[11,1042,1043],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,1045,150],{},{"title":69,"searchDepth":152,"depth":152,"links":1047},[1048,1049,1050,1051,1052,1053,1054,1055],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":883,"description":888},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[162,1063,1064],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":1067,"title":1068,"body":1069,"category":162,"cover":163,"description":1073,"extension":164,"meta":1240,"navigation":166,"path":1241,"pinned":168,"publishedAt":169,"seo":1242,"slug":1243,"stem":1244,"summary":1245,"tags":1246,"updatedAt":169,"visible":166,"__hash__":1249},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":8,"value":1070,"toc":1230},[1071,1074,1076,1079,1081,1087,1090,1092,1121,1123,1125,1172,1174,1180,1182,1184,1198,1200,1211,1213,1221,1223,1225,1228],[11,1072,1073],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[15,1075,17],{"id":17},[11,1077,1078],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,1080,23],{"id":23},[11,1082,1083],{},[27,1084],{"alt":1085,"src":1086},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[11,1088,1089],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[15,1091,40],{"id":40},[42,1093,1094,1104,1118],{},[45,1095,1096,1099,1100,1103],{},[34,1097,1098],{},"int"," 表示整数，",[34,1101,1102],{},"float"," 表示浮点数。",[45,1105,1106,1109,1110,1113,1114,1117],{},[34,1107,1108],{},"\u002F"," 总是进行真除法；",[34,1111,1112],{},"\u002F\u002F"," 是向下取整除法，",[34,1115,1116],{},"%"," 得到余数。",[45,1119,1120],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[15,1122,59],{"id":59},[11,1124,62],{},[64,1126,1128],{"className":66,"code":1127,"language":68,"meta":69,"style":69},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,1129,1130,1135,1140,1145,1149,1154,1160,1166],{"__ignoreMap":69},[73,1131,1132],{"class":75,"line":76},[73,1133,1134],{},"price = 25\n",[73,1136,1137],{"class":75,"line":152},[73,1138,1139],{},"count = 4\n",[73,1141,1142],{"class":75,"line":420},[73,1143,1144],{},"discount = 0.9\n",[73,1146,1147],{"class":75,"line":426},[73,1148,956],{"emptyLinePlaceholder":166},[73,1150,1151],{"class":75,"line":618},[73,1152,1153],{},"total = price * count * discount\n",[73,1155,1157],{"class":75,"line":1156},6,[73,1158,1159],{},"average = total \u002F count\n",[73,1161,1163],{"class":75,"line":1162},7,[73,1164,1165],{},"print(total)\n",[73,1167,1169],{"class":75,"line":1168},8,[73,1170,1171],{},"print(average)\n",[11,1173,81],{},[64,1175,1178],{"className":1176,"code":1177,"language":87,"meta":69},[85],"90.0\n22.5\n",[34,1179,1177],{"__ignoreMap":69},[11,1181,92],{},[15,1183,95],{"id":95},[97,1185,1186,1192],{},[45,1187,1188,1191],{},[34,1189,1190],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[45,1193,1194,1197],{},[34,1195,1196],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[15,1199,115],{"id":115},[42,1201,1202,1208],{},[45,1203,1204,1205,383],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,1206,1207],{},"decimal.Decimal",[45,1209,1210],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[15,1212,129],{"id":129},[97,1214,1215,1218],{},[45,1216,1217],{},"计算 137 除以 10 的商和余数。",[45,1219,1220],{},"给总价表达式加括号，验证结果是否保持一致。",[11,1222,140],{},[15,1224,143],{"id":143},[11,1226,1227],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,1229,150],{},{"title":69,"searchDepth":152,"depth":152,"links":1231},[1232,1233,1234,1235,1236,1237,1238,1239],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":1068,"description":1073},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[162,1247,1248],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":1251,"title":1252,"body":1253,"category":162,"cover":163,"description":1257,"extension":164,"meta":1434,"navigation":166,"path":1435,"pinned":168,"publishedAt":169,"seo":1436,"slug":1437,"stem":1438,"summary":1439,"tags":1440,"updatedAt":169,"visible":166,"__hash__":1443},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":8,"value":1254,"toc":1422},[1255,1258,1260,1263,1265,1271,1281,1283,1294,1296,1298,1328,1330,1336,1338,1340,1370,1374,1377,1383,1386,1388,1396,1398,1413,1415,1417,1420],[11,1256,1257],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[15,1259,17],{"id":17},[11,1261,1262],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,1264,23],{"id":23},[11,1266,1267],{},[27,1268],{"alt":1269,"src":1270},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[11,1272,1273,1274,1277,1278,383],{},"切片 ",[34,1275,1276],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,1279,1280],{},"stop - start",[15,1282,40],{"id":40},[42,1284,1285,1288,1291],{},[45,1286,1287],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[45,1289,1290],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[45,1292,1293],{},"切片会创建新的字符串，不会修改原字符串。",[15,1295,59],{"id":59},[11,1297,62],{},[64,1299,1301],{"className":66,"code":1300,"language":68,"meta":69,"style":69},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,1302,1303,1308,1313,1318,1323],{"__ignoreMap":69},[73,1304,1305],{"class":75,"line":76},[73,1306,1307],{},"language = \"Python\"\n",[73,1309,1310],{"class":75,"line":152},[73,1311,1312],{},"print(language[0])\n",[73,1314,1315],{"class":75,"line":420},[73,1316,1317],{},"print(language[-1])\n",[73,1319,1320],{"class":75,"line":426},[73,1321,1322],{},"print(language[0:3])\n",[73,1324,1325],{"class":75,"line":618},[73,1326,1327],{},"print(language + \" 3.14\")\n",[11,1329,81],{},[64,1331,1334],{"className":1332,"code":1333,"language":87,"meta":69},[85],"P\nn\nPyt\nPython 3.14\n",[34,1335,1333],{"__ignoreMap":69},[11,1337,92],{},[15,1339,95],{"id":95},[97,1341,1342,1356],{},[45,1343,1344,1345,1347,1348,1351,1352,1355],{},"字符串 ",[34,1346,162],{}," 的正索引从 ",[34,1349,1350],{},"P"," 的 0 开始，负索引从末尾 ",[34,1353,1354],{},"n"," 的 -1 开始。",[45,1357,1358,1361,1362,1365,1366,1369],{},[34,1359,1360],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,1363,1364],{},"Pyt","；索引 3 的 ",[34,1367,1368],{},"h"," 不在结果中。",[1371,1372,1373],"h3",{"id":1373},"再看一个具体细节",[11,1375,1376],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[11,1378,1379],{},[27,1380],{"alt":1381,"src":1382},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[11,1384,1385],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[15,1387,115],{"id":115},[42,1389,1390,1393],{},[45,1391,1392],{},"把第一个字符写成索引 1，造成整体偏移一位。",[45,1394,1395],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[15,1397,129],{"id":129},[97,1399,1400,1410],{},[45,1401,1402,1403,1406,1407,383],{},"从 ",[34,1404,1405],{},"\"programming\""," 中切出 ",[34,1408,1409],{},"\"gram\"",[45,1411,1412],{},"使用负索引取得字符串倒数第二个字符。",[11,1414,140],{},[15,1416,143],{"id":143},[11,1418,1419],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,1421,150],{},{"title":69,"searchDepth":152,"depth":152,"links":1423},[1424,1425,1426,1427,1428,1431,1432,1433],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":1429},[1430],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":1252,"description":1257},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[162,1441,1442],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":1445,"title":1446,"body":1447,"category":162,"cover":163,"description":1451,"extension":164,"meta":1666,"navigation":166,"path":1667,"pinned":168,"publishedAt":169,"seo":1668,"slug":1669,"stem":1670,"summary":1671,"tags":1672,"updatedAt":169,"visible":166,"__hash__":1675},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":8,"value":1448,"toc":1654},[1449,1452,1454,1457,1459,1465,1476,1478,1511,1513,1515,1559,1561,1567,1569,1571,1592,1594,1597,1603,1611,1613,1627,1629,1645,1647,1649,1652],[11,1450,1451],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[15,1453,17],{"id":17},[11,1455,1456],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,1458,23],{"id":23},[11,1460,1461],{},[27,1462],{"alt":1463,"src":1464},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[11,1466,1467,1468,1471,1472,1475],{},"比较表达式先产生 ",[34,1469,1470],{},"True"," 或 ",[34,1473,1474],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[15,1477,40],{"id":40},[42,1479,1480,1494,1508],{},[45,1481,1482,1485,1486,1489,1490,1493],{},[34,1483,1484],{},"=="," 判断是否相等，",[34,1487,1488],{},"!="," 判断是否不等；单个 ",[34,1491,1492],{},"="," 是赋值。",[45,1495,1496,1499,1500,1503,1504,1507],{},[34,1497,1498],{},"and"," 要求两侧都为真，",[34,1501,1502],{},"or"," 只需一侧为真，",[34,1505,1506],{},"not"," 取反。",[45,1509,1510],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[15,1512,59],{"id":59},[11,1514,62],{},[64,1516,1518],{"className":66,"code":1517,"language":68,"meta":69,"style":69},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[34,1519,1520,1525,1530,1534,1539,1544,1549,1554],{"__ignoreMap":69},[73,1521,1522],{"class":75,"line":76},[73,1523,1524],{},"age = 20\n",[73,1526,1527],{"class":75,"line":152},[73,1528,1529],{},"has_ticket = True\n",[73,1531,1532],{"class":75,"line":420},[73,1533,956],{"emptyLinePlaceholder":166},[73,1535,1536],{"class":75,"line":426},[73,1537,1538],{},"is_adult = age >= 18\n",[73,1540,1541],{"class":75,"line":618},[73,1542,1543],{},"can_enter = is_adult and has_ticket\n",[73,1545,1546],{"class":75,"line":1156},[73,1547,1548],{},"print(is_adult)\n",[73,1550,1551],{"class":75,"line":1162},[73,1552,1553],{},"print(can_enter)\n",[73,1555,1556],{"class":75,"line":1168},[73,1557,1558],{},"print(not has_ticket)\n",[11,1560,81],{},[64,1562,1565],{"className":1563,"code":1564,"language":87,"meta":69},[85],"True\nTrue\nFalse\n",[34,1566,1564],{"__ignoreMap":69},[11,1568,92],{},[15,1570,95],{"id":95},[97,1572,1573,1583],{},[45,1574,1575,1578,1579,1582],{},[34,1576,1577],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,1580,1581],{},"is_adult","，这一步没有任何分支跳转。",[45,1584,1585,1588,1589,1591],{},[34,1586,1587],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,1590,1506],{}," 只对紧随其后的值取反。",[1371,1593,1373],{"id":1373},[11,1595,1596],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[11,1598,1599],{},[27,1600],{"alt":1601,"src":1602},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[11,1604,1605,1607,1608,1610],{},[34,1606,1498],{}," 只有“真、真”得到真；",[34,1609,1502],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[15,1612,115],{"id":115},[42,1614,1615,1624],{},[45,1616,1617,1618,1620,1621,1623],{},"用单个等号判断相等。",[34,1619,1492],{}," 是赋值，",[34,1622,1484],{}," 才是相等比较。",[45,1625,1626],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[15,1628,129],{"id":129},[97,1630,1631,1638],{},[45,1632,1633,1634,1637],{},"判断数字 ",[34,1635,1636],{},"15"," 是否同时大于 10 且小于 20。",[45,1639,1640,1641,1644],{},"分别修改年龄和票据状态，记录 ",[34,1642,1643],{},"can_enter"," 的四种组合结果。",[11,1646,140],{},[15,1648,143],{"id":143},[11,1650,1651],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,1653,150],{},{"title":69,"searchDepth":152,"depth":152,"links":1655},[1656,1657,1658,1659,1660,1663,1664,1665],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":1661},[1662],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":1446,"description":1451},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[162,1673,1674],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":1677,"title":1678,"body":1679,"category":162,"cover":163,"description":1683,"extension":164,"meta":1851,"navigation":166,"path":1852,"pinned":168,"publishedAt":169,"seo":1853,"slug":1854,"stem":1855,"summary":1856,"tags":1857,"updatedAt":169,"visible":166,"__hash__":1859},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":8,"value":1680,"toc":1841},[1681,1684,1686,1689,1691,1697,1715,1717,1730,1732,1734,1768,1770,1776,1778,1780,1802,1804,1816,1818,1832,1834,1836,1839],[11,1682,1683],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[15,1685,17],{"id":17},[11,1687,1688],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,1690,23],{"id":23},[11,1692,1693],{},[27,1694],{"alt":1695,"src":1696},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[11,1698,1699,1702,1703,1706,1707,1710,1711,1714],{},[34,1700,1701],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,1704,1705],{},"18","，程序首先得到的也是 ",[34,1708,1709],{},"\"18\"","，需要 ",[34,1712,1713],{},"int()"," 后才能按整数参与计算。",[15,1716,40],{"id":40},[42,1718,1719,1722,1727],{},[45,1720,1721],{},"提示文字应告诉用户需要输入什么。",[45,1723,1724,1726],{},[34,1725,1713],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[45,1728,1729],{},"输入转换和业务计算分开写，定位问题更直接。",[15,1731,59],{"id":59},[11,1733,62],{},[64,1735,1737],{"className":66,"code":1736,"language":68,"meta":69,"style":69},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,1738,1739,1744,1749,1754,1758,1763],{"__ignoreMap":69},[73,1740,1741],{"class":75,"line":76},[73,1742,1743],{},"name = input(\"请输入姓名：\")\n",[73,1745,1746],{"class":75,"line":152},[73,1747,1748],{},"age_text = input(\"请输入年龄：\")\n",[73,1750,1751],{"class":75,"line":420},[73,1752,1753],{},"age = int(age_text)\n",[73,1755,1756],{"class":75,"line":426},[73,1757,956],{"emptyLinePlaceholder":166},[73,1759,1760],{"class":75,"line":618},[73,1761,1762],{},"print(\"你好，\" + name)\n",[73,1764,1765],{"class":75,"line":1156},[73,1766,1767],{},"print(age + 1)\n",[11,1769,81],{},[64,1771,1774],{"className":1772,"code":1773,"language":87,"meta":69},[85],"根据输入显示姓名，并输出下一年的年龄\n",[34,1775,1773],{"__ignoreMap":69},[11,1777,92],{},[15,1779,95],{"id":95},[97,1781,1782,1792],{},[45,1783,1784,1785,1787,1788,1791],{},"两次 ",[34,1786,1701],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,1789,1790],{},"age_text"," 用来提醒这仍是文本。",[45,1793,1794,1797,1798,1801],{},[34,1795,1796],{},"int(age_text)"," 创建整数对象，后面的 ",[34,1799,1800],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[15,1803,115],{"id":115},[42,1805,1806,1813],{},[45,1807,1808,1809,1812],{},"直接计算 ",[34,1810,1811],{},"input(...) + 1","，忽略输入结果是字符串。",[45,1814,1815],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[15,1817,129],{"id":129},[97,1819,1820,1823],{},[45,1821,1822],{},"接收两个整数并输出它们的和。",[45,1824,386,1825,1828,1829,1831],{},[34,1826,1827],{},"18.5"," 给 ",[34,1830,1713],{},"，记录错误类型，但暂时不要尝试忽略错误。",[11,1833,140],{},[15,1835,143],{"id":143},[11,1837,1838],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,1840,150],{},{"title":69,"searchDepth":152,"depth":152,"links":1842},[1843,1844,1845,1846,1847,1848,1849,1850],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":1678,"description":1683},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[162,1018,1858],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":1861,"title":1862,"body":1863,"category":162,"cover":163,"description":1867,"extension":164,"meta":2027,"navigation":166,"path":2028,"pinned":168,"publishedAt":169,"seo":2029,"slug":2030,"stem":2031,"summary":2032,"tags":2033,"updatedAt":169,"visible":166,"__hash__":2036},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":8,"value":1864,"toc":2017},[1865,1868,1870,1873,1875,1881,1888,1890,1904,1906,1908,1947,1949,1955,1957,1959,1978,1980,1995,1997,2008,2010,2012,2015],[11,1866,1867],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[15,1869,17],{"id":17},[11,1871,1872],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,1874,23],{"id":23},[11,1876,1877],{},[27,1878],{"alt":1879,"src":1880},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[11,1882,1883,1884,1887],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,1885,1886],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[15,1889,40],{"id":40},[42,1891,1892,1895,1898],{},[45,1893,1894],{},"列表使用方括号，元素之间用逗号分隔。",[45,1896,1897],{},"列表可变，可以替换、追加和删除元素。",[45,1899,1900,1901,383],{},"访问不存在的索引会产生 ",[34,1902,1903],{},"IndexError",[15,1905,59],{"id":59},[11,1907,62],{},[64,1909,1911],{"className":66,"code":1910,"language":68,"meta":69,"style":69},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,1912,1913,1918,1923,1927,1932,1937,1942],{"__ignoreMap":69},[73,1914,1915],{"class":75,"line":76},[73,1916,1917],{},"scores = [82, 90, 76]\n",[73,1919,1920],{"class":75,"line":152},[73,1921,1922],{},"print(scores[0])\n",[73,1924,1925],{"class":75,"line":420},[73,1926,956],{"emptyLinePlaceholder":166},[73,1928,1929],{"class":75,"line":426},[73,1930,1931],{},"scores[1] = 95\n",[73,1933,1934],{"class":75,"line":618},[73,1935,1936],{},"scores.append(88)\n",[73,1938,1939],{"class":75,"line":1156},[73,1940,1941],{},"print(scores)\n",[73,1943,1944],{"class":75,"line":1162},[73,1945,1946],{},"print(len(scores))\n",[11,1948,81],{},[64,1950,1953],{"className":1951,"code":1952,"language":87,"meta":69},[85],"82\n[82, 95, 76, 88]\n4\n",[34,1954,1952],{"__ignoreMap":69},[11,1956,92],{},[15,1958,95],{"id":95},[97,1960,1961,1964],{},[45,1962,1963],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[45,1965,1966,1969,1970,1973,1974,1977],{},[34,1967,1968],{},"scores[1] = 95"," 替换第二个位置，",[34,1971,1972],{},"append(88)"," 在末尾增加新位置，",[34,1975,1976],{},"len()"," 因而从 3 变为 4。",[15,1979,115],{"id":115},[42,1981,1982,1992],{},[45,1983,1984,1985,1988,1989,383],{},"访问 ",[34,1986,1987],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,1990,1991],{},"len(scores) - 1",[45,1993,1994],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[15,1996,129],{"id":129},[97,1998,1999,2002],{},[45,2000,2001],{},"建立三项学习任务列表，再追加第四项。",[45,2003,2004,2005,2007],{},"修改第二项，并用 ",[34,2006,1976],{}," 检查元素数量。",[11,2009,140],{},[15,2011,143],{"id":143},[11,2013,2014],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,2016,150],{},{"title":69,"searchDepth":152,"depth":152,"links":2018},[2019,2020,2021,2022,2023,2024,2025,2026],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":1862,"description":1867},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[162,2034,2035],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":2038,"title":2039,"body":2040,"category":162,"cover":163,"description":2044,"extension":164,"meta":2185,"navigation":166,"path":2186,"pinned":168,"publishedAt":169,"seo":2187,"slug":2188,"stem":2189,"summary":2190,"tags":2191,"updatedAt":169,"visible":166,"__hash__":2193},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":8,"value":2041,"toc":2175},[2042,2045,2047,2050,2052,2058,2061,2063,2074,2076,2078,2112,2114,2120,2122,2124,2138,2140,2152,2154,2166,2168,2170,2173],[11,2043,2044],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[15,2046,17],{"id":17},[11,2048,2049],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,2051,23],{"id":23},[11,2053,2054],{},[27,2055],{"alt":2056,"src":2057},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[11,2059,2060],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[15,2062,40],{"id":40},[42,2064,2065,2068,2071],{},[45,2066,2067],{},"元组常用来表达固定数量、固定含义的一组值。",[45,2069,2070],{},"只有一个元素的元组必须保留尾随逗号。",[45,2072,2073],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[15,2075,59],{"id":59},[11,2077,62],{},[64,2079,2081],{"className":66,"code":2080,"language":68,"meta":69,"style":69},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,2082,2083,2088,2093,2098,2102,2107],{"__ignoreMap":69},[73,2084,2085],{"class":75,"line":76},[73,2086,2087],{},"point = (120, 80)\n",[73,2089,2090],{"class":75,"line":152},[73,2091,2092],{},"print(point[0])\n",[73,2094,2095],{"class":75,"line":420},[73,2096,2097],{},"print(point[1])\n",[73,2099,2100],{"class":75,"line":426},[73,2101,956],{"emptyLinePlaceholder":166},[73,2103,2104],{"class":75,"line":618},[73,2105,2106],{},"single = (5,)\n",[73,2108,2109],{"class":75,"line":1156},[73,2110,2111],{},"print(single)\n",[11,2113,81],{},[64,2115,2118],{"className":2116,"code":2117,"language":87,"meta":69},[85],"120\n80\n(5,)\n",[34,2119,2117],{"__ignoreMap":69},[11,2121,92],{},[15,2123,95],{"id":95},[97,2125,2126,2132],{},[45,2127,2128,2131],{},[34,2129,2130],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[45,2133,2134,2137],{},[34,2135,2136],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[15,2139,115],{"id":115},[42,2141,2142,2149],{},[45,2143,2144,2145,2148],{},"把 ",[34,2146,2147],{},"(5)"," 当作元组，实际它仍是整数。",[45,2150,2151],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[15,2153,129],{"id":129},[97,2155,2156,2159],{},[45,2157,2158],{},"用元组表示宽度和高度。",[45,2160,844,2161,847,2163,2165],{},[34,2162,2147],{},[34,2164,2136],{}," 的类型。",[11,2167,140],{},[15,2169,143],{"id":143},[11,2171,2172],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,2174,150],{},{"title":69,"searchDepth":152,"depth":152,"links":2176},[2177,2178,2179,2180,2181,2182,2183,2184],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":2039,"description":2044},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[162,2192,2035],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":2195,"title":2196,"body":2197,"category":162,"cover":163,"description":2201,"extension":164,"meta":2356,"navigation":166,"path":2357,"pinned":168,"publishedAt":169,"seo":2358,"slug":2359,"stem":2360,"summary":2361,"tags":2362,"updatedAt":169,"visible":166,"__hash__":2364},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":8,"value":2198,"toc":2346},[2199,2202,2204,2207,2209,2215,2225,2227,2241,2243,2245,2279,2281,2287,2289,2291,2306,2308,2327,2329,2337,2339,2341,2344],[11,2200,2201],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[15,2203,17],{"id":17},[11,2205,2206],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,2208,23],{"id":23},[11,2210,2211],{},[27,2212],{"alt":2213,"src":2214},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[11,2216,2217,2218,2221,2222,2224],{},"字典通过键定位值，不使用连续位置表达含义。",[34,2219,2220],{},"student[\"score\"]"," 读取的是键 ",[34,2223,917],{}," 对应的值，而不是“第几个元素”。",[15,2226,40],{"id":40},[42,2228,2229,2232,2238],{},[45,2230,2231],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[45,2233,1011,2234,2237],{},[34,2235,2236],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[45,2239,2240],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[15,2242,59],{"id":59},[11,2244,62],{},[64,2246,2248],{"className":66,"code":2247,"language":68,"meta":69,"style":69},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,2249,2250,2255,2260,2264,2269,2274],{"__ignoreMap":69},[73,2251,2252],{"class":75,"line":76},[73,2253,2254],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[73,2256,2257],{"class":75,"line":152},[73,2258,2259],{},"print(student[\"name\"])\n",[73,2261,2262],{"class":75,"line":420},[73,2263,956],{"emptyLinePlaceholder":166},[73,2265,2266],{"class":75,"line":426},[73,2267,2268],{},"student[\"score\"] = 95\n",[73,2270,2271],{"class":75,"line":618},[73,2272,2273],{},"student[\"city\"] = \"郑州\"\n",[73,2275,2276],{"class":75,"line":1156},[73,2277,2278],{},"print(student)\n",[11,2280,81],{},[64,2282,2285],{"className":2283,"code":2284,"language":87,"meta":69},[85],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,2286,2284],{"__ignoreMap":69},[11,2288,92],{},[15,2290,95],{"id":95},[97,2292,2293,2296],{},[45,2294,2295],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[45,2297,2298,2299,2301,2302,2305],{},"给已有键 ",[34,2300,917],{}," 赋值会更新映射，给新键 ",[34,2303,2304],{},"city"," 赋值会增加映射。",[15,2307,115],{"id":115},[42,2309,2310,2317],{},[45,2311,2312,2313,2316],{},"按位置理解字典并尝试 ",[34,2314,2315],{},"student[0]","，而实际键是字符串。",[45,2318,2319,2320,2323,2324,383],{},"直接读取不确定存在的键并忽略 ",[34,2321,2322],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,2325,2326],{},"get()",[15,2328,129],{"id":129},[97,2330,2331,2334],{},[45,2332,2333],{},"建立一本书的标题、作者和页数字典。",[45,2335,2336],{},"添加分类键，再修改页数。",[11,2338,140],{},[15,2340,143],{"id":143},[11,2342,2343],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,2345,150],{},{"title":69,"searchDepth":152,"depth":152,"links":2347},[2348,2349,2350,2351,2352,2353,2354,2355],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":2196,"description":2201},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[162,2363,2035],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":2366,"title":2367,"body":2368,"category":162,"cover":163,"description":2372,"extension":164,"meta":2521,"navigation":166,"path":2522,"pinned":168,"publishedAt":169,"seo":2523,"slug":2524,"stem":2525,"summary":2526,"tags":2527,"updatedAt":169,"visible":166,"__hash__":2529},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":8,"value":2369,"toc":2511},[2370,2373,2375,2378,2380,2386,2389,2391,2410,2412,2414,2448,2450,2456,2458,2460,2475,2477,2489,2491,2502,2504,2506,2509],[11,2371,2372],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[15,2374,17],{"id":17},[11,2376,2377],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,2379,23],{"id":23},[11,2381,2382],{},[27,2383],{"alt":2384,"src":2385},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[11,2387,2388],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[15,2390,40],{"id":40},[42,2392,2393,2396,2399],{},[45,2394,2395],{},"集合中的元素不重复。",[45,2397,2398],{},"集合是无序容器，不要依赖打印顺序或索引。",[45,2400,2401,2402,2405,2406,2409],{},"创建空集合必须写 ",[34,2403,2404],{},"set()","；",[34,2407,2408],{},"{}"," 创建的是空字典。",[15,2411,59],{"id":59},[11,2413,62],{},[64,2415,2417],{"className":66,"code":2416,"language":68,"meta":69,"style":69},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,2418,2419,2424,2429,2433,2438,2443],{"__ignoreMap":69},[73,2420,2421],{"class":75,"line":76},[73,2422,2423],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[73,2425,2426],{"class":75,"line":152},[73,2427,2428],{},"right = {\"Python\", \"Docker\"}\n",[73,2430,2431],{"class":75,"line":420},[73,2432,956],{"emptyLinePlaceholder":166},[73,2434,2435],{"class":75,"line":426},[73,2436,2437],{},"print(left & right)\n",[73,2439,2440],{"class":75,"line":618},[73,2441,2442],{},"print(left | right)\n",[73,2444,2445],{"class":75,"line":1156},[73,2446,2447],{},"print(\"Git\" in left)\n",[11,2449,81],{},[64,2451,2454],{"className":2452,"code":2453,"language":87,"meta":69},[85],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,2455,2453],{"__ignoreMap":69},[11,2457,92],{},[15,2459,95],{"id":95},[97,2461,2462,2465],{},[45,2463,2464],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[45,2466,2467,2470,2471,2474],{},[34,2468,2469],{},"&"," 计算交集，",[34,2472,2473],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[15,2476,115],{"id":115},[42,2478,2479,2486],{},[45,2480,1011,2481,2483,2484,383],{},[34,2482,2408],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,2485,2404],{},[45,2487,2488],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[15,2490,129],{"id":129},[97,2492,2493,2499],{},[45,2494,2495,2496,2498],{},"把包含重复标签的列表交给 ",[34,2497,2404],{}," 去重。",[45,2500,2501],{},"计算两组课程标签的交集和差集。",[11,2503,140],{},[15,2505,143],{"id":143},[11,2507,2508],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,2510,150],{},{"title":69,"searchDepth":152,"depth":152,"links":2512},[2513,2514,2515,2516,2517,2518,2519,2520],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":2367,"description":2372},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[162,2528,2035],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":2531,"title":2532,"body":2533,"category":162,"cover":163,"description":2537,"extension":164,"meta":2735,"navigation":166,"path":2736,"pinned":168,"publishedAt":169,"seo":2737,"slug":2738,"stem":2739,"summary":2740,"tags":2741,"updatedAt":169,"visible":166,"__hash__":2744},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":8,"value":2534,"toc":2723},[2535,2538,2540,2543,2545,2551,2561,2563,2580,2582,2584,2634,2636,2642,2644,2646,2668,2670,2673,2679,2682,2684,2697,2699,2714,2716,2718,2721],[11,2536,2537],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[15,2539,17],{"id":17},[11,2541,2542],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,2544,23],{"id":23},[11,2546,2547],{},[27,2548],{"alt":2549,"src":2550},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[11,2552,2553,2556,2557,2560],{},[34,2554,2555],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,2558,2559],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[15,2562,40],{"id":40},[42,2564,2565,2574,2577],{},[45,2566,2567,2569,2570,2573],{},[34,2568,1484],{}," 比较内容是否相等，",[34,2571,2572],{},"is"," 比较是否为同一个对象。",[45,2575,2576],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[45,2578,2579],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[15,2581,59],{"id":59},[11,2583,62],{},[64,2585,2587],{"className":66,"code":2586,"language":68,"meta":69,"style":69},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,2588,2589,2594,2599,2604,2608,2613,2618,2623,2628],{"__ignoreMap":69},[73,2590,2591],{"class":75,"line":76},[73,2592,2593],{},"tasks = [\"变量\", \"字符串\"]\n",[73,2595,2596],{"class":75,"line":152},[73,2597,2598],{},"shared = tasks\n",[73,2600,2601],{"class":75,"line":420},[73,2602,2603],{},"backup = tasks.copy()\n",[73,2605,2606],{"class":75,"line":426},[73,2607,956],{"emptyLinePlaceholder":166},[73,2609,2610],{"class":75,"line":618},[73,2611,2612],{},"tasks.append(\"列表\")\n",[73,2614,2615],{"class":75,"line":1156},[73,2616,2617],{},"print(shared)\n",[73,2619,2620],{"class":75,"line":1162},[73,2621,2622],{},"print(backup)\n",[73,2624,2625],{"class":75,"line":1168},[73,2626,2627],{},"print(tasks is shared)\n",[73,2629,2631],{"class":75,"line":2630},9,[73,2632,2633],{},"print(tasks is backup)\n",[11,2635,81],{},[64,2637,2640],{"className":2638,"code":2639,"language":87,"meta":69},[85],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,2641,2639],{"__ignoreMap":69},[11,2643,92],{},[15,2645,95],{"id":95},[97,2647,2648,2654],{},[45,2649,2650,2653],{},[34,2651,2652],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[45,2655,2656,2659,2660,2663,2664,2667],{},[34,2657,2658],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,2661,2662],{},"shared"," 能观察到变化，",[34,2665,2666],{},"backup"," 不会。",[1371,2669,1373],{"id":1373},[11,2671,2672],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[11,2674,2675],{},[27,2676],{"alt":2677,"src":2678},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[11,2680,2681],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[15,2683,115],{"id":115},[42,2685,2686,2694],{},[45,2687,2688,2689,2691,2692,383],{},"用 ",[34,2690,1484],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,2693,2572],{},[45,2695,2696],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[15,2698,129],{"id":129},[97,2700,2701,2704],{},[45,2702,2703],{},"让两个变量引用同一个字典并修改其中一个。",[45,2705,1011,2706,2709,2710,666,2712,383],{},[34,2707,2708],{},"copy()"," 创建外层副本，再比较 ",[34,2711,2572],{},[34,2713,1484],{},[11,2715,140],{},[15,2717,143],{"id":143},[11,2719,2720],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,2722,150],{},{"title":69,"searchDepth":152,"depth":152,"links":2724},[2725,2726,2727,2728,2729,2732,2733,2734],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":2730},[2731],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":2532,"description":2537},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[162,2742,2743],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":2746,"title":2747,"body":2748,"category":162,"cover":163,"description":2752,"extension":164,"meta":2968,"navigation":166,"path":2969,"pinned":168,"publishedAt":169,"seo":2970,"slug":2971,"stem":2972,"summary":2973,"tags":2974,"updatedAt":169,"visible":166,"__hash__":2976},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":8,"value":2749,"toc":2955},[2750,2753,2755,2758,2760,2766,2778,2780,2791,2793,2795,2849,2851,2857,2859,2861,2879,2881,2884,2890,2898,2901,2904,2910,2916,2918,2936,2938,2946,2948,2950,2953],[11,2751,2752],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[15,2754,17],{"id":17},[11,2756,2757],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,2759,23],{"id":23},[11,2761,2762],{},[27,2763],{"alt":2764,"src":2765},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[11,2767,2768,928,2771,928,2774,2777],{},[34,2769,2770],{},"if",[34,2772,2773],{},"elif",[34,2775,2776],{},"else"," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[15,2779,40],{"id":40},[42,2781,2782,2785,2788],{},[45,2783,2784],{},"冒号表示接下来开始一个代码块。",[45,2786,2787],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[45,2789,2790],{},"多分支条件要从更严格的范围向更宽的范围排列。",[15,2792,59],{"id":59},[11,2794,62],{},[64,2796,2798],{"className":66,"code":2797,"language":68,"meta":69,"style":69},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,2799,2800,2805,2809,2814,2819,2824,2829,2834,2839,2843],{"__ignoreMap":69},[73,2801,2802],{"class":75,"line":76},[73,2803,2804],{},"score = int(input(\"请输入分数：\"))\n",[73,2806,2807],{"class":75,"line":152},[73,2808,956],{"emptyLinePlaceholder":166},[73,2810,2811],{"class":75,"line":420},[73,2812,2813],{},"if score >= 90:\n",[73,2815,2816],{"class":75,"line":426},[73,2817,2818],{},"    level = \"优秀\"\n",[73,2820,2821],{"class":75,"line":618},[73,2822,2823],{},"elif score >= 60:\n",[73,2825,2826],{"class":75,"line":1156},[73,2827,2828],{},"    level = \"合格\"\n",[73,2830,2831],{"class":75,"line":1162},[73,2832,2833],{},"else:\n",[73,2835,2836],{"class":75,"line":1168},[73,2837,2838],{},"    level = \"需要继续学习\"\n",[73,2840,2841],{"class":75,"line":2630},[73,2842,956],{"emptyLinePlaceholder":166},[73,2844,2846],{"class":75,"line":2845},10,[73,2847,2848],{},"print(level)\n",[11,2850,81],{},[64,2852,2855],{"className":2853,"code":2854,"language":87,"meta":69},[85],"输入 85 时输出：合格\n",[34,2856,2854],{"__ignoreMap":69},[11,2858,92],{},[15,2860,95],{"id":95},[97,2862,2863,2870],{},[45,2864,2865,2866,2869],{},"输入先转换为整数，程序从 ",[34,2867,2868],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[45,2871,2872,2875,2876,2878],{},[34,2873,2874],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,2877,2776],{}," 被跳过；最终三个分支只会选择一个。",[1371,2880,1373],{"id":1373},[11,2882,2883],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[11,2885,2886],{},[27,2887],{"alt":2888,"src":2889},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[11,2891,2892,2894,2895,2897],{},[34,2893,2868],{}," 必须放在 ",[34,2896,2874],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[1371,2899,1373],{"id":2900},"再看一个具体细节-1",[11,2902,2903],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[11,2905,2906],{},[27,2907],{"alt":2908,"src":2909},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[11,2911,2912,2913,2915],{},"同一缩进层级属于同一个代码块；回到 ",[34,2914,2770],{}," 之前的缩进后，语句就位于整条分支结构之外。",[15,2917,115],{"id":115},[42,2919,2920,2926],{},[45,2921,2922,2923,2925],{},"先写 ",[34,2924,2874],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[45,2927,2928,2929,2931,2932,2935],{},"混用多个独立 ",[34,2930,2770],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,2933,2934],{},"if\u002Felif\u002Felse"," 链。",[15,2937,129],{"id":129},[97,2939,2940,2943],{},[45,2941,2942],{},"根据温度输出“冷、适中、热”三个等级。",[45,2944,2945],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[11,2947,140],{},[15,2949,143],{"id":143},[11,2951,2952],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,2954,150],{},{"title":69,"searchDepth":152,"depth":152,"links":2956},[2957,2958,2959,2960,2961,2965,2966,2967],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":2962},[2963,2964],{"id":1373,"depth":420,"text":1373},{"id":2900,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":2747,"description":2752},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[162,2770,2975],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":2978,"title":2979,"body":2980,"category":162,"cover":163,"description":2984,"extension":164,"meta":3150,"navigation":166,"path":3151,"pinned":168,"publishedAt":169,"seo":3152,"slug":3153,"stem":3154,"summary":3155,"tags":3156,"updatedAt":169,"visible":166,"__hash__":3158},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":8,"value":2981,"toc":3138},[2982,2985,2987,2990,2992,2998,3004,3006,3021,3023,3025,3063,3065,3071,3073,3075,3090,3092,3095,3101,3107,3109,3117,3119,3129,3131,3133,3136],[11,2983,2984],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[15,2986,17],{"id":17},[11,2988,2989],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,2991,23],{"id":23},[11,2993,2994],{},[27,2995],{"alt":2996,"src":2997},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[11,2999,3000,3003],{},[34,3001,3002],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[15,3005,40],{"id":40},[42,3007,3008,3011,3014],{},[45,3009,3010],{},"进入循环前先准备参与条件判断的状态。",[45,3012,3013],{},"循环体中必须有机会让条件变为假。",[45,3015,3016,3017,3020],{},"能够预先确定遍历对象时，后续介绍的 ",[34,3018,3019],{},"for"," 通常更直接。",[15,3022,59],{"id":59},[11,3024,62],{},[64,3026,3028],{"className":66,"code":3027,"language":68,"meta":69,"style":69},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,3029,3030,3035,3039,3044,3049,3054,3058],{"__ignoreMap":69},[73,3031,3032],{"class":75,"line":76},[73,3033,3034],{},"count = 1\n",[73,3036,3037],{"class":75,"line":152},[73,3038,956],{"emptyLinePlaceholder":166},[73,3040,3041],{"class":75,"line":420},[73,3042,3043],{},"while count \u003C= 3:\n",[73,3045,3046],{"class":75,"line":426},[73,3047,3048],{},"    print(\"第\", count, \"次练习\")\n",[73,3050,3051],{"class":75,"line":618},[73,3052,3053],{},"    count = count + 1\n",[73,3055,3056],{"class":75,"line":1156},[73,3057,956],{"emptyLinePlaceholder":166},[73,3059,3060],{"class":75,"line":1162},[73,3061,3062],{},"print(\"练习结束\")\n",[11,3064,81],{},[64,3066,3069],{"className":3067,"code":3068,"language":87,"meta":69},[85],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,3070,3068],{"__ignoreMap":69},[11,3072,92],{},[15,3074,95],{"id":95},[97,3076,3077,3084],{},[45,3078,3079,3080,3083],{},"进入循环前 ",[34,3081,3082],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[45,3085,3086,3087,3089],{},"循环体末尾把 ",[34,3088,3082],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[1371,3091,1373],{"id":1373},[11,3093,3094],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[11,3096,3097],{},[27,3098],{"alt":3099,"src":3100},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[11,3102,3103,3104,3106],{},"第4次检查时 ",[34,3105,3082],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[15,3108,115],{"id":115},[42,3110,3111,3114],{},[45,3112,3113],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[45,3115,3116],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[15,3118,129],{"id":129},[97,3120,3121,3126],{},[45,3122,1011,3123,3125],{},[34,3124,3002],{}," 输出 1 到 5。",[45,3127,3128],{},"计算 1 到 10 的累加和。",[11,3130,140],{},[15,3132,143],{"id":143},[11,3134,3135],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,3137,150],{},{"title":69,"searchDepth":152,"depth":152,"links":3139},[3140,3141,3142,3143,3144,3147,3148,3149],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":3145},[3146],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":2979,"description":2984},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[162,3002,3157],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":3160,"title":3161,"body":3162,"category":162,"cover":163,"description":3166,"extension":164,"meta":3314,"navigation":166,"path":3315,"pinned":168,"publishedAt":169,"seo":3316,"slug":3317,"stem":3318,"summary":3319,"tags":3320,"updatedAt":169,"visible":166,"__hash__":3322},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":8,"value":3163,"toc":3304},[3164,3167,3169,3172,3174,3180,3185,3187,3201,3203,3205,3243,3245,3251,3253,3255,3272,3274,3282,3284,3295,3297,3299,3302],[11,3165,3166],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[15,3168,17],{"id":17},[11,3170,3171],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,3173,23],{"id":23},[11,3175,3176],{},[27,3177],{"alt":3178,"src":3179},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[11,3181,3182,3184],{},[34,3183,3019],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[15,3186,40],{"id":40},[42,3188,3189,3195,3198],{},[45,3190,3191,3194],{},[34,3192,3193],{},"range(1, 4)"," 包含 1，不包含 4。",[45,3196,3197],{},"只需要元素时直接遍历元素，不必手工维护索引。",[45,3199,3200],{},"循环变量应使用单数名称，容器使用复数名称。",[15,3202,59],{"id":59},[11,3204,62],{},[64,3206,3208],{"className":66,"code":3207,"language":68,"meta":69,"style":69},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,3209,3210,3215,3219,3224,3229,3233,3238],{"__ignoreMap":69},[73,3211,3212],{"class":75,"line":76},[73,3213,3214],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[73,3216,3217],{"class":75,"line":152},[73,3218,956],{"emptyLinePlaceholder":166},[73,3220,3221],{"class":75,"line":420},[73,3222,3223],{},"for course in courses:\n",[73,3225,3226],{"class":75,"line":426},[73,3227,3228],{},"    print(course)\n",[73,3230,3231],{"class":75,"line":618},[73,3232,956],{"emptyLinePlaceholder":166},[73,3234,3235],{"class":75,"line":1156},[73,3236,3237],{},"for number in range(1, 4):\n",[73,3239,3240],{"class":75,"line":1162},[73,3241,3242],{},"    print(number)\n",[11,3244,81],{},[64,3246,3249],{"className":3247,"code":3248,"language":87,"meta":69},[85],"变量\n字符串\n列表\n1\n2\n3\n",[34,3250,3248],{"__ignoreMap":69},[11,3252,92],{},[15,3254,95],{"id":95},[97,3256,3257,3267],{},[45,3258,3259,3260,3262,3263,3266],{},"第一个 ",[34,3261,3019],{}," 依次从列表取得字符串，循环变量 ",[34,3264,3265],{},"course"," 每轮重新绑定。",[45,3268,3269,3271],{},[34,3270,3193],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[15,3273,115],{"id":115},[42,3275,3276,3279],{},[45,3277,3278],{},"只需要元素却手工维护索引，增加越界风险。",[45,3280,3281],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[15,3283,129],{"id":129},[97,3285,3286,3289],{},[45,3287,3288],{},"逐项输出一个字符串中的字符。",[45,3290,1011,3291,3294],{},[34,3292,3293],{},"range()"," 输出 2、4、6、8。",[11,3296,140],{},[15,3298,143],{"id":143},[11,3300,3301],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,3303,150],{},{"title":69,"searchDepth":152,"depth":152,"links":3305},[3306,3307,3308,3309,3310,3311,3312,3313],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":3161,"description":3166},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[162,3019,3321],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":3324,"title":3325,"body":3326,"category":162,"cover":163,"description":3330,"extension":164,"meta":3504,"navigation":166,"path":3505,"pinned":168,"publishedAt":169,"seo":3506,"slug":3507,"stem":3508,"summary":3509,"tags":3510,"updatedAt":169,"visible":166,"__hash__":3511},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":8,"value":3327,"toc":3494},[3328,3331,3333,3336,3338,3344,3354,3356,3375,3377,3379,3431,3433,3439,3441,3443,3457,3459,3475,3477,3485,3487,3489,3492],[11,3329,3330],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[15,3332,17],{"id":17},[11,3334,3335],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,3337,23],{"id":23},[11,3339,3340],{},[27,3341],{"alt":3342,"src":3343},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[11,3345,3346,3349,3350,3353],{},[34,3347,3348],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,3351,3352],{},"break"," 立即结束整个循环，执行循环后面的代码。",[15,3355,40],{"id":40},[42,3357,3358,3361,3369],{},[45,3359,3360],{},"先写普通循环，再在确有需要时加入流程控制语句。",[45,3362,3363,3365,3366,3368],{},[34,3364,3348],{}," 前要确认不会跳过 ",[34,3367,3002],{}," 循环中的状态更新。",[45,3370,3371,3372,3374],{},"多层嵌套中 ",[34,3373,3352],{}," 只结束它所在的最内层循环。",[15,3376,59],{"id":59},[11,3378,62],{},[64,3380,3382],{"className":66,"code":3381,"language":68,"meta":69,"style":69},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[34,3383,3384,3389,3393,3398,3403,3408,3413,3418,3422,3426],{"__ignoreMap":69},[73,3385,3386],{"class":75,"line":76},[73,3387,3388],{},"numbers = [3, -1, 0, 8, 12]\n",[73,3390,3391],{"class":75,"line":152},[73,3392,956],{"emptyLinePlaceholder":166},[73,3394,3395],{"class":75,"line":420},[73,3396,3397],{},"for number in numbers:\n",[73,3399,3400],{"class":75,"line":426},[73,3401,3402],{},"    if number \u003C 0:\n",[73,3404,3405],{"class":75,"line":618},[73,3406,3407],{},"        continue\n",[73,3409,3410],{"class":75,"line":1156},[73,3411,3412],{},"    if number == 0:\n",[73,3414,3415],{"class":75,"line":1162},[73,3416,3417],{},"        break\n",[73,3419,3420],{"class":75,"line":1168},[73,3421,3242],{},[73,3423,3424],{"class":75,"line":2630},[73,3425,956],{"emptyLinePlaceholder":166},[73,3427,3428],{"class":75,"line":2845},[73,3429,3430],{},"print(\"循环结束\")\n",[11,3432,81],{},[64,3434,3437],{"className":3435,"code":3436,"language":87,"meta":69},[85],"3\n循环结束\n",[34,3438,3436],{"__ignoreMap":69},[11,3440,92],{},[15,3442,95],{"id":95},[97,3444,3445,3451],{},[45,3446,3447,3448,3450],{},"遇到 -1 时 ",[34,3449,3348],{}," 立即结束本轮，后面的判断和输出都不执行。",[45,3452,3453,3454,3456],{},"遇到 0 时 ",[34,3455,3352],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[15,3458,115],{"id":115},[42,3460,3461,3466],{},[45,3462,2144,3463,3465],{},[34,3464,3348],{}," 当作结束循环，实际它只跳到下一轮。",[45,3467,3468,3469,3471,3472,3474],{},"在 ",[34,3470,3002],{}," 中把状态更新放在可能被 ",[34,3473,3348],{}," 跳过的位置，造成无限循环。",[15,3476,129],{"id":129},[97,3478,3479,3482],{},[45,3480,3481],{},"跳过列表中的空字符串并输出其他内容。",[45,3483,3484],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[11,3486,140],{},[15,3488,143],{"id":143},[11,3490,3491],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,3493,150],{},{"title":69,"searchDepth":152,"depth":152,"links":3495},[3496,3497,3498,3499,3500,3501,3502,3503],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":3325,"description":3330},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[162,3352,3348],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":3513,"title":3514,"body":3515,"category":162,"cover":163,"description":3519,"extension":164,"meta":3690,"navigation":166,"path":3691,"pinned":168,"publishedAt":169,"seo":3692,"slug":3693,"stem":3694,"summary":3695,"tags":3696,"updatedAt":169,"visible":166,"__hash__":3699},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":8,"value":3516,"toc":3678},[3517,3520,3522,3525,3527,3533,3536,3538,3562,3564,3566,3600,3602,3608,3610,3612,3629,3631,3634,3640,3643,3645,3659,3661,3669,3671,3673,3676],[11,3518,3519],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[15,3521,17],{"id":17},[11,3523,3524],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,3526,23],{"id":23},[11,3528,3529],{},[27,3530],{"alt":3531,"src":3532},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[11,3534,3535],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[15,3537,40],{"id":40},[42,3539,3540,3543,3546],{},[45,3541,3542],{},"每增加一层嵌套，阅读成本都会上升。",[45,3544,3545],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[45,3547,3548,3549,928,3552,3555,3556,928,3559,383],{},"变量名使用 ",[34,3550,3551],{},"row",[34,3553,3554],{},"cell"," 等层级含义，避免全部写成 ",[34,3557,3558],{},"i",[34,3560,3561],{},"j",[15,3563,59],{"id":59},[11,3565,62],{},[64,3567,3569],{"className":66,"code":3568,"language":68,"meta":69,"style":69},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,3570,3571,3576,3580,3585,3590,3595],{"__ignoreMap":69},[73,3572,3573],{"class":75,"line":76},[73,3574,3575],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[73,3577,3578],{"class":75,"line":152},[73,3579,956],{"emptyLinePlaceholder":166},[73,3581,3582],{"class":75,"line":420},[73,3583,3584],{},"for row in table:\n",[73,3586,3587],{"class":75,"line":426},[73,3588,3589],{},"    for cell in row:\n",[73,3591,3592],{"class":75,"line":618},[73,3593,3594],{},"        print(cell)\n",[73,3596,3597],{"class":75,"line":1156},[73,3598,3599],{},"    print(\"一行结束\")\n",[11,3601,81],{},[64,3603,3606],{"className":3604,"code":3605,"language":87,"meta":69},[85],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,3607,3605],{"__ignoreMap":69},[11,3609,92],{},[15,3611,95],{"id":95},[97,3613,3614,3626],{},[45,3615,3616,3617,3619,3620,666,3623,383],{},"外层变量 ",[34,3618,3551],{}," 先引用第一行列表，内层才依次处理 ",[34,3621,3622],{},"A1",[34,3624,3625],{},"A2",[45,3627,3628],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[1371,3630,1373],{"id":1373},[11,3632,3633],{},"二维列表的输出顺序可以展开成一条时间线。",[11,3635,3636],{},[27,3637],{"alt":3638,"src":3639},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[11,3641,3642],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[15,3644,115],{"id":115},[42,3646,3647,3656],{},[45,3648,3649,3650,1471,3653,3655],{},"把两层循环变量都叫 ",[34,3651,3652],{},"item",[34,3654,3558],{},"，难以确认当前层级。",[45,3657,3658],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[15,3660,129],{"id":129},[97,3662,3663,3666],{},[45,3664,3665],{},"打印一个 2×3 数字表。",[45,3667,3668],{},"在内层增加条件，只输出大于 3 的元素。",[11,3670,140],{},[15,3672,143],{"id":143},[11,3674,3675],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,3677,150],{},{"title":69,"searchDepth":152,"depth":152,"links":3679},[3680,3681,3682,3683,3684,3687,3688,3689],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":3685},[3686],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":3514,"description":3519},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[162,3697,3698],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":3701,"title":3702,"body":3703,"category":162,"cover":163,"description":3707,"extension":164,"meta":3845,"navigation":166,"path":3846,"pinned":168,"publishedAt":169,"seo":3847,"slug":3848,"stem":3849,"summary":3850,"tags":3851,"updatedAt":169,"visible":166,"__hash__":3854},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":8,"value":3704,"toc":3835},[3705,3708,3710,3713,3715,3721,3724,3726,3737,3739,3741,3779,3781,3787,3789,3791,3803,3805,3816,3818,3826,3828,3830,3833],[11,3706,3707],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[15,3709,17],{"id":17},[11,3711,3712],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,3714,23],{"id":23},[11,3716,3717],{},[27,3718],{"alt":3719,"src":3720},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[11,3722,3723],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[15,3725,40],{"id":40},[42,3727,3728,3731,3734],{},[45,3729,3730],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[45,3732,3733],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[45,3735,3736],{},"推导式创建新列表，不修改输入列表。",[15,3738,59],{"id":59},[11,3740,62],{},[64,3742,3744],{"className":66,"code":3743,"language":68,"meta":69,"style":69},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[34,3745,3746,3751,3755,3760,3765,3769,3774],{"__ignoreMap":69},[73,3747,3748],{"class":75,"line":76},[73,3749,3750],{},"numbers = [1, 2, 3, 4, 5]\n",[73,3752,3753],{"class":75,"line":152},[73,3754,956],{"emptyLinePlaceholder":166},[73,3756,3757],{"class":75,"line":420},[73,3758,3759],{},"squares = [number * number for number in numbers]\n",[73,3761,3762],{"class":75,"line":426},[73,3763,3764],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[73,3766,3767],{"class":75,"line":618},[73,3768,956],{"emptyLinePlaceholder":166},[73,3770,3771],{"class":75,"line":1156},[73,3772,3773],{},"print(squares)\n",[73,3775,3776],{"class":75,"line":1162},[73,3777,3778],{},"print(even_squares)\n",[11,3780,81],{},[64,3782,3785],{"className":3783,"code":3784,"language":87,"meta":69},[85],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,3786,3784],{"__ignoreMap":69},[11,3788,92],{},[15,3790,95],{"id":95},[97,3792,3793,3796],{},[45,3794,3795],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[45,3797,3798,3799,3802],{},"第二条先用 ",[34,3800,3801],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[15,3804,115],{"id":115},[42,3806,3807,3813],{},[45,3808,3809,3810,3812],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,3811,3019],{}," 开始找输入。",[45,3814,3815],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[15,3817,129],{"id":129},[97,3819,3820,3823],{},[45,3821,3822],{},"把字符串列表转换为长度列表。",[45,3824,3825],{},"筛选 1 到 20 中能被 3 整除的数。",[11,3827,140],{},[15,3829,143],{"id":143},[11,3831,3832],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,3834,150],{},{"title":69,"searchDepth":152,"depth":152,"links":3836},[3837,3838,3839,3840,3841,3842,3843,3844],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":3702,"description":3707},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[162,3852,3853],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":3856,"title":3857,"body":3858,"category":162,"cover":163,"description":3862,"extension":164,"meta":4005,"navigation":166,"path":4006,"pinned":168,"publishedAt":169,"seo":4007,"slug":4008,"stem":4009,"summary":4010,"tags":4011,"updatedAt":169,"visible":166,"__hash__":4014},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":8,"value":3859,"toc":3995},[3860,3863,3865,3868,3870,3876,3879,3881,3892,3894,3896,3935,3937,3943,3945,3947,3962,3964,3972,3974,3986,3988,3990,3993],[11,3861,3862],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[15,3864,17],{"id":17},[11,3866,3867],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,3869,23],{"id":23},[11,3871,3872],{},[27,3873],{"alt":3874,"src":3875},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[11,3877,3878],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[15,3880,40],{"id":40},[42,3882,3883,3886,3889],{},[45,3884,3885],{},"函数名描述动作，使用小写字母和下划线。",[45,3887,3888],{},"函数定义要先执行，之后才能调用。",[45,3890,3891],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[15,3893,59],{"id":59},[11,3895,62],{},[64,3897,3899],{"className":66,"code":3898,"language":68,"meta":69,"style":69},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,3900,3901,3906,3911,3916,3920,3925,3930],{"__ignoreMap":69},[73,3902,3903],{"class":75,"line":76},[73,3904,3905],{},"def show_progress():\n",[73,3907,3908],{"class":75,"line":152},[73,3909,3910],{},"    print(\"正在学习函数\")\n",[73,3912,3913],{"class":75,"line":420},[73,3914,3915],{},"    print(\"本节完成 50%\")\n",[73,3917,3918],{"class":75,"line":426},[73,3919,956],{"emptyLinePlaceholder":166},[73,3921,3922],{"class":75,"line":618},[73,3923,3924],{},"print(\"调用前\")\n",[73,3926,3927],{"class":75,"line":1156},[73,3928,3929],{},"show_progress()\n",[73,3931,3932],{"class":75,"line":1162},[73,3933,3934],{},"print(\"调用后\")\n",[11,3936,81],{},[64,3938,3941],{"className":3939,"code":3940,"language":87,"meta":69},[85],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,3942,3940],{"__ignoreMap":69},[11,3944,92],{},[15,3946,95],{"id":95},[97,3948,3949,3955],{},[45,3950,305,3951,3954],{},[34,3952,3953],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[45,3956,3957,3958,3961],{},"运行到 ",[34,3959,3960],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[15,3963,115],{"id":115},[42,3965,3966,3969],{},[45,3967,3968],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[45,3970,3971],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[15,3973,129],{"id":129},[97,3975,3976,3983],{},[45,3977,3978,3979,3982],{},"定义 ",[34,3980,3981],{},"show_plan()"," 输出两行学习计划。",[45,3984,3985],{},"连续调用同一个函数两次，观察执行顺序。",[11,3987,140],{},[15,3989,143],{"id":143},[11,3991,3992],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,3994,150],{},{"title":69,"searchDepth":152,"depth":152,"links":3996},[3997,3998,3999,4000,4001,4002,4003,4004],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":3857,"description":3862},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[162,4012,4013],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":4016,"title":4017,"body":4018,"category":162,"cover":163,"description":4022,"extension":164,"meta":4202,"navigation":166,"path":4203,"pinned":168,"publishedAt":169,"seo":4204,"slug":4205,"stem":4206,"summary":4207,"tags":4208,"updatedAt":169,"visible":166,"__hash__":4211},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":8,"value":4019,"toc":4190},[4020,4023,4025,4028,4030,4036,4043,4045,4062,4064,4066,4100,4102,4108,4110,4112,4133,4135,4138,4144,4154,4156,4171,4173,4181,4183,4185,4188],[11,4021,4022],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[15,4024,17],{"id":17},[11,4026,4027],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,4029,23],{"id":23},[11,4031,4032],{},[27,4033],{"alt":4034,"src":4035},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[11,4037,4038,4039,4042],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,4040,4041],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[15,4044,40],{"id":40},[42,4046,4047,4050,4053],{},[45,4048,4049],{},"形参出现在函数定义中，实参出现在函数调用中。",[45,4051,4052],{},"局部变量默认只在函数内部可见。",[45,4054,4055,4056,4058,4059,383],{},"没有显式 ",[34,4057,4041],{}," 的函数会返回 ",[34,4060,4061],{},"None",[15,4063,59],{"id":59},[11,4065,62],{},[64,4067,4069],{"className":66,"code":4068,"language":68,"meta":69,"style":69},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[34,4070,4071,4076,4081,4086,4090,4095],{"__ignoreMap":69},[73,4072,4073],{"class":75,"line":76},[73,4074,4075],{},"def calculate_total(price, count):\n",[73,4077,4078],{"class":75,"line":152},[73,4079,4080],{},"    total = price * count\n",[73,4082,4083],{"class":75,"line":420},[73,4084,4085],{},"    return total\n",[73,4087,4088],{"class":75,"line":426},[73,4089,956],{"emptyLinePlaceholder":166},[73,4091,4092],{"class":75,"line":618},[73,4093,4094],{},"result = calculate_total(25, 4)\n",[73,4096,4097],{"class":75,"line":1156},[73,4098,4099],{},"print(result)\n",[11,4101,81],{},[64,4103,4106],{"className":4104,"code":4105,"language":87,"meta":69},[85],"100\n",[34,4107,4105],{"__ignoreMap":69},[11,4109,92],{},[15,4111,95],{"id":95},[97,4113,4114,4123],{},[45,4115,4116,4117,928,4120,4122],{},"调用时 25 和 4 分别绑定到 ",[34,4118,4119],{},"price",[34,4121,3082],{},"，它们只在本次函数调用的局部范围中使用。",[45,4124,4125,4128,4129,4132],{},[34,4126,4127],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,4130,4131],{},"result"," 并输出。",[1371,4134,1373],{"id":1373},[11,4136,4137],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[11,4139,4140],{},[27,4141],{"alt":4142,"src":4143},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[11,4145,4146,928,4148,666,4150,4153],{},[34,4147,4119],{},[34,4149,3082],{},[34,4151,4152],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[15,4155,115],{"id":115},[42,4157,4158,4165],{},[45,4159,4160,4161,4164],{},"在函数内部只 ",[34,4162,4163],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[45,4166,4167,4168,4170],{},"试图在函数外直接访问局部变量 ",[34,4169,4152],{},"，它的名字只在调用期间的局部作用域存在。",[15,4172,129],{"id":129},[97,4174,4175,4178],{},[45,4176,4177],{},"编写计算长方形面积的函数。",[45,4179,4180],{},"让函数返回结果后在调用方加上单位再输出。",[11,4182,140],{},[15,4184,143],{"id":143},[11,4186,4187],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,4189,150],{},{"title":69,"searchDepth":152,"depth":152,"links":4191},[4192,4193,4194,4195,4196,4199,4200,4201],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":4197},[4198],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":4017,"description":4022},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[162,4209,4210],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":4213,"title":4214,"body":4215,"category":162,"cover":163,"description":4219,"extension":164,"meta":4399,"navigation":166,"path":4400,"pinned":168,"publishedAt":169,"seo":4401,"slug":4402,"stem":4403,"summary":4404,"tags":4405,"updatedAt":169,"visible":166,"__hash__":4408},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":8,"value":4216,"toc":4387},[4217,4220,4222,4225,4227,4233,4236,4238,4255,4257,4259,4311,4313,4319,4321,4323,4341,4343,4346,4352,4355,4357,4368,4370,4378,4380,4382,4385],[11,4218,4219],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[15,4221,17],{"id":17},[11,4223,4224],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,4226,23],{"id":23},[11,4228,4229],{},[27,4230],{"alt":4231,"src":4232},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[11,4234,4235],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[15,4237,40],{"id":40},[42,4239,4240,4243,4249],{},[45,4241,4242],{},"必需参数应放在有默认值的参数之前。",[45,4244,4245,4248],{},[34,4246,4247],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[45,4250,4251,4254],{},[34,4252,4253],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[15,4256,59],{"id":59},[11,4258,62],{},[64,4260,4262],{"className":66,"code":4261,"language":68,"meta":69,"style":69},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[34,4263,4264,4269,4274,4278,4283,4288,4292,4297,4302,4306],{"__ignoreMap":69},[73,4265,4266],{"class":75,"line":76},[73,4267,4268],{},"def build_title(name, level=\"基础\"):\n",[73,4270,4271],{"class":75,"line":152},[73,4272,4273],{},"    return name + \"｜\" + level\n",[73,4275,4276],{"class":75,"line":420},[73,4277,956],{"emptyLinePlaceholder":166},[73,4279,4280],{"class":75,"line":426},[73,4281,4282],{},"print(build_title(\"Python\"))\n",[73,4284,4285],{"class":75,"line":618},[73,4286,4287],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[73,4289,4290],{"class":75,"line":1156},[73,4291,956],{"emptyLinePlaceholder":166},[73,4293,4294],{"class":75,"line":1162},[73,4295,4296],{},"def total(*numbers):\n",[73,4298,4299],{"class":75,"line":1168},[73,4300,4301],{},"    return sum(numbers)\n",[73,4303,4304],{"class":75,"line":2630},[73,4305,956],{"emptyLinePlaceholder":166},[73,4307,4308],{"class":75,"line":2845},[73,4309,4310],{},"print(total(10, 20, 30))\n",[11,4312,81],{},[64,4314,4317],{"className":4315,"code":4316,"language":87,"meta":69},[85],"Python｜基础\n异常处理｜进阶\n60\n",[34,4318,4316],{"__ignoreMap":69},[11,4320,92],{},[15,4322,95],{"id":95},[97,4324,4325,4332],{},[45,4326,4327,4328,4331],{},"第一次调用只提供必需参数，",[34,4329,4330],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[45,4333,4334,4337,4338,383],{},[34,4335,4336],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,4339,4340],{},"sum()",[1371,4342,1373],{"id":1373},[11,4344,4345],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[11,4347,4348],{},[27,4349],{"alt":4350,"src":4351},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[11,4353,4354],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[15,4356,115],{"id":115},[42,4358,4359,4365],{},[45,4360,4361,4362,4364],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,4363,4061],{}," 再在函数内创建。",[45,4366,4367],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[15,4369,129],{"id":129},[97,4371,4372,4375],{},[45,4373,4374],{},"给问候函数增加默认称呼。",[45,4376,4377],{},"编写接收任意数量分数并返回总分的函数。",[11,4379,140],{},[15,4381,143],{"id":143},[11,4383,4384],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,4386,150],{},{"title":69,"searchDepth":152,"depth":152,"links":4388},[4389,4390,4391,4392,4393,4396,4397,4398],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":4394},[4395],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":4214,"description":4219},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[162,4406,4407],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":4410,"title":4411,"body":4412,"category":162,"cover":163,"description":4416,"extension":164,"meta":4613,"navigation":166,"path":4614,"pinned":168,"publishedAt":169,"seo":4615,"slug":4616,"stem":4617,"summary":4618,"tags":4619,"updatedAt":169,"visible":166,"__hash__":4622},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":8,"value":4413,"toc":4601},[4414,4417,4419,4422,4424,4430,4433,4435,4452,4454,4456,4519,4521,4527,4529,4531,4558,4560,4563,4569,4572,4574,4582,4584,4592,4594,4596,4599],[11,4415,4416],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[15,4418,17],{"id":17},[11,4420,4421],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,4423,23],{"id":23},[11,4425,4426],{},[27,4427],{"alt":4428,"src":4429},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[11,4431,4432],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[15,4434,40],{"id":40},[42,4436,4437,4440,4443],{},[45,4438,4439],{},"函数内部赋值默认创建局部变量。",[45,4441,4442],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[45,4444,4445,847,4448,4451],{},[34,4446,4447],{},"global",[34,4449,4450],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[15,4453,59],{"id":59},[11,4455,62],{},[64,4457,4459],{"className":66,"code":4458,"language":68,"meta":69,"style":69},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,4460,4461,4466,4470,4475,4480,4484,4489,4494,4499,4503,4508,4513],{"__ignoreMap":69},[73,4462,4463],{"class":75,"line":76},[73,4464,4465],{},"course = \"Python\"\n",[73,4467,4468],{"class":75,"line":152},[73,4469,956],{"emptyLinePlaceholder":166},[73,4471,4472],{"class":75,"line":420},[73,4473,4474],{},"def outer():\n",[73,4476,4477],{"class":75,"line":426},[73,4478,4479],{},"    level = \"基础\"\n",[73,4481,4482],{"class":75,"line":618},[73,4483,956],{"emptyLinePlaceholder":166},[73,4485,4486],{"class":75,"line":1156},[73,4487,4488],{},"    def show():\n",[73,4490,4491],{"class":75,"line":1162},[73,4492,4493],{},"        lesson = \"作用域\"\n",[73,4495,4496],{"class":75,"line":1168},[73,4497,4498],{},"        print(course, level, lesson)\n",[73,4500,4501],{"class":75,"line":2630},[73,4502,956],{"emptyLinePlaceholder":166},[73,4504,4505],{"class":75,"line":2845},[73,4506,4507],{},"    show()\n",[73,4509,4511],{"class":75,"line":4510},11,[73,4512,956],{"emptyLinePlaceholder":166},[73,4514,4516],{"class":75,"line":4515},12,[73,4517,4518],{},"outer()\n",[11,4520,81],{},[64,4522,4525],{"className":4523,"code":4524,"language":87,"meta":69},[85],"Python 基础 作用域\n",[34,4526,4524],{"__ignoreMap":69},[11,4528,92],{},[15,4530,95],{"id":95},[97,4532,4533,4550],{},[45,4534,4535,4538,4539,4542,4543,4545,4546,4549],{},[34,4536,4537],{},"show()"," 中查找 ",[34,4540,4541],{},"lesson"," 时先在局部找到，查找 ",[34,4544,4330],{}," 时到外层 ",[34,4547,4548],{},"outer()"," 找到。",[45,4551,4552,4554,4555,4557],{},[34,4553,3265],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,4556,879],{}," 最后在内置作用域找到。",[1371,4559,1373],{"id":1373},[11,4561,4562],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[11,4564,4565],{},[27,4566],{"alt":4567,"src":4568},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[11,4570,4571],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[15,4573,115],{"id":115},[42,4575,4576,4579],{},[45,4577,4578],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[45,4580,4581],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[15,4583,129],{"id":129},[97,4585,4586,4589],{},[45,4587,4588],{},"在内外层定义同名变量，观察最近作用域优先。",[45,4590,4591],{},"尝试在函数外访问局部变量，记录异常类型。",[11,4593,140],{},[15,4595,143],{"id":143},[11,4597,4598],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,4600,150],{},{"title":69,"searchDepth":152,"depth":152,"links":4602},[4603,4604,4605,4606,4607,4610,4611,4612],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":4608},[4609],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":4411,"description":4416},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[162,4620,4621],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":4624,"title":4625,"body":4626,"category":162,"cover":163,"description":4630,"extension":164,"meta":4780,"navigation":166,"path":4781,"pinned":168,"publishedAt":169,"seo":4782,"slug":4783,"stem":4784,"summary":4785,"tags":4786,"updatedAt":169,"visible":166,"__hash__":4789},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":8,"value":4627,"toc":4770},[4628,4631,4633,4636,4638,4644,4647,4649,4668,4670,4672,4706,4708,4714,4716,4718,4733,4735,4747,4749,4761,4763,4765,4768],[11,4629,4630],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[15,4632,17],{"id":17},[11,4634,4635],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,4637,23],{"id":23},[11,4639,4640],{},[27,4641],{"alt":4642,"src":4643},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[11,4645,4646],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[15,4648,40],{"id":40},[42,4650,4651,4654,4657],{},[45,4652,4653],{},"文档字符串紧跟在函数定义后的第一条语句。",[45,4655,4656],{},"注解表达接口意图，不代替输入校验和测试。",[45,4658,4659,4660,928,4662,928,4664,4667],{},"基础注解优先使用 ",[34,4661,931],{},[34,4663,1098],{},[34,4665,4666],{},"list[str]"," 等直接写法。",[15,4669,59],{"id":59},[11,4671,62],{},[64,4673,4675],{"className":66,"code":4674,"language":68,"meta":69,"style":69},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,4676,4677,4682,4687,4692,4696,4701],{"__ignoreMap":69},[73,4678,4679],{"class":75,"line":76},[73,4680,4681],{},"def format_score(name: str, score: int) -> str:\n",[73,4683,4684],{"class":75,"line":152},[73,4685,4686],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[73,4688,4689],{"class":75,"line":420},[73,4690,4691],{},"    return name + \"：\" + str(score)\n",[73,4693,4694],{"class":75,"line":426},[73,4695,956],{"emptyLinePlaceholder":166},[73,4697,4698],{"class":75,"line":618},[73,4699,4700],{},"print(format_score(\"小郑\", 95))\n",[73,4702,4703],{"class":75,"line":1156},[73,4704,4705],{},"print(format_score.__doc__)\n",[11,4707,81],{},[64,4709,4712],{"className":4710,"code":4711,"language":87,"meta":69},[85],"小郑：95\n返回带姓名的分数文本。\n",[34,4713,4711],{"__ignoreMap":69},[11,4715,92],{},[15,4717,95],{"id":95},[97,4719,4720,4730],{},[45,4721,4722,4723,4726,4727,4729],{},"函数签名说明 ",[34,4724,4725],{},"name"," 预期为字符串、",[34,4728,917],{}," 预期为整数，返回值预期为字符串。",[45,4731,4732],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[15,4734,115],{"id":115},[42,4736,4737,4744],{},[45,4738,4739,4740,4743],{},"认为加了 ",[34,4741,4742],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[45,4745,4746],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[15,4748,129],{"id":129},[97,4750,4751,4754],{},[45,4752,4753],{},"为面积函数补充参数和返回值注解。",[45,4755,4756,4757,4760],{},"通过 ",[34,4758,4759],{},"函数名.__doc__"," 查看文档字符串。",[11,4762,140],{},[15,4764,143],{"id":143},[11,4766,4767],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,4769,150],{},{"title":69,"searchDepth":152,"depth":152,"links":4771},[4772,4773,4774,4775,4776,4777,4778,4779],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":4625,"description":4630},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[162,4787,4788],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":4791,"title":4792,"body":4793,"category":162,"cover":163,"description":4797,"extension":164,"meta":5025,"navigation":166,"path":5026,"pinned":168,"publishedAt":169,"seo":5027,"slug":5028,"stem":5029,"summary":5030,"tags":5031,"updatedAt":169,"visible":166,"__hash__":5034},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":8,"value":4794,"toc":5013},[4795,4798,4800,4807,4809,4815,4826,4828,4846,4848,4855,4884,4891,4910,4919,4921,4927,4929,4931,4954,4956,4959,4965,4971,4973,4989,4991,5004,5006,5008,5011],[11,4796,4797],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[15,4799,17],{"id":17},[11,4801,4802,4803,4806],{},"本篇只处理“模块、import 与 ",[4804,4805,4725],"strong",{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,4808,23],{"id":23},[11,4810,4811],{},[27,4812],{"alt":4813,"src":4814},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[11,4816,4817,4818,4821,4822,4825],{},"同一个文件直接运行时 ",[34,4819,4820],{},"__name__"," 等于 ",[34,4823,4824],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[15,4827,40],{"id":40},[42,4829,4830,4836,4839],{},[45,4831,4832,4833,4835],{},"一个 ",[34,4834,36],{}," 文件就是一个模块。",[45,4837,4838],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[45,4840,4841,4842,4845],{},"避免使用 ",[34,4843,4844],{},"from module import *","，它会让名字来源不清楚。",[15,4847,59],{"id":59},[11,4849,4850,4851,4854],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,4852,4853],{},"calculator.py","：",[64,4856,4858],{"className":66,"code":4857,"language":68,"meta":69,"style":69},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,4859,4860,4865,4870,4874,4879],{"__ignoreMap":69},[73,4861,4862],{"class":75,"line":76},[73,4863,4864],{},"def add(left, right):\n",[73,4866,4867],{"class":75,"line":152},[73,4868,4869],{},"    return left + right\n",[73,4871,4872],{"class":75,"line":420},[73,4873,956],{"emptyLinePlaceholder":166},[73,4875,4876],{"class":75,"line":426},[73,4877,4878],{},"if __name__ == \"__main__\":\n",[73,4880,4881],{"class":75,"line":618},[73,4882,4883],{},"    print(add(2, 3))\n",[11,4885,4886,4887,4890],{},"再创建 ",[34,4888,4889],{},"app.py","，从模块中导入函数：",[64,4892,4894],{"className":66,"code":4893,"language":68,"meta":69,"style":69},"from calculator import add\n\nprint(add(10, 20))\n",[34,4895,4896,4901,4905],{"__ignoreMap":69},[73,4897,4898],{"class":75,"line":76},[73,4899,4900],{},"from calculator import add\n",[73,4902,4903],{"class":75,"line":152},[73,4904,956],{"emptyLinePlaceholder":166},[73,4906,4907],{"class":75,"line":420},[73,4908,4909],{},"print(add(10, 20))\n",[11,4911,4912,4913,666,4916,383],{},"分别执行 ",[34,4914,4915],{},"python3 calculator.py",[34,4917,4918],{},"python3 app.py",[11,4920,81],{},[64,4922,4925],{"className":4923,"code":4924,"language":87,"meta":69},[85],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,4926,4924],{"__ignoreMap":69},[11,4928,92],{},[15,4930,95],{"id":95},[97,4932,4933,4943],{},[45,4934,4935,4936,4938,4939,4942],{},"直接运行 ",[34,4937,4853],{}," 时，模块名是 ",[34,4940,4941],{},"__main__","，入口代码输出 5。",[45,4944,4945,4947,4948,4950,4951,4953],{},[34,4946,4889],{}," 导入模块时，",[34,4949,4853],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,4952,4889],{}," 调用函数输出 30。",[1371,4955,1373],{"id":1373},[11,4957,4958],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[11,4960,4961],{},[27,4962],{"alt":4963,"src":4964},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[11,4966,4967,4968,4970],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,4969,4941],{}," 保护下的演示代码。",[15,4972,115],{"id":115},[42,4974,4975,4982],{},[45,4976,4977,4978,666,4980,383],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,4979,4853],{},[34,4981,4889],{},[45,4983,4984,4985,4988],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,4986,4987],{},"json.py","，导致导入目标被遮蔽。",[15,4990,129],{"id":129},[97,4992,4993,4999],{},[45,4994,1026,4995,4998],{},[34,4996,4997],{},"text_tools.py"," 并导出一个格式化函数。",[45,5000,5001,5002,383],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,5003,4820],{},[11,5005,140],{},[15,5007,143],{"id":143},[11,5009,5010],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,5012,150],{},{"title":69,"searchDepth":152,"depth":152,"links":5014},[5015,5016,5017,5018,5019,5022,5023,5024],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":5020},[5021],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":4792,"description":4797},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[162,5032,5033],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":5036,"title":5037,"body":5038,"category":162,"cover":163,"description":5042,"extension":164,"meta":5207,"navigation":166,"path":5208,"pinned":168,"publishedAt":169,"seo":5209,"slug":5210,"stem":5211,"summary":5212,"tags":5213,"updatedAt":169,"visible":166,"__hash__":5216},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":8,"value":5039,"toc":5197},[5040,5043,5045,5048,5050,5056,5059,5061,5075,5077,5079,5125,5127,5133,5135,5137,5163,5165,5175,5177,5188,5190,5192,5195],[11,5041,5042],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[15,5044,17],{"id":17},[11,5046,5047],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,5049,23],{"id":23},[11,5051,5052],{},[27,5053],{"alt":5054,"src":5055},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[11,5057,5058],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[15,5060,40],{"id":40},[42,5062,5063,5069,5072],{},[45,5064,5065,5068],{},[34,5066,5067],{},".venv"," 是常见目录名，不应提交到 Git。",[45,5070,5071],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[45,5073,5074],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[15,5076,59],{"id":59},[11,5078,227],{},[64,5080,5082],{"className":230,"code":5081,"language":232,"meta":69,"style":69},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,5083,5084,5096,5104,5110,5120],{"__ignoreMap":69},[73,5085,5086,5088,5090,5093],{"class":75,"line":76},[73,5087,204],{"class":239},[73,5089,250],{"class":242},[73,5091,5092],{"class":253}," venv",[73,5094,5095],{"class":253}," .venv\n",[73,5097,5098,5101],{"class":75,"line":152},[73,5099,5100],{"class":242},"source",[73,5102,5103],{"class":253}," .venv\u002Fbin\u002Factivate\n",[73,5105,5106,5108],{"class":75,"line":420},[73,5107,68],{"class":239},[73,5109,243],{"class":242},[73,5111,5112,5114,5116,5118],{"class":75,"line":426},[73,5113,68],{"class":239},[73,5115,250],{"class":242},[73,5117,254],{"class":253},[73,5119,243],{"class":242},[73,5121,5122],{"class":75,"line":618},[73,5123,5124],{"class":239},"deactivate\n",[11,5126,81],{},[64,5128,5131],{"className":5129,"code":5130,"language":87,"meta":69},[85],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,5132,5130],{"__ignoreMap":69},[11,5134,92],{},[15,5136,95],{"id":95},[97,5138,5139,5148],{},[45,5140,5141,5144,5145,5147],{},[34,5142,5143],{},"venv"," 根据当前 ",[34,5146,204],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[45,5149,5150,5151,847,5153,5156,5157,2405,5159,5162],{},"激活后 ",[34,5152,68],{},[34,5154,5155],{},"python -m pip"," 优先指向 ",[34,5158,5067],{},[34,5160,5161],{},"deactivate"," 只恢复当前终端的命令查找。",[15,5164,115],{"id":115},[42,5166,5167,5170],{},[45,5168,5169],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[45,5171,2144,5172,5174],{},[34,5173,5067],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[15,5176,129],{"id":129},[97,5178,5179,5185],{},[45,5180,5181,5182,383],{},"创建虚拟环境并记录激活前后的 ",[34,5183,5184],{},"which python",[45,5186,5187],{},"退出后重新激活，确认项目环境可以重复使用。",[11,5189,140],{},[15,5191,143],{"id":143},[11,5193,5194],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,5196,322],{},{"title":69,"searchDepth":152,"depth":152,"links":5198},[5199,5200,5201,5202,5203,5204,5205,5206],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":5037,"description":5042},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[162,5214,5215],"虚拟环境","pip","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":5218,"title":5219,"body":5220,"category":162,"cover":163,"description":5224,"extension":164,"meta":5412,"navigation":166,"path":5413,"pinned":168,"publishedAt":169,"seo":5414,"slug":5415,"stem":5416,"summary":5417,"tags":5418,"updatedAt":169,"visible":166,"__hash__":5421},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":8,"value":5221,"toc":5402},[5222,5225,5227,5230,5232,5238,5247,5249,5273,5275,5277,5330,5332,5338,5340,5342,5358,5360,5379,5381,5393,5395,5397,5400],[11,5223,5224],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[15,5226,17],{"id":17},[11,5228,5229],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,5231,23],{"id":23},[11,5233,5234],{},[27,5235],{"alt":5236,"src":5237},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[11,5239,5240,5243,5244,5246],{},[34,5241,5242],{},"Path"," 使用 ",[34,5245,1108],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[15,5248,40],{"id":40},[42,5250,5251,5254,5266],{},[45,5252,5253],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[45,5255,5256,928,5259,928,5262,5265],{},[34,5257,5258],{},"exists()",[34,5260,5261],{},"is_file()",[34,5263,5264],{},"is_dir()"," 检查真实文件系统状态。",[45,5267,5268,5269,5272],{},"创建目录前明确目标；",[34,5270,5271],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[15,5274,59],{"id":59},[11,5276,62],{},[64,5278,5280],{"className":66,"code":5279,"language":68,"meta":69,"style":69},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[34,5281,5282,5287,5291,5296,5301,5306,5310,5315,5320,5325],{"__ignoreMap":69},[73,5283,5284],{"class":75,"line":76},[73,5285,5286],{},"from pathlib import Path\n",[73,5288,5289],{"class":75,"line":152},[73,5290,956],{"emptyLinePlaceholder":166},[73,5292,5293],{"class":75,"line":420},[73,5294,5295],{},"project = Path.cwd()\n",[73,5297,5298],{"class":75,"line":426},[73,5299,5300],{},"data_dir = project \u002F \"data\"\n",[73,5302,5303],{"class":75,"line":618},[73,5304,5305],{},"file_path = data_dir \u002F \"records.json\"\n",[73,5307,5308],{"class":75,"line":1156},[73,5309,956],{"emptyLinePlaceholder":166},[73,5311,5312],{"class":75,"line":1162},[73,5313,5314],{},"print(project)\n",[73,5316,5317],{"class":75,"line":1168},[73,5318,5319],{},"print(file_path.name)\n",[73,5321,5322],{"class":75,"line":2630},[73,5323,5324],{},"print(file_path.suffix)\n",[73,5326,5327],{"class":75,"line":2845},[73,5328,5329],{},"print(file_path.exists())\n",[11,5331,81],{},[64,5333,5336],{"className":5334,"code":5335,"language":87,"meta":69},[85],"显示当前项目路径、records.json、.json 和存在状态\n",[34,5337,5335],{"__ignoreMap":69},[11,5339,92],{},[15,5341,95],{"id":95},[97,5343,5344,5350],{},[45,5345,5346,5349],{},[34,5347,5348],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[45,5351,1011,5352,5354,5355,5357],{},[34,5353,1108],{}," 组合路径片段只创建新的 ",[34,5356,5242],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[15,5359,115],{"id":115},[42,5361,5362,5370],{},[45,5363,2144,5364,5366,5367,5369],{},[34,5365,5242],{}," 对象存在当成真实文件存在，仍需调用 ",[34,5368,5258],{}," 等方法确认。",[45,5371,5372,5373,1471,5375,5378],{},"手工拼接 ",[34,5374,1108],{},[34,5376,5377],{},"\\"," 分隔符，降低跨平台可读性。",[15,5380,129],{"id":129},[97,5382,5383,5390],{},[45,5384,5385,5386,5389],{},"组合 ",[34,5387,5388],{},"output\u002Freport.txt"," 路径但先不创建文件。",[45,5391,5392],{},"输出路径的父目录、文件名和扩展名。",[11,5394,140],{},[15,5396,143],{"id":143},[11,5398,5399],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,5401,150],{},{"title":69,"searchDepth":152,"depth":152,"links":5403},[5404,5405,5406,5407,5408,5409,5410,5411],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":5219,"description":5224},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[162,5419,5420],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":5423,"title":5424,"body":5425,"category":162,"cover":163,"description":5429,"extension":164,"meta":5608,"navigation":166,"path":5609,"pinned":168,"publishedAt":169,"seo":5610,"slug":5611,"stem":5612,"summary":5613,"tags":5614,"updatedAt":169,"visible":166,"__hash__":5617},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":8,"value":5426,"toc":5598},[5427,5430,5432,5435,5437,5443,5446,5448,5476,5478,5480,5537,5539,5545,5547,5549,5560,5562,5575,5577,5589,5591,5593,5596],[11,5428,5429],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[15,5431,17],{"id":17},[11,5433,5434],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,5436,23],{"id":23},[11,5438,5439],{},[27,5440],{"alt":5441,"src":5442},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[11,5444,5445],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[15,5447,40],{"id":40},[42,5449,5450,5456,5465],{},[45,5451,5452,5455],{},[34,5453,5454],{},"w"," 模式会截断原文件，写入前必须确认目标。",[45,5457,5458,5461,5462,383],{},[34,5459,5460],{},"r"," 模式读取不存在文件会产生 ",[34,5463,5464],{},"FileNotFoundError",[45,5466,5467,5468,5471,5472,5475],{},"本篇显式调用 ",[34,5469,5470],{},"close()","；第 34 篇会用 ",[34,5473,5474],{},"with"," 更可靠地管理关闭动作。",[15,5477,59],{"id":59},[11,5479,62],{},[64,5481,5483],{"className":66,"code":5482,"language":68,"meta":69,"style":69},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[34,5484,5485,5489,5493,5498,5503,5508,5513,5517,5522,5527,5532],{"__ignoreMap":69},[73,5486,5487],{"class":75,"line":76},[73,5488,5286],{},[73,5490,5491],{"class":75,"line":152},[73,5492,956],{"emptyLinePlaceholder":166},[73,5494,5495],{"class":75,"line":420},[73,5496,5497],{},"file_path = Path(\"notes.txt\")\n",[73,5499,5500],{"class":75,"line":426},[73,5501,5502],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[73,5504,5505],{"class":75,"line":618},[73,5506,5507],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[73,5509,5510],{"class":75,"line":1156},[73,5511,5512],{},"writer.close()\n",[73,5514,5515],{"class":75,"line":1162},[73,5516,956],{"emptyLinePlaceholder":166},[73,5518,5519],{"class":75,"line":1168},[73,5520,5521],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[73,5523,5524],{"class":75,"line":2630},[73,5525,5526],{},"content = reader.read()\n",[73,5528,5529],{"class":75,"line":2845},[73,5530,5531],{},"reader.close()\n",[73,5533,5534],{"class":75,"line":4510},[73,5535,5536],{},"print(content)\n",[11,5538,81],{},[64,5540,5543],{"className":5541,"code":5542,"language":87,"meta":69},[85],"变量\n循环\n函数\n",[34,5544,5542],{"__ignoreMap":69},[11,5546,92],{},[15,5548,95],{"id":95},[97,5550,5551,5557],{},[45,5552,5553,5554,5556],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,5555,5470],{}," 确保缓冲内容交给文件系统。",[45,5558,5559],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[15,5561,115],{"id":115},[42,5563,5564,5569],{},[45,5565,1011,5566,5568],{},[34,5567,5454],{}," 模式打开重要文件却未确认覆盖风险。",[45,5570,5571,5572,383],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,5573,5574],{},"encoding=\"utf-8\"",[15,5576,129],{"id":129},[97,5578,5579,5582],{},[45,5580,5581],{},"写入三行学习记录并读取。",[45,5583,5584,5585,5588],{},"改用 ",[34,5586,5587],{},"a"," 模式追加一行，确认原内容仍保留。",[11,5590,140],{},[15,5592,143],{"id":143},[11,5594,5595],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,5597,150],{},{"title":69,"searchDepth":152,"depth":152,"links":5599},[5600,5601,5602,5603,5604,5605,5606,5607],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":5424,"description":5429},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[162,5615,5616],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":5619,"title":5620,"body":5621,"category":162,"cover":163,"description":5625,"extension":164,"meta":5792,"navigation":166,"path":5793,"pinned":168,"publishedAt":169,"seo":5794,"slug":5795,"stem":5796,"summary":5797,"tags":5798,"updatedAt":169,"visible":166,"__hash__":5801},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":8,"value":5622,"toc":5782},[5623,5626,5628,5631,5633,5639,5649,5651,5665,5667,5669,5729,5731,5737,5739,5741,5753,5755,5763,5765,5773,5775,5777,5780],[11,5624,5625],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[15,5627,17],{"id":17},[11,5629,5630],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,5632,23],{"id":23},[11,5634,5635],{},[27,5636],{"alt":5637,"src":5638},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[11,5640,5641,5644,5645,5648],{},[34,5642,5643],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,5646,5647],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[15,5650,40],{"id":40},[42,5652,5653,5656,5662],{},[45,5654,5655],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[45,5657,5658,5661],{},[34,5659,5660],{},"ensure_ascii=False"," 让中文以可读字符写入。",[45,5663,5664],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[15,5666,59],{"id":59},[11,5668,62],{},[64,5670,5672],{"className":66,"code":5671,"language":68,"meta":69,"style":69},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[34,5673,5674,5679,5683,5688,5692,5697,5702,5706,5710,5715,5720,5724],{"__ignoreMap":69},[73,5675,5676],{"class":75,"line":76},[73,5677,5678],{},"import json\n",[73,5680,5681],{"class":75,"line":152},[73,5682,956],{"emptyLinePlaceholder":166},[73,5684,5685],{"class":75,"line":420},[73,5686,5687],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[73,5689,5690],{"class":75,"line":426},[73,5691,956],{"emptyLinePlaceholder":166},[73,5693,5694],{"class":75,"line":618},[73,5695,5696],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[73,5698,5699],{"class":75,"line":1156},[73,5700,5701],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[73,5703,5704],{"class":75,"line":1162},[73,5705,5512],{},[73,5707,5708],{"class":75,"line":1168},[73,5709,956],{"emptyLinePlaceholder":166},[73,5711,5712],{"class":75,"line":2630},[73,5713,5714],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[73,5716,5717],{"class":75,"line":2845},[73,5718,5719],{},"loaded = json.load(reader)\n",[73,5721,5722],{"class":75,"line":4510},[73,5723,5531],{},[73,5725,5726],{"class":75,"line":4515},[73,5727,5728],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[11,5730,81],{},[64,5732,5735],{"className":5733,"code":5734,"language":87,"meta":69},[85],"Python 60\n",[34,5736,5734],{"__ignoreMap":69},[11,5738,92],{},[15,5740,95],{"id":95},[97,5742,5743,5748],{},[45,5744,5745,5747],{},[34,5746,5643],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[45,5749,5750,5752],{},[34,5751,5647],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[15,5754,115],{"id":115},[42,5756,5757,5760],{},[45,5758,5759],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[45,5761,5762],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[15,5764,129],{"id":129},[97,5766,5767,5770],{},[45,5768,5769],{},"保存包含两条学习记录的列表。",[45,5771,5772],{},"读取后修改进度，再重新写回文件。",[11,5774,140],{},[15,5776,143],{"id":143},[11,5778,5779],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,5781,150],{},{"title":69,"searchDepth":152,"depth":152,"links":5783},[5784,5785,5786,5787,5788,5789,5790,5791],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":5620,"description":5625},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[162,5799,5800],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":5803,"title":5804,"body":5805,"category":162,"cover":163,"description":5809,"extension":164,"meta":5993,"navigation":166,"path":5994,"pinned":168,"publishedAt":169,"seo":5995,"slug":5996,"stem":5997,"summary":5998,"tags":5999,"updatedAt":169,"visible":166,"__hash__":6002},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":8,"value":5806,"toc":5983},[5807,5810,5812,5815,5817,5823,5829,5831,5853,5855,5857,5920,5922,5928,5930,5932,5948,5950,5964,5966,5974,5976,5978,5981],[11,5808,5809],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[15,5811,17],{"id":17},[11,5813,5814],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,5816,23],{"id":23},[11,5818,5819],{},[27,5820],{"alt":5821,"src":5822},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[11,5824,5825,5828],{},[34,5826,5827],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[15,5830,40],{"id":40},[42,5832,5833,5843,5850],{},[45,5834,1011,5835,5838,5839,5842],{},[34,5836,5837],{},"newline=\"\""," 让 ",[34,5840,5841],{},"csv"," 模块正确处理换行。",[45,5844,5845,5846,5849],{},"字段顺序由 ",[34,5847,5848],{},"fieldnames"," 决定，字典键需要与字段名一致。",[45,5851,5852],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[15,5854,59],{"id":59},[11,5856,62],{},[64,5858,5860],{"className":66,"code":5859,"language":68,"meta":69,"style":69},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[34,5861,5862,5867,5871,5876,5881,5886,5891,5896,5900,5905,5910,5915],{"__ignoreMap":69},[73,5863,5864],{"class":75,"line":76},[73,5865,5866],{},"import csv\n",[73,5868,5869],{"class":75,"line":152},[73,5870,956],{"emptyLinePlaceholder":166},[73,5872,5873],{"class":75,"line":420},[73,5874,5875],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[73,5877,5878],{"class":75,"line":426},[73,5879,5880],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[73,5882,5883],{"class":75,"line":618},[73,5884,5885],{},"writer.writeheader()\n",[73,5887,5888],{"class":75,"line":1156},[73,5889,5890],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[73,5892,5893],{"class":75,"line":1162},[73,5894,5895],{},"writer_file.close()\n",[73,5897,5898],{"class":75,"line":1168},[73,5899,956],{"emptyLinePlaceholder":166},[73,5901,5902],{"class":75,"line":2630},[73,5903,5904],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[73,5906,5907],{"class":75,"line":2845},[73,5908,5909],{},"for row in csv.DictReader(reader_file):\n",[73,5911,5912],{"class":75,"line":4510},[73,5913,5914],{},"    print(row[\"name\"], row[\"score\"])\n",[73,5916,5917],{"class":75,"line":4515},[73,5918,5919],{},"reader_file.close()\n",[11,5921,81],{},[64,5923,5926],{"className":5924,"code":5925,"language":87,"meta":69},[85],"小郑 95\n",[34,5927,5925],{"__ignoreMap":69},[11,5929,92],{},[15,5931,95],{"id":95},[97,5933,5934,5943],{},[45,5935,5936,5939,5940,5942],{},[34,5937,5938],{},"DictWriter"," 按 ",[34,5941,5848],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[45,5944,5945,5947],{},[34,5946,5827],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[15,5949,115],{"id":115},[42,5951,5952,5955],{},[45,5953,5954],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[45,5956,5957,5958,5960,5961,5963],{},"在 macOS 以外环境忽略 ",[34,5959,5837],{}," 可能出现额外空行；统一交给 ",[34,5962,5841],{}," 模块管理换行。",[15,5965,129],{"id":129},[97,5967,5968,5971],{},[45,5969,5970],{},"写入三名学习者的课程和分数。",[45,5972,5973],{},"读取 CSV 后把分数字符串转换为整数。",[11,5975,140],{},[15,5977,143],{"id":143},[11,5979,5980],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,5982,150],{},{"title":69,"searchDepth":152,"depth":152,"links":5984},[5985,5986,5987,5988,5989,5990,5991,5992],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":5804,"description":5809},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[162,6000,6001],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":6004,"title":6005,"body":6006,"category":162,"cover":163,"description":6010,"extension":164,"meta":6283,"navigation":166,"path":6284,"pinned":168,"publishedAt":169,"seo":6285,"slug":6286,"stem":6287,"summary":6288,"tags":6289,"updatedAt":169,"visible":166,"__hash__":6292},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":8,"value":6007,"toc":6270},[6008,6011,6013,6016,6018,6024,6035,6037,6054,6056,6058,6133,6135,6141,6143,6145,6170,6172,6181,6187,6198,6200,6206,6212,6221,6223,6238,6240,6261,6263,6265,6268],[11,6009,6010],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[15,6012,17],{"id":17},[11,6014,6015],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,6017,23],{"id":23},[11,6019,6020],{},[27,6021],{"alt":6022,"src":6023},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[11,6025,6026,6027,6030,6031,6034],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,6028,6029],{},"except","；无论是否异常，",[34,6032,6033],{},"finally"," 都会在离开结构前执行。",[15,6036,40],{"id":40},[42,6038,6039,6045,6051],{},[45,6040,6041,6042,6044],{},"只捕获能够处理的具体异常，不使用空的 ",[34,6043,6029],{}," 吞掉全部错误。",[45,6046,6047,6050],{},[34,6048,6049],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[45,6052,6053],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[15,6055,59],{"id":59},[11,6057,62],{},[64,6059,6061],{"className":66,"code":6060,"language":68,"meta":69,"style":69},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[34,6062,6063,6068,6073,6078,6083,6088,6092,6097,6102,6107,6112,6116,6121,6127],{"__ignoreMap":69},[73,6064,6065],{"class":75,"line":76},[73,6066,6067],{},"def parse_age(text):\n",[73,6069,6070],{"class":75,"line":152},[73,6071,6072],{},"    age = int(text)\n",[73,6074,6075],{"class":75,"line":420},[73,6076,6077],{},"    if age \u003C 0:\n",[73,6079,6080],{"class":75,"line":426},[73,6081,6082],{},"        raise ValueError(\"年龄不能为负数\")\n",[73,6084,6085],{"class":75,"line":618},[73,6086,6087],{},"    return age\n",[73,6089,6090],{"class":75,"line":1156},[73,6091,956],{"emptyLinePlaceholder":166},[73,6093,6094],{"class":75,"line":1162},[73,6095,6096],{},"try:\n",[73,6098,6099],{"class":75,"line":1168},[73,6100,6101],{},"    age = parse_age(\"18\")\n",[73,6103,6104],{"class":75,"line":2630},[73,6105,6106],{},"except ValueError as error:\n",[73,6108,6109],{"class":75,"line":2845},[73,6110,6111],{},"    print(\"输入错误：\", error)\n",[73,6113,6114],{"class":75,"line":4510},[73,6115,2833],{},[73,6117,6118],{"class":75,"line":4515},[73,6119,6120],{},"    print(\"年龄：\", age)\n",[73,6122,6124],{"class":75,"line":6123},13,[73,6125,6126],{},"finally:\n",[73,6128,6130],{"class":75,"line":6129},14,[73,6131,6132],{},"    print(\"处理结束\")\n",[11,6134,81],{},[64,6136,6139],{"className":6137,"code":6138,"language":87,"meta":69},[85],"年龄： 18\n处理结束\n",[34,6140,6138],{"__ignoreMap":69},[11,6142,92],{},[15,6144,95],{"id":95},[97,6146,6147,6159],{},[45,6148,6149,6151,6152,6154,6155,6158],{},[34,6150,1713],{}," 或主动 ",[34,6153,6049],{}," 都可能产生 ",[34,6156,6157],{},"ValueError","，控制流立即离开当前正常路径。",[45,6160,6161,6162,6164,6165,6167,6168,383],{},"有异常时进入匹配的 ",[34,6163,6029],{},"；没有异常时执行 ",[34,6166,2776],{},"；两种情况最后都会执行 ",[34,6169,6033],{},[1371,6171,1373],{"id":1373},[11,6173,6174,928,6176,666,6178,6180],{},[34,6175,6029],{},[34,6177,2776],{},[34,6179,6033],{}," 的职责不同，不能只看它们出现的顺序。",[11,6182,6183],{},[27,6184],{"alt":6185,"src":6186},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[11,6188,6189,6191,6192,6194,6195,6197],{},[34,6190,6029],{}," 处理匹配异常，",[34,6193,2776],{}," 只在无异常时运行，",[34,6196,6033],{}," 负责两条路径都需要的清理动作。",[1371,6199,1373],{"id":2900},[11,6201,6202,6205],{},[34,6203,6204],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[11,6207,6208],{},[27,6209],{"alt":6210,"src":6211},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[11,6213,6214,6215,6217,6218,6220],{},"只把可能产生预期异常的操作放进 ",[34,6216,6204],{},"，后续正常业务放进 ",[34,6219,2776],{},"，错误边界会更清楚。",[15,6222,115],{"id":115},[42,6224,6225,6232],{},[45,6226,6227,6228,6231],{},"使用裸 ",[34,6229,6230],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[45,6233,6234,6235,6237],{},"把整个程序包在一个巨大 ",[34,6236,6204],{}," 中，无法判断究竟哪一步允许失败。",[15,6239,129],{"id":129},[97,6241,6242,6255],{},[45,6243,6244,6245,6248,6249,666,6252,383],{},"让 ",[34,6246,6247],{},"parse_age"," 分别处理 ",[34,6250,6251],{},"\"abc\"",[34,6253,6254],{},"\"-1\"",[45,6256,6257,6258,6260],{},"为文件读取捕获 ",[34,6259,5464],{}," 并给出清晰提示。",[11,6262,140],{},[15,6264,143],{"id":143},[11,6266,6267],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,6269,150],{},{"title":69,"searchDepth":152,"depth":152,"links":6271},[6272,6273,6274,6275,6276,6280,6281,6282],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":6277},[6278,6279],{"id":1373,"depth":420,"text":1373},{"id":2900,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":6005,"description":6010},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[162,6290,6291],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":6294,"title":6295,"body":6296,"category":162,"cover":163,"description":6300,"extension":164,"meta":6476,"navigation":166,"path":6477,"pinned":168,"publishedAt":169,"seo":6478,"slug":6479,"stem":6480,"summary":6481,"tags":6482,"updatedAt":169,"visible":166,"__hash__":6484},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":8,"value":6297,"toc":6466},[6298,6301,6303,6306,6308,6314,6320,6322,6338,6340,6342,6396,6398,6404,6406,6408,6421,6423,6436,6438,6457,6459,6461,6464],[11,6299,6300],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[15,6302,17],{"id":17},[11,6304,6305],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,6307,23],{"id":23},[11,6309,6310],{},[27,6311],{"alt":6312,"src":6313},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[11,6315,6316,6317,6319],{},"进入 ",[34,6318,5474],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[15,6321,40],{"id":40},[42,6323,6324,6329,6335],{},[45,6325,6326,6328],{},[34,6327,5474],{}," 把资源获取和释放配成一个清晰边界。",[45,6330,6331,6334],{},[34,6332,6333],{},"as file"," 得到的是上下文返回的资源对象。",[45,6336,6337],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[15,6339,59],{"id":59},[11,6341,62],{},[64,6343,6345],{"className":66,"code":6344,"language":68,"meta":69,"style":69},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[34,6346,6347,6351,6355,6359,6363,6368,6373,6377,6382,6387,6391],{"__ignoreMap":69},[73,6348,6349],{"class":75,"line":76},[73,6350,5286],{},[73,6352,6353],{"class":75,"line":152},[73,6354,956],{"emptyLinePlaceholder":166},[73,6356,6357],{"class":75,"line":420},[73,6358,5497],{},[73,6360,6361],{"class":75,"line":426},[73,6362,956],{"emptyLinePlaceholder":166},[73,6364,6365],{"class":75,"line":618},[73,6366,6367],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[73,6369,6370],{"class":75,"line":1156},[73,6371,6372],{},"    file.write(\"上下文管理器\\n\")\n",[73,6374,6375],{"class":75,"line":1162},[73,6376,956],{"emptyLinePlaceholder":166},[73,6378,6379],{"class":75,"line":1168},[73,6380,6381],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[73,6383,6384],{"class":75,"line":2630},[73,6385,6386],{},"    print(file.read())\n",[73,6388,6389],{"class":75,"line":2845},[73,6390,956],{"emptyLinePlaceholder":166},[73,6392,6393],{"class":75,"line":4510},[73,6394,6395],{},"print(file.closed)\n",[11,6397,81],{},[64,6399,6402],{"className":6400,"code":6401,"language":87,"meta":69},[85],"上下文管理器\n\nTrue\n",[34,6403,6401],{"__ignoreMap":69},[11,6405,92],{},[15,6407,95],{"id":95},[97,6409,6410,6418],{},[45,6411,6316,6412,6414,6415,383],{},[34,6413,5474],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,6416,6417],{},"file",[45,6419,6420],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[15,6422,115],{"id":115},[42,6424,6425,6430],{},[45,6426,3468,6427,6429],{},[34,6428,5474],{}," 代码块外继续读写已经关闭的文件对象。",[45,6431,6432,6433,6435],{},"误以为 ",[34,6434,5474],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[15,6437,129],{"id":129},[97,6439,6440,6449],{},[45,6441,6442,6443,6446,6447,383],{},"把第 30 篇的手动 ",[34,6444,6445],{},"open\u002Fclose"," 改写为 ",[34,6448,5474],{},[45,6450,3468,6451,6453,6454,383],{},[34,6452,5474],{}," 块后检查 ",[34,6455,6456],{},"file.closed",[11,6458,140],{},[15,6460,143],{"id":143},[11,6462,6463],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,6465,150],{},{"title":69,"searchDepth":152,"depth":152,"links":6467},[6468,6469,6470,6471,6472,6473,6474,6475],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":6295,"description":6300},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[162,5474,6483],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":6486,"title":6487,"body":6488,"category":162,"cover":163,"description":6492,"extension":164,"meta":6704,"navigation":166,"path":6705,"pinned":168,"publishedAt":169,"seo":6706,"slug":6707,"stem":6708,"summary":6709,"tags":6710,"updatedAt":169,"visible":166,"__hash__":6713},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":8,"value":6489,"toc":6692},[6490,6493,6495,6498,6500,6506,6509,6511,6528,6530,6532,6600,6602,6608,6610,6612,6637,6639,6642,6648,6657,6659,6670,6672,6683,6685,6687,6690],[11,6491,6492],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[15,6494,17],{"id":17},[11,6496,6497],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,6499,23],{"id":23},[11,6501,6502],{},[27,6503],{"alt":6504,"src":6505},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[11,6507,6508],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[15,6510,40],{"id":40},[42,6512,6513,6519,6525],{},[45,6514,6515,6518],{},[34,6516,6517],{},"self"," 表示当前实例，由方法调用自动传入。",[45,6520,6521,6524],{},[34,6522,6523],{},"__init__"," 在实例创建过程中初始化属性。",[45,6526,6527],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[15,6529,59],{"id":59},[11,6531,62],{},[64,6533,6535],{"className":66,"code":6534,"language":68,"meta":69,"style":69},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[34,6536,6537,6542,6547,6552,6557,6561,6566,6571,6576,6581,6585,6590,6595],{"__ignoreMap":69},[73,6538,6539],{"class":75,"line":76},[73,6540,6541],{},"class LearningRecord:\n",[73,6543,6544],{"class":75,"line":152},[73,6545,6546],{},"    def __init__(self, course, progress=0):\n",[73,6548,6549],{"class":75,"line":420},[73,6550,6551],{},"        self.course = course\n",[73,6553,6554],{"class":75,"line":426},[73,6555,6556],{},"        self.progress = progress\n",[73,6558,6559],{"class":75,"line":618},[73,6560,956],{"emptyLinePlaceholder":166},[73,6562,6563],{"class":75,"line":1156},[73,6564,6565],{},"    def advance(self, amount):\n",[73,6567,6568],{"class":75,"line":1162},[73,6569,6570],{},"        self.progress = self.progress + amount\n",[73,6572,6573],{"class":75,"line":1168},[73,6574,6575],{},"        if self.progress > 100:\n",[73,6577,6578],{"class":75,"line":2630},[73,6579,6580],{},"            self.progress = 100\n",[73,6582,6583],{"class":75,"line":2845},[73,6584,956],{"emptyLinePlaceholder":166},[73,6586,6587],{"class":75,"line":4510},[73,6588,6589],{},"record = LearningRecord(\"Python\", 40)\n",[73,6591,6592],{"class":75,"line":4515},[73,6593,6594],{},"record.advance(15)\n",[73,6596,6597],{"class":75,"line":6123},[73,6598,6599],{},"print(record.course, record.progress)\n",[11,6601,81],{},[64,6603,6606],{"className":6604,"code":6605,"language":87,"meta":69},[85],"Python 55\n",[34,6607,6605],{"__ignoreMap":69},[11,6609,92],{},[15,6611,95],{"id":95},[97,6613,6614,6624],{},[45,6615,6616,6617,6620,6621,6623],{},"调用 ",[34,6618,6619],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,6622,6523],{}," 把课程和进度保存在该实例属性中。",[45,6625,6626,6629,6630,6633,6634,6636],{},[34,6627,6628],{},"record.advance(15)"," 自动把 ",[34,6631,6632],{},"record"," 作为 ",[34,6635,6517],{},"，方法更新同一实例的进度并限制上限。",[1371,6638,1373],{"id":1373},[11,6640,6641],{},"类是共同定义，实例则各自保存状态。",[11,6643,6644],{},[27,6645],{"alt":6646,"src":6647},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[11,6649,6650,6651,666,6653,6656],{},"两个实例共享同一套方法定义，但 ",[34,6652,3265],{},[34,6654,6655],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[15,6658,115],{"id":115},[42,6660,6661,6667],{},[45,6662,6663,6664,6666],{},"调用实例方法时手工再传一次 ",[34,6665,6517],{},"。通过实例调用时 Python 会自动绑定。",[45,6668,6669],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[15,6671,129],{"id":129},[97,6673,6674,6680],{},[45,6675,3978,6676,6679],{},[34,6677,6678],{},"Book"," 类，保存标题和阅读页数。",[45,6681,6682],{},"增加方法更新阅读页数，并限制它不超过总页数。",[11,6684,140],{},[15,6686,143],{"id":143},[11,6688,6689],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,6691,150],{},{"title":69,"searchDepth":152,"depth":152,"links":6693},[6694,6695,6696,6697,6698,6701,6702,6703],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":6699},[6700],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":6487,"description":6492},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[162,6711,6712],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":6715,"title":6716,"body":6717,"category":162,"cover":163,"description":6721,"extension":164,"meta":6899,"navigation":166,"path":6900,"pinned":168,"publishedAt":169,"seo":6901,"slug":6902,"stem":6903,"summary":6904,"tags":6905,"updatedAt":169,"visible":166,"__hash__":6908},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":8,"value":6718,"toc":6889},[6719,6722,6724,6727,6729,6735,6738,6740,6751,6753,6755,6822,6824,6830,6832,6834,6853,6855,6863,6865,6880,6882,6884,6887],[11,6720,6721],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[15,6723,17],{"id":17},[11,6725,6726],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,6728,23],{"id":23},[11,6730,6731],{},[27,6732],{"alt":6733,"src":6734},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[11,6736,6737],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[15,6739,40],{"id":40},[42,6741,6742,6745,6748],{},[45,6743,6744],{},"封装让对象通过方法维护自己的有效状态。",[45,6746,6747],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[45,6749,6750],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[15,6752,59],{"id":59},[11,6754,62],{},[64,6756,6758],{"className":66,"code":6757,"language":68,"meta":69,"style":69},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[34,6759,6760,6765,6770,6775,6779,6784,6789,6794,6798,6803,6808,6812,6817],{"__ignoreMap":69},[73,6761,6762],{"class":75,"line":76},[73,6763,6764],{},"class Storage:\n",[73,6766,6767],{"class":75,"line":152},[73,6768,6769],{},"    def save(self, text):\n",[73,6771,6772],{"class":75,"line":420},[73,6773,6774],{},"        print(\"保存：\", text)\n",[73,6776,6777],{"class":75,"line":426},[73,6778,956],{"emptyLinePlaceholder":166},[73,6780,6781],{"class":75,"line":618},[73,6782,6783],{},"class LearningService:\n",[73,6785,6786],{"class":75,"line":1156},[73,6787,6788],{},"    def __init__(self, storage):\n",[73,6790,6791],{"class":75,"line":1162},[73,6792,6793],{},"        self.storage = storage\n",[73,6795,6796],{"class":75,"line":1168},[73,6797,956],{"emptyLinePlaceholder":166},[73,6799,6800],{"class":75,"line":2630},[73,6801,6802],{},"    def finish_lesson(self, title):\n",[73,6804,6805],{"class":75,"line":2845},[73,6806,6807],{},"        self.storage.save(title)\n",[73,6809,6810],{"class":75,"line":4510},[73,6811,956],{"emptyLinePlaceholder":166},[73,6813,6814],{"class":75,"line":4515},[73,6815,6816],{},"service = LearningService(Storage())\n",[73,6818,6819],{"class":75,"line":6123},[73,6820,6821],{},"service.finish_lesson(\"异常处理\")\n",[11,6823,81],{},[64,6825,6828],{"className":6826,"code":6827,"language":87,"meta":69},[85],"保存： 异常处理\n",[34,6829,6827],{"__ignoreMap":69},[11,6831,92],{},[15,6833,95],{"id":95},[97,6835,6836,6846],{},[45,6837,6838,6841,6842,6845],{},[34,6839,6840],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,6843,6844],{},"save()"," 的协作对象。",[45,6847,6848,6849,6852],{},"调用业务方法时，服务把保存动作委托给 ",[34,6850,6851],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[15,6854,115],{"id":115},[42,6856,6857,6860],{},[45,6858,6859],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[45,6861,6862],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[15,6864,129],{"id":129},[97,6866,6867,6877],{},[45,6868,6869,6870,6873,6874,383],{},"用组合让 ",[34,6871,6872],{},"OrderService"," 使用一个 ",[34,6875,6876],{},"Notifier",[45,6878,6879],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[11,6881,140],{},[15,6883,143],{"id":143},[11,6885,6886],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,6888,150],{},{"title":69,"searchDepth":152,"depth":152,"links":6890},[6891,6892,6893,6894,6895,6896,6897,6898],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":6716,"description":6721},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[162,6906,6907],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":6910,"title":6911,"body":6912,"category":162,"cover":163,"description":6916,"extension":164,"meta":7119,"navigation":166,"path":7120,"pinned":168,"publishedAt":169,"seo":7121,"slug":7122,"stem":7123,"summary":7124,"tags":7125,"updatedAt":169,"visible":166,"__hash__":7128},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":8,"value":6913,"toc":7107},[6914,6917,6919,6922,6924,6930,6937,6939,6964,6966,6968,7020,7022,7028,7030,7032,7053,7055,7061,7067,7073,7075,7083,7085,7098,7100,7102,7105],[11,6915,6916],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[15,6918,17],{"id":17},[11,6920,6921],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,6923,23],{"id":23},[11,6925,6926],{},[27,6927],{"alt":6928,"src":6929},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[11,6931,6932,6933,6936],{},"生成器运行到 ",[34,6934,6935],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[15,6938,40],{"id":40},[42,6940,6941,6951,6961],{},[45,6942,6943,6946,6947,6950],{},[34,6944,6945],{},"iter()"," 从可迭代对象取得迭代器，",[34,6948,6949],{},"next()"," 请求下一个值。",[45,6952,6953,6954,6957,6958,6960],{},"没有更多值时迭代器抛出 ",[34,6955,6956],{},"StopIteration","，",[34,6959,3019],{}," 会自动处理。",[45,6962,6963],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[15,6965,59],{"id":59},[11,6967,62],{},[64,6969,6971],{"className":66,"code":6970,"language":68,"meta":69,"style":69},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[34,6972,6973,6978,6983,6988,6993,6998,7002,7007,7012,7016],{"__ignoreMap":69},[73,6974,6975],{"class":75,"line":76},[73,6976,6977],{},"def countdown(start):\n",[73,6979,6980],{"class":75,"line":152},[73,6981,6982],{},"    current = start\n",[73,6984,6985],{"class":75,"line":420},[73,6986,6987],{},"    while current > 0:\n",[73,6989,6990],{"class":75,"line":426},[73,6991,6992],{},"        yield current\n",[73,6994,6995],{"class":75,"line":618},[73,6996,6997],{},"        current = current - 1\n",[73,6999,7000],{"class":75,"line":1156},[73,7001,956],{"emptyLinePlaceholder":166},[73,7003,7004],{"class":75,"line":1162},[73,7005,7006],{},"iterator = countdown(3)\n",[73,7008,7009],{"class":75,"line":1168},[73,7010,7011],{},"print(next(iterator))\n",[73,7013,7014],{"class":75,"line":2630},[73,7015,7011],{},[73,7017,7018],{"class":75,"line":2845},[73,7019,7011],{},[11,7021,81],{},[64,7023,7026],{"className":7024,"code":7025,"language":87,"meta":69},[85],"3\n2\n1\n",[34,7027,7025],{"__ignoreMap":69},[11,7029,92],{},[15,7031,95],{"id":95},[97,7033,7034,7040],{},[45,7035,6616,7036,7039],{},[34,7037,7038],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[45,7041,7042,7043,7045,7046,7048,7049,7052],{},"每次 ",[34,7044,6949],{}," 运行到下一个 ",[34,7047,6935],{}," 并暂停，局部变量 ",[34,7050,7051],{},"current"," 和执行位置被保留。",[1371,7054,1373],{"id":1373},[11,7056,7057,7058,7060],{},"生成器的暂停位置可以展开成多次 ",[34,7059,6949],{}," 的时间线。",[11,7062,7063],{},[27,7064],{"alt":7065,"src":7066},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[11,7068,7069,7070,7072],{},"每次请求只推进到下一个 ",[34,7071,6935],{},"；局部变量保留，代码不会从函数开头重新运行。",[15,7074,115],{"id":115},[42,7076,7077,7080],{},[45,7078,7079],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[45,7081,7082],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[15,7084,129],{"id":129},[97,7086,7087,7090],{},[45,7088,7089],{},"编写产生 1 到指定上限偶数的生成器。",[45,7091,2688,7092,7094,7095,7097],{},[34,7093,3019],{}," 遍历生成器，比较手动 ",[34,7096,6949],{}," 的差异。",[11,7099,140],{},[15,7101,143],{"id":143},[11,7103,7104],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,7106,150],{},{"title":69,"searchDepth":152,"depth":152,"links":7108},[7109,7110,7111,7112,7113,7116,7117,7118],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":7114},[7115],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":6911,"description":6916},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[162,7126,7127],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":7130,"title":7131,"body":7132,"category":162,"cover":163,"description":7136,"extension":164,"meta":7360,"navigation":166,"path":7361,"pinned":168,"publishedAt":169,"seo":7362,"slug":7363,"stem":7364,"summary":7365,"tags":7366,"updatedAt":169,"visible":166,"__hash__":7368},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":8,"value":7133,"toc":7348},[7134,7137,7139,7142,7144,7150,7153,7155,7175,7177,7179,7261,7263,7269,7271,7273,7295,7297,7300,7306,7313,7315,7325,7327,7339,7341,7343,7346],[11,7135,7136],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[15,7138,17],{"id":17},[11,7140,7141],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,7143,23],{"id":23},[11,7145,7146],{},[27,7147],{"alt":7148,"src":7149},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[11,7151,7152],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[15,7154,40],{"id":40},[42,7156,7157,7166,7169],{},[45,7158,7159,7162,7163,383],{},[34,7160,7161],{},"@trace"," 等价于 ",[34,7164,7165],{},"add = trace(add)",[45,7167,7168],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[45,7170,7171,7174],{},[34,7172,7173],{},"functools.wraps"," 保留原函数名称和文档信息。",[15,7176,59],{"id":59},[11,7178,62],{},[64,7180,7182],{"className":66,"code":7181,"language":68,"meta":69,"style":69},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[34,7183,7184,7189,7193,7198,7203,7208,7213,7218,7223,7228,7233,7237,7242,7246,7250,7255],{"__ignoreMap":69},[73,7185,7186],{"class":75,"line":76},[73,7187,7188],{},"from functools import wraps\n",[73,7190,7191],{"class":75,"line":152},[73,7192,956],{"emptyLinePlaceholder":166},[73,7194,7195],{"class":75,"line":420},[73,7196,7197],{},"def trace(function):\n",[73,7199,7200],{"class":75,"line":426},[73,7201,7202],{},"    @wraps(function)\n",[73,7204,7205],{"class":75,"line":618},[73,7206,7207],{},"    def wrapper(*args, **kwargs):\n",[73,7209,7210],{"class":75,"line":1156},[73,7211,7212],{},"        print(\"开始：\", function.__name__)\n",[73,7214,7215],{"class":75,"line":1162},[73,7216,7217],{},"        result = function(*args, **kwargs)\n",[73,7219,7220],{"class":75,"line":1168},[73,7221,7222],{},"        print(\"结束：\", function.__name__)\n",[73,7224,7225],{"class":75,"line":2630},[73,7226,7227],{},"        return result\n",[73,7229,7230],{"class":75,"line":2845},[73,7231,7232],{},"    return wrapper\n",[73,7234,7235],{"class":75,"line":4510},[73,7236,956],{"emptyLinePlaceholder":166},[73,7238,7239],{"class":75,"line":4515},[73,7240,7241],{},"@trace\n",[73,7243,7244],{"class":75,"line":6123},[73,7245,4864],{},[73,7247,7248],{"class":75,"line":6129},[73,7249,4869],{},[73,7251,7253],{"class":75,"line":7252},15,[73,7254,956],{"emptyLinePlaceholder":166},[73,7256,7258],{"class":75,"line":7257},16,[73,7259,7260],{},"print(add(2, 3))\n",[11,7262,81],{},[64,7264,7267],{"className":7265,"code":7266,"language":87,"meta":69},[85],"开始： add\n结束： add\n5\n",[34,7268,7266],{"__ignoreMap":69},[11,7270,92],{},[15,7272,95],{"id":95},[97,7274,7275,7292],{},[45,7276,7277,7278,7281,7282,7285,7286,7289,7290,383],{},"解释器执行定义时，把原 ",[34,7279,7280],{},"add"," 函数交给 ",[34,7283,7284],{},"trace","，返回的 ",[34,7287,7288],{},"wrapper"," 重新绑定到名字 ",[34,7291,7280],{},[45,7293,7294],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[1371,7296,1373],{"id":1373},[11,7298,7299],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[11,7301,7302],{},[27,7303],{"alt":7304,"src":7305},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[11,7307,7308,7310,7311,383],{},[34,7309,7161],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,7312,7165],{},[15,7314,115],{"id":115},[42,7316,7317,7322],{},[45,7318,7319,7320,383],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,7321,4061],{},[45,7323,7324],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[15,7326,129],{"id":129},[97,7328,7329,7332],{},[45,7330,7331],{},"编写只记录调用次数的简单装饰器。",[45,7333,7334,7335,7338],{},"删除包装函数的 ",[34,7336,7337],{},"return result","，观察调用方得到什么。",[11,7340,140],{},[15,7342,143],{"id":143},[11,7344,7345],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,7347,150],{},{"title":69,"searchDepth":152,"depth":152,"links":7349},[7350,7351,7352,7353,7354,7357,7358,7359],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":7355},[7356],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":7131,"description":7136},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[162,7367,4012],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":7370,"title":7371,"body":7372,"category":162,"cover":163,"description":7376,"extension":164,"meta":7563,"navigation":166,"path":7564,"pinned":168,"publishedAt":169,"seo":7565,"slug":7566,"stem":7567,"summary":7568,"tags":7569,"updatedAt":169,"visible":166,"__hash__":7572},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":8,"value":7373,"toc":7551},[7374,7377,7379,7382,7384,7390,7393,7395,7406,7408,7410,7485,7487,7493,7495,7497,7508,7510,7513,7519,7522,7524,7532,7534,7542,7544,7546,7549],[11,7375,7376],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[15,7378,17],{"id":17},[11,7380,7381],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,7383,23],{"id":23},[11,7385,7386],{},[27,7387],{"alt":7388,"src":7389},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[11,7391,7392],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[15,7394,40],{"id":40},[42,7396,7397,7400,7403],{},[45,7398,7399],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[45,7401,7402],{},"日志记录运行状态，测试判断结果是否符合约定。",[45,7404,7405],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[15,7407,59],{"id":59},[11,7409,62],{},[64,7411,7413],{"className":66,"code":7412,"language":68,"meta":69,"style":69},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[34,7414,7415,7420,7425,7429,7434,7438,7443,7448,7453,7457,7462,7467,7472,7476,7480],{"__ignoreMap":69},[73,7416,7417],{"class":75,"line":76},[73,7418,7419],{},"import logging\n",[73,7421,7422],{"class":75,"line":152},[73,7423,7424],{},"import unittest\n",[73,7426,7427],{"class":75,"line":420},[73,7428,956],{"emptyLinePlaceholder":166},[73,7430,7431],{"class":75,"line":426},[73,7432,7433],{},"logging.basicConfig(level=logging.INFO)\n",[73,7435,7436],{"class":75,"line":618},[73,7437,956],{"emptyLinePlaceholder":166},[73,7439,7440],{"class":75,"line":1156},[73,7441,7442],{},"def clamp_progress(value):\n",[73,7444,7445],{"class":75,"line":1162},[73,7446,7447],{},"    logging.info(\"检查进度：%s\", value)\n",[73,7449,7450],{"class":75,"line":1168},[73,7451,7452],{},"    return max(0, min(100, value))\n",[73,7454,7455],{"class":75,"line":2630},[73,7456,956],{"emptyLinePlaceholder":166},[73,7458,7459],{"class":75,"line":2845},[73,7460,7461],{},"class ProgressTest(unittest.TestCase):\n",[73,7463,7464],{"class":75,"line":4510},[73,7465,7466],{},"    def test_upper_limit(self):\n",[73,7468,7469],{"class":75,"line":4515},[73,7470,7471],{},"        self.assertEqual(clamp_progress(120), 100)\n",[73,7473,7474],{"class":75,"line":6123},[73,7475,956],{"emptyLinePlaceholder":166},[73,7477,7478],{"class":75,"line":6129},[73,7479,4878],{},[73,7481,7482],{"class":75,"line":7252},[73,7483,7484],{},"    unittest.main()\n",[11,7486,81],{},[64,7488,7491],{"className":7489,"code":7490,"language":87,"meta":69},[85],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,7492,7490],{"__ignoreMap":69},[11,7494,92],{},[15,7496,95],{"id":95},[97,7498,7499,7505],{},[45,7500,7501,7504],{},[34,7502,7503],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[45,7506,7507],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[1371,7509,1373],{"id":1373},[11,7511,7512],{},"一个小测试可以拆成准备、执行和断言三个部分。",[11,7514,7515],{},[27,7516],{"alt":7517,"src":7518},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[11,7520,7521],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[15,7523,115],{"id":115},[42,7525,7526,7529],{},[45,7527,7528],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[45,7530,7531],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[15,7533,129],{"id":129},[97,7535,7536,7539],{},[45,7537,7538],{},"为负数进度增加测试。",[45,7540,7541],{},"故意把上限改成 90，观察失败信息如何定位差异。",[11,7543,140],{},[15,7545,143],{"id":143},[11,7547,7548],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,7550,150],{},{"title":69,"searchDepth":152,"depth":152,"links":7552},[7553,7554,7555,7556,7557,7560,7561,7562],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":7558},[7559],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":7371,"description":7376},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[162,7570,7571],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":7574,"title":7575,"body":7576,"category":162,"cover":163,"description":7580,"extension":164,"meta":7880,"navigation":166,"path":7881,"pinned":168,"publishedAt":169,"seo":7882,"slug":7883,"stem":7884,"summary":7885,"tags":7886,"updatedAt":169,"visible":166,"__hash__":7889},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":8,"value":7577,"toc":7867},[7578,7581,7583,7586,7588,7594,7597,7599,7614,7616,7618,7765,7767,7773,7775,7777,7790,7792,7795,7801,7804,7806,7809,7815,7822,7824,7835,7837,7858,7860,7862,7865],[11,7579,7580],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[15,7582,17],{"id":17},[11,7584,7585],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[15,7587,23],{"id":23},[11,7589,7590],{},[27,7591],{"alt":7592,"src":7593},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[11,7595,7596],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[15,7598,40],{"id":40},[42,7600,7601,7604,7607],{},[45,7602,7603],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[45,7605,7606],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[45,7608,7609,7610,7613],{},"实际扩展前先为 ",[34,7611,7612],{},"add()"," 和存储边界补充测试。",[15,7615,59],{"id":59},[11,7617,62],{},[64,7619,7621],{"className":66,"code":7620,"language":68,"meta":69,"style":69},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[34,7622,7623,7627,7631,7635,7640,7645,7650,7655,7659,7664,7669,7674,7679,7684,7688,7693,7698,7704,7709,7715,7720,7725,7731,7737,7743,7748,7754,7759],{"__ignoreMap":69},[73,7624,7625],{"class":75,"line":76},[73,7626,5678],{},[73,7628,7629],{"class":75,"line":152},[73,7630,5286],{},[73,7632,7633],{"class":75,"line":420},[73,7634,956],{"emptyLinePlaceholder":166},[73,7636,7637],{"class":75,"line":426},[73,7638,7639],{},"class LearningRecords:\n",[73,7641,7642],{"class":75,"line":618},[73,7643,7644],{},"    def __init__(self, file_path):\n",[73,7646,7647],{"class":75,"line":1156},[73,7648,7649],{},"        self.file_path = Path(file_path)\n",[73,7651,7652],{"class":75,"line":1162},[73,7653,7654],{},"        self.items = []\n",[73,7656,7657],{"class":75,"line":1168},[73,7658,956],{"emptyLinePlaceholder":166},[73,7660,7661],{"class":75,"line":2630},[73,7662,7663],{},"    def add(self, title):\n",[73,7665,7666],{"class":75,"line":2845},[73,7667,7668],{},"        title = title.strip()\n",[73,7670,7671],{"class":75,"line":4510},[73,7672,7673],{},"        if not title:\n",[73,7675,7676],{"class":75,"line":4515},[73,7677,7678],{},"            raise ValueError(\"课程名称不能为空\")\n",[73,7680,7681],{"class":75,"line":6123},[73,7682,7683],{},"        self.items.append({\"title\": title, \"done\": False})\n",[73,7685,7686],{"class":75,"line":6129},[73,7687,956],{"emptyLinePlaceholder":166},[73,7689,7690],{"class":75,"line":7252},[73,7691,7692],{},"    def save(self):\n",[73,7694,7695],{"class":75,"line":7257},[73,7696,7697],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[73,7699,7701],{"class":75,"line":7700},17,[73,7702,7703],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[73,7705,7707],{"class":75,"line":7706},18,[73,7708,956],{"emptyLinePlaceholder":166},[73,7710,7712],{"class":75,"line":7711},19,[73,7713,7714],{},"records = LearningRecords(\"learning-records.json\")\n",[73,7716,7718],{"class":75,"line":7717},20,[73,7719,956],{"emptyLinePlaceholder":166},[73,7721,7723],{"class":75,"line":7722},21,[73,7724,6096],{},[73,7726,7728],{"class":75,"line":7727},22,[73,7729,7730],{},"    title = input(\"输入已学习课程：\")\n",[73,7732,7734],{"class":75,"line":7733},23,[73,7735,7736],{},"    records.add(title)\n",[73,7738,7740],{"class":75,"line":7739},24,[73,7741,7742],{},"    records.save()\n",[73,7744,7746],{"class":75,"line":7745},25,[73,7747,6106],{},[73,7749,7751],{"class":75,"line":7750},26,[73,7752,7753],{},"    print(\"无法保存：\", error)\n",[73,7755,7757],{"class":75,"line":7756},27,[73,7758,2833],{},[73,7760,7762],{"class":75,"line":7761},28,[73,7763,7764],{},"    print(\"已保存 1 条学习记录\")\n",[11,7766,81],{},[64,7768,7771],{"className":7769,"code":7770,"language":87,"meta":69},[85],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,7772,7770],{"__ignoreMap":69},[11,7774,92],{},[15,7776,95],{"id":95},[97,7778,7779,7785],{},[45,7780,7781,7782,7784],{},"输入层取得课程名后，",[34,7783,7612],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[45,7786,7787,7789],{},[34,7788,6844],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[1371,7791,1373],{"id":1373},[11,7793,7794],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[11,7796,7797],{},[27,7798],{"alt":7799,"src":7800},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[11,7802,7803],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[1371,7805,1373],{"id":2900},[11,7807,7808],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[11,7810,7811],{},[27,7812],{"alt":7813,"src":7814},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[11,7816,7817,7818,7821],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,7819,7820],{},"load()"," 把文件状态恢复到内存。",[15,7823,115],{"id":115},[42,7825,7826,7829],{},[45,7827,7828],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[45,7830,7831,7832,7834],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,7833,7820],{}," 是下一项必要扩展。",[15,7836,129],{"id":129},[97,7838,7839,7845,7848],{},[45,7840,7841,7842,7844],{},"增加 ",[34,7843,7820],{},"，文件不存在时从空列表开始。",[45,7846,7847],{},"增加按序号标记完成的功能，并校验序号范围。",[45,7849,7850,7851,7854,7855,7857],{},"把输入循环放进 ",[34,7852,7853],{},"main()","，通过 ",[34,7856,4820],{}," 控制程序入口。",[11,7859,140],{},[15,7861,143],{"id":143},[11,7863,7864],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[148,7866,150],{},{"title":69,"searchDepth":152,"depth":152,"links":7868},[7869,7870,7871,7872,7873,7877,7878,7879],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":7874},[7875,7876],{"id":1373,"depth":420,"text":1373},{"id":2900,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":7575,"description":7580},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[162,7887,7888],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",{"id":7891,"title":7892,"body":7893,"category":162,"cover":7900,"description":69,"extension":164,"meta":8210,"navigation":166,"path":8211,"pinned":168,"publishedAt":8212,"seo":8213,"slug":8214,"stem":8215,"summary":8216,"tags":8217,"updatedAt":8212,"visible":166,"__hash__":8219},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":8,"value":7894,"toc":8195},[7895,7901,7904,7907,7911,7914,7938,7941,7947,7950,7953,7986,7993,7997,8003,8006,8031,8034,8045,8048,8052,8055,8058,8061,8064,8067,8070,8073,8097,8100,8103,8109,8112,8115,8118,8122,8128,8131,8157,8160,8164,8167,8170,8174,8177,8180,8183,8186,8189,8192],[11,7896,7897],{},[27,7898],{"alt":7899,"src":7900},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[11,7902,7903],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[11,7905,7906],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[15,7908,7910],{"id":7909},"python-代码是什么样的","Python 代码是什么样的",[11,7912,7913],{},"下面是一段简单的 Python 代码：",[64,7915,7917],{"className":66,"code":7916,"language":68,"meta":69,"style":69},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,7918,7919,7924,7929,7933],{"__ignoreMap":69},[73,7920,7921],{"class":75,"line":76},[73,7922,7923],{},"name = \"Python\"\n",[73,7925,7926],{"class":75,"line":152},[73,7927,7928],{},"year = 2026\n",[73,7930,7931],{"class":75,"line":420},[73,7932,956],{"emptyLinePlaceholder":166},[73,7934,7935],{"class":75,"line":426},[73,7936,7937],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[11,7939,7940],{},"运行结果：",[64,7942,7945],{"className":7943,"code":7944,"language":87,"meta":69},[85],"正在学习 Python，当前年份是 2026\n",[34,7946,7944],{"__ignoreMap":69},[11,7948,7949],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[11,7951,7952],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[64,7954,7956],{"className":66,"code":7955,"language":68,"meta":69,"style":69},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,7957,7958,7963,7967,7972,7977,7981],{"__ignoreMap":69},[73,7959,7960],{"class":75,"line":76},[73,7961,7962],{},"score = 85\n",[73,7964,7965],{"class":75,"line":152},[73,7966,956],{"emptyLinePlaceholder":166},[73,7968,7969],{"class":75,"line":420},[73,7970,7971],{},"if score >= 60:\n",[73,7973,7974],{"class":75,"line":426},[73,7975,7976],{},"    print(\"成绩合格\")\n",[73,7978,7979],{"class":75,"line":618},[73,7980,2833],{},[73,7982,7983],{"class":75,"line":1156},[73,7984,7985],{},"    print(\"需要继续学习\")\n",[11,7987,7988,666,7990,7992],{},[34,7989,2770],{},[34,7991,2776],{}," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[15,7994,7996],{"id":7995},"python-如何运行代码","Python 如何运行代码",[11,7998,7999,8000,8002],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,8001,36],{}," 文件，也可以进入交互式环境逐行执行代码。",[11,8004,8005],{},"交互式环境适合快速验证一个表达式：",[64,8007,8009],{"className":66,"code":8008,"language":68,"meta":69,"style":69},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,8010,8011,8016,8021,8026],{"__ignoreMap":69},[73,8012,8013],{"class":75,"line":76},[73,8014,8015],{},">>> 10 + 20\n",[73,8017,8018],{"class":75,"line":152},[73,8019,8020],{},"30\n",[73,8022,8023],{"class":75,"line":420},[73,8024,8025],{},">>> \"Python\".lower()\n",[73,8027,8028],{"class":75,"line":426},[73,8029,8030],{},"'python'\n",[11,8032,8033],{},"需要保存和重复运行的程序，则可以写入文件：",[64,8035,8037],{"className":230,"code":8036,"language":232,"meta":69,"style":69},"python3 hello.py\n",[34,8038,8039],{"__ignoreMap":69},[73,8040,8041,8043],{"class":75,"line":76},[73,8042,204],{"class":239},[73,8044,615],{"class":253},[11,8046,8047],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[15,8049,8051],{"id":8050},"python-的特点","Python 的特点",[1371,8053,8054],{"id":8054},"语法相对简洁",[11,8056,8057],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[1371,8059,8060],{"id":8060},"支持多种编程方式",[11,8062,8063],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[1371,8065,8066],{"id":8066},"标准库比较完整",[11,8068,8069],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[11,8071,8072],{},"例如，获取当前时间：",[64,8074,8076],{"className":66,"code":8075,"language":68,"meta":69,"style":69},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,8077,8078,8083,8087,8092],{"__ignoreMap":69},[73,8079,8080],{"class":75,"line":76},[73,8081,8082],{},"from datetime import datetime\n",[73,8084,8085],{"class":75,"line":152},[73,8086,956],{"emptyLinePlaceholder":166},[73,8088,8089],{"class":75,"line":420},[73,8090,8091],{},"now = datetime.now()\n",[73,8093,8094],{"class":75,"line":426},[73,8095,8096],{},"print(now)\n",[11,8098,8099],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[1371,8101,8102],{"id":8102},"第三方工具丰富",[11,8104,8105,8106,8108],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,8107,5215],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[11,8110,8111],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[1371,8113,8114],{"id":8114},"支持多个操作系统",[11,8116,8117],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[15,8119,8121],{"id":8120},"python-可以做什么","Python 可以做什么",[11,8123,8124],{},[27,8125],{"alt":8126,"src":8127},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[11,8129,8130],{},"Python 的应用范围比较广，常见方向包括：",[42,8132,8133,8136,8139,8142,8145,8148,8151,8154],{},[45,8134,8135],{},"编写自动化脚本，批量处理文件和重复任务；",[45,8137,8138],{},"开发网站后端和 API 服务；",[45,8140,8141],{},"进行数据清洗、统计分析和图表展示；",[45,8143,8144],{},"编写网络爬虫和信息采集工具；",[45,8146,8147],{},"开发自动化测试程序；",[45,8149,8150],{},"进行机器学习和人工智能开发；",[45,8152,8153],{},"编写运维、监控和辅助开发工具；",[45,8155,8156],{},"开发部分桌面应用和插件。",[11,8158,8159],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[15,8161,8163],{"id":8162},"python-的发展","Python 的发展",[11,8165,8166],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[11,8168,8169],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[15,8171,8173],{"id":8172},"python-也有局限","Python 也有局限",[11,8175,8176],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[11,8178,8179],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[11,8181,8182],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[15,8184,8185],{"id":8185},"写在最后",[11,8187,8188],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[11,8190,8191],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[148,8193,8194],{},"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":69,"searchDepth":152,"depth":152,"links":8196},[8197,8198,8199,8206,8207,8208,8209],{"id":7909,"depth":152,"text":7910},{"id":7995,"depth":152,"text":7996},{"id":8050,"depth":152,"text":8051,"children":8200},[8201,8202,8203,8204,8205],{"id":8054,"depth":420,"text":8054},{"id":8060,"depth":420,"text":8060},{"id":8066,"depth":420,"text":8066},{"id":8102,"depth":420,"text":8102},{"id":8114,"depth":420,"text":8114},{"id":8120,"depth":152,"text":8121},{"id":8162,"depth":152,"text":8163},{"id":8172,"depth":152,"text":8173},{"id":8185,"depth":152,"text":8185},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":7892,"description":69},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[162,175,8218],"基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":8221,"title":8222,"body":8223,"category":162,"cover":163,"description":69,"extension":164,"meta":9005,"navigation":166,"path":9006,"pinned":168,"publishedAt":9007,"seo":9008,"slug":9009,"stem":9010,"summary":9011,"tags":9012,"updatedAt":9007,"visible":166,"__hash__":9014},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":8,"value":8224,"toc":8981},[8225,8228,8231,8234,8240,8243,8246,8284,8300,8304,8308,8318,8323,8329,8346,8352,8357,8363,8367,8413,8416,8422,8428,8431,8462,8507,8524,8538,8548,8552,8563,8574,8577,8583,8588,8591,8606,8616,8637,8641,8645,8648,8659,8665,8669,8684,8691,8695,8698,8718,8724,8728,8731,8735,8738,8758,8761,8765,8768,8802,8805,8824,8827,8848,8853,8857,8860,8880,8883,8886,8890,8897,8910,8913,8917,8920,8930,8941,8945,8948,8963,8978],[15,8226,8227],{"id":8227},"引言",[11,8229,8230],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[11,8232,8233],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[11,8235,8236,8237,8239],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,8238,5215],{}," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[15,8241,8242],{"id":8242},"扫盲",[11,8244,8245],{},"那么这里有几个概念：",[8247,8248,8249,8252],"blockquote",{},[11,8250,8251],{},"为什么需要安装python解释器？",[8247,8253,8254,8265,8268,8275,8278],{},[11,8255,8256,8257,8260,8261,8264],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,8258,8259],{},"0","和",[34,8262,8263],{},"1","组成的机器指令。",[11,8266,8267],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[11,8269,8270,8271,8274],{},"这样，我们就能用",[4804,8272,8273],{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[11,8276,8277],{},"相当于我们的电脑要打开表格，需要安装excel。",[11,8279,8280],{},[27,8281],{"alt":8282,"src":8283},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[8247,8285,8286,8289],{},[11,8287,8288],{},"pip又是什么？",[8247,8290,8291,8294],{},[11,8292,8293],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[11,8295,8296],{},[27,8297],{"alt":8298,"src":8299},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[15,8301,8303],{"id":8302},"windows-安装","Windows 安装",[1371,8305,8307],{"id":8306},"_1-下载官方安装程序","1. 下载官方安装程序",[11,8309,8310,8311,8317],{},"打开 ",[5587,8312,8316],{"href":8313,"rel":8314},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[8315],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[8247,8319,8320],{},[11,8321,8322],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[11,8324,8325],{},[27,8326],{"alt":8327,"src":8328},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[42,8330,8331,8337,8343],{},[45,8332,8333,8334,383],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[4804,8335,8336],{},"Windows installer (64-bit)",[45,8338,8339,8340,383],{},"搭载 ARM 处理器的 Windows 设备选择 ",[4804,8341,8342],{},"Windows installer (ARM64)",[45,8344,8345],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[11,8347,8348],{},[27,8349],{"alt":8350,"src":8351},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[8247,8353,8354],{},[11,8355,8356],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[11,8358,8359],{},[27,8360],{"alt":8361,"src":8362},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[1371,8364,8366],{"id":8365},"_2-安装并加入-path","2. 安装并加入 PATH",[8247,8368,8369,8374,8381,8406],{},[8247,8370,8371],{},[11,8372,8373],{},"PATH 环境变量",[11,8375,8376,8377,8380],{},"Windows 有一个特殊的变量叫 ",[4804,8378,8379],{},"PATH","，它里面存了一串文件夹路径，比如：",[64,8382,8384],{"className":66,"code":8383,"language":68,"meta":69,"style":69},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,8385,8386,8391,8396,8401],{"__ignoreMap":69},[73,8387,8388],{"class":75,"line":76},[73,8389,8390],{},"D:\\Python313\\\n",[73,8392,8393],{"class":75,"line":152},[73,8394,8395],{},"D:\\Python313\\Scripts\\\n",[73,8397,8398],{"class":75,"line":420},[73,8399,8400],{},"C:\\Windows\\System32\\\n",[73,8402,8403],{"class":75,"line":426},[73,8404,8405],{},"...\n",[11,8407,8408,8409,8412],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[4804,8410,8411],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[11,8414,8415],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[11,8417,8418,8419,8421],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,8420,68],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[11,8423,8424],{},[27,8425],{"alt":8426,"src":8427},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[11,8429,8430],{},"对安装界面最底部的两个勾选项分别解释 :",[8247,8432,8433,8436,8441],{},[11,8434,8435],{},"Add python.exe to PATH",[11,8437,8438],{},[4804,8439,8440],{},"把 Python 添加到系统环境变量",[8247,8442,8443,8449,8455],{},[11,8444,8445,8446,8448],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,8447,68],{}," 就能运行",[11,8450,8451,8452,8454],{},"不勾选的话，命令行输入 ",[34,8453,68],{}," 会提示**\"找不到命令\"**，非常麻烦",[11,8456,8457,8458,8461],{},"必须",[4804,8459,8460],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[8247,8463,8464,8467,8472],{},[11,8465,8466],{},"Use admin privileges when installing py.exe",[11,8468,8469],{},[4804,8470,8471],{},"使用管理员权限安装 py.exe（Python 启动器）",[8247,8473,8474,8484,8498,8501],{},[11,8475,8476,8479,8480,8483],{},[34,8477,8478],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,8481,8482],{},"py"," 来启动 Python。",[11,8485,8486,8487,8489,8490,8493,8494,8497],{},"勾选后，",[34,8488,8478],{}," 会安装到",[4804,8491,8492],{},"系统级目录","，电脑上",[4804,8495,8496],{},"所有用户账户","都能用",[11,8499,8500],{},"不勾选，只有当前用户能用",[11,8502,8503,8506],{},[4804,8504,8505],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[8247,8508,8509,8512],{},[11,8510,8511],{},"操作建议",[8247,8513,8514,8521],{},[11,8515,8516,8517,8520],{},"两个都勾上之后，再点 ",[4804,8518,8519],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[11,8522,8523],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[8247,8525,8526,8532],{},[11,8527,8528,8529],{},"Python 安装的",[4804,8530,8531],{},"可选功能页",[11,8533,8534],{},[27,8535],{"alt":8536,"src":8537},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[8247,8539,8540,8543],{},[11,8541,8542],{},"高级选项页",[11,8544,8545],{},[27,8546],{"alt":8536,"src":8547},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[1371,8549,8551],{"id":8550},"_3-检查-windows-环境","3. 检查 Windows 环境",[11,8553,8554,8555,8558,8559,8562],{},"按 ",[34,8556,8557],{},"Win + R","，输入 ",[34,8560,8561],{},"cmd"," 并回车，然后执行：",[64,8564,8566],{"className":230,"code":8565,"language":232,"meta":69,"style":69},"python --version\n",[34,8567,8568],{"__ignoreMap":69},[73,8569,8570,8572],{"class":75,"line":76},[73,8571,68],{"class":239},[73,8573,243],{"class":242},[11,8575,8576],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[64,8578,8581],{"className":8579,"code":8580,"language":87,"meta":69},[85],"Python 3.x.x\n",[34,8582,8580],{"__ignoreMap":69},[11,8584,8585],{},[27,8586],{"alt":8536,"src":8587},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[11,8589,8590],{},"继续检查 pip：",[64,8592,8594],{"className":230,"code":8593,"language":232,"meta":69,"style":69},"python -m pip --version\n",[34,8595,8596],{"__ignoreMap":69},[73,8597,8598,8600,8602,8604],{"class":75,"line":76},[73,8599,68],{"class":239},[73,8601,250],{"class":242},[73,8603,254],{"class":253},[73,8605,243],{"class":242},[11,8607,8608,8609,8611,8612,8615],{},"如果 ",[34,8610,68],{}," 无法识别，但 ",[34,8613,8614],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[64,8617,8619],{"className":230,"code":8618,"language":232,"meta":69,"style":69},"py --version\npy -m pip --version\n",[34,8620,8621,8627],{"__ignoreMap":69},[73,8622,8623,8625],{"class":75,"line":76},[73,8624,8482],{"class":239},[73,8626,243],{"class":242},[73,8628,8629,8631,8633,8635],{"class":75,"line":152},[73,8630,8482],{"class":239},[73,8632,250],{"class":242},[73,8634,254],{"class":253},[73,8636,243],{"class":242},[15,8638,8640],{"id":8639},"macos-安装","macOS 安装",[1371,8642,8644],{"id":8643},"_1-先检查现有环境","1. 先检查现有环境",[11,8646,8647],{},"打开“终端”应用，执行：",[64,8649,8651],{"className":230,"code":8650,"language":232,"meta":69,"style":69},"python3 --version\n",[34,8652,8653],{"__ignoreMap":69},[73,8654,8655,8657],{"class":75,"line":76},[73,8656,204],{"class":239},[73,8658,243],{"class":242},[11,8660,8661,8662,8664],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,8663,281],{},"。两条命令都正常时，无需重复安装。",[1371,8666,8668],{"id":8667},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[11,8670,8310,8671,8676,8677,383,8680,8683],{},[5587,8672,8675],{"href":8673,"rel":8674},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[8315],"Python macOS 下载页","，下载当前稳定版的 ",[4804,8678,8679],{},"macOS 64-bit universal2 installer",[34,8681,8682],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[11,8685,8686,8687,8690],{},"下载完成后打开 ",[34,8688,8689],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[1371,8692,8694],{"id":8693},"_3-检查-macos-环境","3. 检查 macOS 环境",[11,8696,8697],{},"安装完成后重新打开终端，执行：",[64,8699,8700],{"className":230,"code":231,"language":232,"meta":69,"style":69},[34,8701,8702,8708],{"__ignoreMap":69},[73,8703,8704,8706],{"class":75,"line":76},[73,8705,204],{"class":239},[73,8707,243],{"class":242},[73,8709,8710,8712,8714,8716],{"class":75,"line":152},[73,8711,204],{"class":239},[73,8713,250],{"class":242},[73,8715,254],{"class":253},[73,8717,243],{"class":242},[11,8719,8720,8721,8723],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,8722,204],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[15,8725,8727],{"id":8726},"linux-安装","Linux 安装",[11,8729,8730],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[1371,8732,8734],{"id":8733},"_1-检查是否已经安装","1. 检查是否已经安装",[11,8736,8737],{},"打开终端，执行：",[64,8739,8740],{"className":230,"code":231,"language":232,"meta":69,"style":69},[34,8741,8742,8748],{"__ignoreMap":69},[73,8743,8744,8746],{"class":75,"line":76},[73,8745,204],{"class":239},[73,8747,243],{"class":242},[73,8749,8750,8752,8754,8756],{"class":75,"line":152},[73,8751,204],{"class":239},[73,8753,250],{"class":242},[73,8755,254],{"class":253},[73,8757,243],{"class":242},[11,8759,8760],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[1371,8762,8764],{"id":8763},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[11,8766,8767],{},"Ubuntu 或 Debian：",[64,8769,8771],{"className":230,"code":8770,"language":232,"meta":69,"style":69},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,8772,8773,8784],{"__ignoreMap":69},[73,8774,8775,8778,8781],{"class":75,"line":76},[73,8776,8777],{"class":239},"sudo",[73,8779,8780],{"class":253}," apt",[73,8782,8783],{"class":253}," update\n",[73,8785,8786,8788,8790,8793,8796,8799],{"class":75,"line":152},[73,8787,8777],{"class":239},[73,8789,8780],{"class":253},[73,8791,8792],{"class":253}," install",[73,8794,8795],{"class":253}," python3",[73,8797,8798],{"class":253}," python3-pip",[73,8800,8801],{"class":253}," python3-venv\n",[11,8803,8804],{},"Fedora：",[64,8806,8808],{"className":230,"code":8807,"language":232,"meta":69,"style":69},"sudo dnf install python3 python3-pip\n",[34,8809,8810],{"__ignoreMap":69},[73,8811,8812,8814,8817,8819,8821],{"class":75,"line":76},[73,8813,8777],{"class":239},[73,8815,8816],{"class":253}," dnf",[73,8818,8792],{"class":253},[73,8820,8795],{"class":253},[73,8822,8823],{"class":253}," python3-pip\n",[11,8825,8826],{},"Arch Linux：",[64,8828,8830],{"className":230,"code":8829,"language":232,"meta":69,"style":69},"sudo pacman -S python python-pip\n",[34,8831,8832],{"__ignoreMap":69},[73,8833,8834,8836,8839,8842,8845],{"class":75,"line":76},[73,8835,8777],{"class":239},[73,8837,8838],{"class":253}," pacman",[73,8840,8841],{"class":242}," -S",[73,8843,8844],{"class":253}," python",[73,8846,8847],{"class":253}," python-pip\n",[11,8849,8850,8852],{},[34,8851,8777],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[1371,8854,8856],{"id":8855},"_3-检查-linux-环境","3. 检查 Linux 环境",[11,8858,8859],{},"安装结束后执行：",[64,8861,8862],{"className":230,"code":231,"language":232,"meta":69,"style":69},[34,8863,8864,8870],{"__ignoreMap":69},[73,8865,8866,8868],{"class":75,"line":76},[73,8867,204],{"class":239},[73,8869,243],{"class":242},[73,8871,8872,8874,8876,8878],{"class":75,"line":152},[73,8873,204],{"class":239},[73,8875,250],{"class":242},[73,8877,254],{"class":253},[73,8879,243],{"class":242},[11,8881,8882],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[15,8884,8885],{"id":8885},"常见问题",[1371,8887,8889],{"id":8888},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[11,8891,8892,8893,8896],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,8894,8895],{},"python --version","。如果仍然失败，按下面的顺序检查：",[97,8898,8899,8904,8907],{},[45,8900,305,8901,8903],{},[34,8902,8614],{},"，确认 Python Launcher 是否可用。",[45,8905,8906],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[45,8908,8909],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[11,8911,8912],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[1371,8914,8916],{"id":8915},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[11,8918,8919],{},"先尝试：",[64,8921,8922],{"className":230,"code":8650,"language":232,"meta":69,"style":69},[34,8923,8924],{"__ignoreMap":69},[73,8925,8926,8928],{"class":75,"line":76},[73,8927,204],{"class":239},[73,8929,243],{"class":242},[11,8931,8932,8933,8935,8936,8938,8939,383],{},"在这两个系统中，只有 ",[34,8934,204],{}," 命令而没有 ",[34,8937,68],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,8940,204],{},[1371,8942,8944],{"id":8943},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[11,8946,8947],{},"先使用模块方式检查：",[64,8949,8951],{"className":230,"code":8950,"language":232,"meta":69,"style":69},"python3 -m pip --version\n",[34,8952,8953],{"__ignoreMap":69},[73,8954,8955,8957,8959,8961],{"class":75,"line":76},[73,8956,204],{"class":239},[73,8958,250],{"class":242},[73,8960,254],{"class":253},[73,8962,243],{"class":242},[11,8964,8965,8966,8968,8969,1471,8971,8973,8974,8977],{},"Windows 用户将命令中的 ",[34,8967,204],{}," 换成 ",[34,8970,68],{},[34,8972,8482],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,8975,8976],{},"python3-pip","；不要直接使用其他系统的安装命令。",[148,8979,8980],{},"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":69,"searchDepth":152,"depth":152,"links":8982},[8983,8984,8985,8990,8995,9000],{"id":8227,"depth":152,"text":8227},{"id":8242,"depth":152,"text":8242},{"id":8302,"depth":152,"text":8303,"children":8986},[8987,8988,8989],{"id":8306,"depth":420,"text":8307},{"id":8365,"depth":420,"text":8366},{"id":8550,"depth":420,"text":8551},{"id":8639,"depth":152,"text":8640,"children":8991},[8992,8993,8994],{"id":8643,"depth":420,"text":8644},{"id":8667,"depth":420,"text":8668},{"id":8693,"depth":420,"text":8694},{"id":8726,"depth":152,"text":8727,"children":8996},[8997,8998,8999],{"id":8733,"depth":420,"text":8734},{"id":8763,"depth":420,"text":8764},{"id":8855,"depth":420,"text":8856},{"id":8885,"depth":152,"text":8885,"children":9001},[9002,9003,9004],{"id":8888,"depth":420,"text":8889},{"id":8915,"depth":420,"text":8916},{"id":8943,"depth":420,"text":8944},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":8222,"description":69},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[162,341,9013],"爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",[9016,9599,9839,9942,10061,10192,10335,10460,10597,10734,10875,11044,11181,11314,11437,11566,11693,11856,12032,12173,12302,12451,12594,12715,12838,12987,13140,13305,13432,13613,13756,13913,14064,14211,14366,14584,14739,14914,15065,15232,15419,15582],{"id":8221,"title":8222,"body":9017,"category":162,"cover":163,"description":69,"extension":164,"meta":9596,"navigation":166,"path":9006,"pinned":168,"publishedAt":9007,"seo":9597,"slug":9009,"stem":9010,"summary":9011,"tags":9598,"updatedAt":9007,"visible":166,"__hash__":9014},{"type":8,"value":9018,"toc":9572},[9019,9021,9023,9025,9029,9031,9033,9057,9069,9071,9073,9078,9082,9086,9098,9102,9106,9110,9112,9146,9148,9152,9156,9158,9180,9210,9222,9232,9240,9242,9248,9258,9260,9265,9269,9271,9285,9291,9311,9313,9315,9317,9327,9331,9333,9342,9346,9348,9350,9370,9374,9376,9378,9380,9382,9402,9404,9406,9408,9434,9436,9452,9454,9470,9474,9476,9478,9498,9500,9502,9504,9508,9518,9520,9522,9524,9534,9542,9544,9546,9560,9570],[15,9020,8227],{"id":8227},[11,9022,8230],{},[11,9024,8233],{},[11,9026,8236,9027,8239],{},[34,9028,5215],{},[15,9030,8242],{"id":8242},[11,9032,8245],{},[8247,9034,9035,9037],{},[11,9036,8251],{},[8247,9038,9039,9045,9047,9051,9053],{},[11,9040,8256,9041,8260,9043,8264],{},[34,9042,8259],{},[34,9044,8263],{},[11,9046,8267],{},[11,9048,8270,9049,8274],{},[4804,9050,8273],{},[11,9052,8277],{},[11,9054,9055],{},[27,9056],{"alt":8282,"src":8283},[8247,9058,9059,9061],{},[11,9060,8288],{},[8247,9062,9063,9065],{},[11,9064,8293],{},[11,9066,9067],{},[27,9068],{"alt":8298,"src":8299},[15,9070,8303],{"id":8302},[1371,9072,8307],{"id":8306},[11,9074,8310,9075,8317],{},[5587,9076,8316],{"href":8313,"rel":9077},[8315],[8247,9079,9080],{},[11,9081,8322],{},[11,9083,9084],{},[27,9085],{"alt":8327,"src":8328},[42,9087,9088,9092,9096],{},[45,9089,8333,9090,383],{},[4804,9091,8336],{},[45,9093,8339,9094,383],{},[4804,9095,8342],{},[45,9097,8345],{},[11,9099,9100],{},[27,9101],{"alt":8350,"src":8351},[8247,9103,9104],{},[11,9105,8356],{},[11,9107,9108],{},[27,9109],{"alt":8361,"src":8362},[1371,9111,8366],{"id":8365},[8247,9113,9114,9118,9122,9142],{},[8247,9115,9116],{},[11,9117,8373],{},[11,9119,8376,9120,8380],{},[4804,9121,8379],{},[64,9123,9124],{"className":66,"code":8383,"language":68,"meta":69,"style":69},[34,9125,9126,9130,9134,9138],{"__ignoreMap":69},[73,9127,9128],{"class":75,"line":76},[73,9129,8390],{},[73,9131,9132],{"class":75,"line":152},[73,9133,8395],{},[73,9135,9136],{"class":75,"line":420},[73,9137,8400],{},[73,9139,9140],{"class":75,"line":426},[73,9141,8405],{},[11,9143,8408,9144,8412],{},[4804,9145,8411],{},[11,9147,8415],{},[11,9149,8418,9150,8421],{},[34,9151,68],{},[11,9153,9154],{},[27,9155],{"alt":8426,"src":8427},[11,9157,8430],{},[8247,9159,9160,9162,9166],{},[11,9161,8435],{},[11,9163,9164],{},[4804,9165,8440],{},[8247,9167,9168,9172,9176],{},[11,9169,8445,9170,8448],{},[34,9171,68],{},[11,9173,8451,9174,8454],{},[34,9175,68],{},[11,9177,8457,9178,8461],{},[4804,9179,8460],{},[8247,9181,9182,9184,9188],{},[11,9183,8466],{},[11,9185,9186],{},[4804,9187,8471],{},[8247,9189,9190,9196,9204,9206],{},[11,9191,9192,8479,9194,8483],{},[34,9193,8478],{},[34,9195,8482],{},[11,9197,8486,9198,8489,9200,8493,9202,8497],{},[34,9199,8478],{},[4804,9201,8492],{},[4804,9203,8496],{},[11,9205,8500],{},[11,9207,9208,8506],{},[4804,9209,8505],{},[8247,9211,9212,9214],{},[11,9213,8511],{},[8247,9215,9216,9220],{},[11,9217,8516,9218,8520],{},[4804,9219,8519],{},[11,9221,8523],{},[8247,9223,9224,9228],{},[11,9225,8528,9226],{},[4804,9227,8531],{},[11,9229,9230],{},[27,9231],{"alt":8536,"src":8537},[8247,9233,9234,9236],{},[11,9235,8542],{},[11,9237,9238],{},[27,9239],{"alt":8536,"src":8547},[1371,9241,8551],{"id":8550},[11,9243,8554,9244,8558,9246,8562],{},[34,9245,8557],{},[34,9247,8561],{},[64,9249,9250],{"className":230,"code":8565,"language":232,"meta":69,"style":69},[34,9251,9252],{"__ignoreMap":69},[73,9253,9254,9256],{"class":75,"line":76},[73,9255,68],{"class":239},[73,9257,243],{"class":242},[11,9259,8576],{},[64,9261,9263],{"className":9262,"code":8580,"language":87,"meta":69},[85],[34,9264,8580],{"__ignoreMap":69},[11,9266,9267],{},[27,9268],{"alt":8536,"src":8587},[11,9270,8590],{},[64,9272,9273],{"className":230,"code":8593,"language":232,"meta":69,"style":69},[34,9274,9275],{"__ignoreMap":69},[73,9276,9277,9279,9281,9283],{"class":75,"line":76},[73,9278,68],{"class":239},[73,9280,250],{"class":242},[73,9282,254],{"class":253},[73,9284,243],{"class":242},[11,9286,8608,9287,8611,9289,8615],{},[34,9288,68],{},[34,9290,8614],{},[64,9292,9293],{"className":230,"code":8618,"language":232,"meta":69,"style":69},[34,9294,9295,9301],{"__ignoreMap":69},[73,9296,9297,9299],{"class":75,"line":76},[73,9298,8482],{"class":239},[73,9300,243],{"class":242},[73,9302,9303,9305,9307,9309],{"class":75,"line":152},[73,9304,8482],{"class":239},[73,9306,250],{"class":242},[73,9308,254],{"class":253},[73,9310,243],{"class":242},[15,9312,8640],{"id":8639},[1371,9314,8644],{"id":8643},[11,9316,8647],{},[64,9318,9319],{"className":230,"code":8650,"language":232,"meta":69,"style":69},[34,9320,9321],{"__ignoreMap":69},[73,9322,9323,9325],{"class":75,"line":76},[73,9324,204],{"class":239},[73,9326,243],{"class":242},[11,9328,8661,9329,8664],{},[34,9330,281],{},[1371,9332,8668],{"id":8667},[11,9334,8310,9335,8676,9338,383,9340,8683],{},[5587,9336,8675],{"href":8673,"rel":9337},[8315],[4804,9339,8679],{},[34,9341,8682],{},[11,9343,8686,9344,8690],{},[34,9345,8689],{},[1371,9347,8694],{"id":8693},[11,9349,8697],{},[64,9351,9352],{"className":230,"code":231,"language":232,"meta":69,"style":69},[34,9353,9354,9360],{"__ignoreMap":69},[73,9355,9356,9358],{"class":75,"line":76},[73,9357,204],{"class":239},[73,9359,243],{"class":242},[73,9361,9362,9364,9366,9368],{"class":75,"line":152},[73,9363,204],{"class":239},[73,9365,250],{"class":242},[73,9367,254],{"class":253},[73,9369,243],{"class":242},[11,9371,8720,9372,8723],{},[34,9373,204],{},[15,9375,8727],{"id":8726},[11,9377,8730],{},[1371,9379,8734],{"id":8733},[11,9381,8737],{},[64,9383,9384],{"className":230,"code":231,"language":232,"meta":69,"style":69},[34,9385,9386,9392],{"__ignoreMap":69},[73,9387,9388,9390],{"class":75,"line":76},[73,9389,204],{"class":239},[73,9391,243],{"class":242},[73,9393,9394,9396,9398,9400],{"class":75,"line":152},[73,9395,204],{"class":239},[73,9397,250],{"class":242},[73,9399,254],{"class":253},[73,9401,243],{"class":242},[11,9403,8760],{},[1371,9405,8764],{"id":8763},[11,9407,8767],{},[64,9409,9410],{"className":230,"code":8770,"language":232,"meta":69,"style":69},[34,9411,9412,9420],{"__ignoreMap":69},[73,9413,9414,9416,9418],{"class":75,"line":76},[73,9415,8777],{"class":239},[73,9417,8780],{"class":253},[73,9419,8783],{"class":253},[73,9421,9422,9424,9426,9428,9430,9432],{"class":75,"line":152},[73,9423,8777],{"class":239},[73,9425,8780],{"class":253},[73,9427,8792],{"class":253},[73,9429,8795],{"class":253},[73,9431,8798],{"class":253},[73,9433,8801],{"class":253},[11,9435,8804],{},[64,9437,9438],{"className":230,"code":8807,"language":232,"meta":69,"style":69},[34,9439,9440],{"__ignoreMap":69},[73,9441,9442,9444,9446,9448,9450],{"class":75,"line":76},[73,9443,8777],{"class":239},[73,9445,8816],{"class":253},[73,9447,8792],{"class":253},[73,9449,8795],{"class":253},[73,9451,8823],{"class":253},[11,9453,8826],{},[64,9455,9456],{"className":230,"code":8829,"language":232,"meta":69,"style":69},[34,9457,9458],{"__ignoreMap":69},[73,9459,9460,9462,9464,9466,9468],{"class":75,"line":76},[73,9461,8777],{"class":239},[73,9463,8838],{"class":253},[73,9465,8841],{"class":242},[73,9467,8844],{"class":253},[73,9469,8847],{"class":253},[11,9471,9472,8852],{},[34,9473,8777],{},[1371,9475,8856],{"id":8855},[11,9477,8859],{},[64,9479,9480],{"className":230,"code":231,"language":232,"meta":69,"style":69},[34,9481,9482,9488],{"__ignoreMap":69},[73,9483,9484,9486],{"class":75,"line":76},[73,9485,204],{"class":239},[73,9487,243],{"class":242},[73,9489,9490,9492,9494,9496],{"class":75,"line":152},[73,9491,204],{"class":239},[73,9493,250],{"class":242},[73,9495,254],{"class":253},[73,9497,243],{"class":242},[11,9499,8882],{},[15,9501,8885],{"id":8885},[1371,9503,8889],{"id":8888},[11,9505,8892,9506,8896],{},[34,9507,8895],{},[97,9509,9510,9514,9516],{},[45,9511,305,9512,8903],{},[34,9513,8614],{},[45,9515,8906],{},[45,9517,8909],{},[11,9519,8912],{},[1371,9521,8916],{"id":8915},[11,9523,8919],{},[64,9525,9526],{"className":230,"code":8650,"language":232,"meta":69,"style":69},[34,9527,9528],{"__ignoreMap":69},[73,9529,9530,9532],{"class":75,"line":76},[73,9531,204],{"class":239},[73,9533,243],{"class":242},[11,9535,8932,9536,8935,9538,8938,9540,383],{},[34,9537,204],{},[34,9539,68],{},[34,9541,204],{},[1371,9543,8944],{"id":8943},[11,9545,8947],{},[64,9547,9548],{"className":230,"code":8950,"language":232,"meta":69,"style":69},[34,9549,9550],{"__ignoreMap":69},[73,9551,9552,9554,9556,9558],{"class":75,"line":76},[73,9553,204],{"class":239},[73,9555,250],{"class":242},[73,9557,254],{"class":253},[73,9559,243],{"class":242},[11,9561,8965,9562,8968,9564,1471,9566,8973,9568,8977],{},[34,9563,204],{},[34,9565,68],{},[34,9567,8482],{},[34,9569,8976],{},[148,9571,8980],{},{"title":69,"searchDepth":152,"depth":152,"links":9573},[9574,9575,9576,9581,9586,9591],{"id":8227,"depth":152,"text":8227},{"id":8242,"depth":152,"text":8242},{"id":8302,"depth":152,"text":8303,"children":9577},[9578,9579,9580],{"id":8306,"depth":420,"text":8307},{"id":8365,"depth":420,"text":8366},{"id":8550,"depth":420,"text":8551},{"id":8639,"depth":152,"text":8640,"children":9582},[9583,9584,9585],{"id":8643,"depth":420,"text":8644},{"id":8667,"depth":420,"text":8668},{"id":8693,"depth":420,"text":8694},{"id":8726,"depth":152,"text":8727,"children":9587},[9588,9589,9590],{"id":8733,"depth":420,"text":8734},{"id":8763,"depth":420,"text":8764},{"id":8855,"depth":420,"text":8856},{"id":8885,"depth":152,"text":8885,"children":9592},[9593,9594,9595],{"id":8888,"depth":420,"text":8889},{"id":8915,"depth":420,"text":8916},{"id":8943,"depth":420,"text":8944},{},{"title":8222,"description":69},[162,341,9013],{"id":7891,"title":7892,"body":9600,"category":162,"cover":7900,"description":69,"extension":164,"meta":9836,"navigation":166,"path":8211,"pinned":168,"publishedAt":8212,"seo":9837,"slug":8214,"stem":8215,"summary":8216,"tags":9838,"updatedAt":8212,"visible":166,"__hash__":8219},{"type":8,"value":9601,"toc":9821},[9602,9606,9608,9610,9612,9614,9634,9636,9641,9643,9645,9673,9679,9681,9685,9687,9707,9709,9719,9721,9723,9725,9727,9729,9731,9733,9735,9737,9757,9759,9761,9765,9767,9769,9771,9773,9777,9779,9797,9799,9801,9803,9805,9807,9809,9811,9813,9815,9817,9819],[11,9603,9604],{},[27,9605],{"alt":7899,"src":7900},[11,9607,7903],{},[11,9609,7906],{},[15,9611,7910],{"id":7909},[11,9613,7913],{},[64,9615,9616],{"className":66,"code":7916,"language":68,"meta":69,"style":69},[34,9617,9618,9622,9626,9630],{"__ignoreMap":69},[73,9619,9620],{"class":75,"line":76},[73,9621,7923],{},[73,9623,9624],{"class":75,"line":152},[73,9625,7928],{},[73,9627,9628],{"class":75,"line":420},[73,9629,956],{"emptyLinePlaceholder":166},[73,9631,9632],{"class":75,"line":426},[73,9633,7937],{},[11,9635,7940],{},[64,9637,9639],{"className":9638,"code":7944,"language":87,"meta":69},[85],[34,9640,7944],{"__ignoreMap":69},[11,9642,7949],{},[11,9644,7952],{},[64,9646,9647],{"className":66,"code":7955,"language":68,"meta":69,"style":69},[34,9648,9649,9653,9657,9661,9665,9669],{"__ignoreMap":69},[73,9650,9651],{"class":75,"line":76},[73,9652,7962],{},[73,9654,9655],{"class":75,"line":152},[73,9656,956],{"emptyLinePlaceholder":166},[73,9658,9659],{"class":75,"line":420},[73,9660,7971],{},[73,9662,9663],{"class":75,"line":426},[73,9664,7976],{},[73,9666,9667],{"class":75,"line":618},[73,9668,2833],{},[73,9670,9671],{"class":75,"line":1156},[73,9672,7985],{},[11,9674,9675,666,9677,7992],{},[34,9676,2770],{},[34,9678,2776],{},[15,9680,7996],{"id":7995},[11,9682,7999,9683,8002],{},[34,9684,36],{},[11,9686,8005],{},[64,9688,9689],{"className":66,"code":8008,"language":68,"meta":69,"style":69},[34,9690,9691,9695,9699,9703],{"__ignoreMap":69},[73,9692,9693],{"class":75,"line":76},[73,9694,8015],{},[73,9696,9697],{"class":75,"line":152},[73,9698,8020],{},[73,9700,9701],{"class":75,"line":420},[73,9702,8025],{},[73,9704,9705],{"class":75,"line":426},[73,9706,8030],{},[11,9708,8033],{},[64,9710,9711],{"className":230,"code":8036,"language":232,"meta":69,"style":69},[34,9712,9713],{"__ignoreMap":69},[73,9714,9715,9717],{"class":75,"line":76},[73,9716,204],{"class":239},[73,9718,615],{"class":253},[11,9720,8047],{},[15,9722,8051],{"id":8050},[1371,9724,8054],{"id":8054},[11,9726,8057],{},[1371,9728,8060],{"id":8060},[11,9730,8063],{},[1371,9732,8066],{"id":8066},[11,9734,8069],{},[11,9736,8072],{},[64,9738,9739],{"className":66,"code":8075,"language":68,"meta":69,"style":69},[34,9740,9741,9745,9749,9753],{"__ignoreMap":69},[73,9742,9743],{"class":75,"line":76},[73,9744,8082],{},[73,9746,9747],{"class":75,"line":152},[73,9748,956],{"emptyLinePlaceholder":166},[73,9750,9751],{"class":75,"line":420},[73,9752,8091],{},[73,9754,9755],{"class":75,"line":426},[73,9756,8096],{},[11,9758,8099],{},[1371,9760,8102],{"id":8102},[11,9762,8105,9763,8108],{},[34,9764,5215],{},[11,9766,8111],{},[1371,9768,8114],{"id":8114},[11,9770,8117],{},[15,9772,8121],{"id":8120},[11,9774,9775],{},[27,9776],{"alt":8126,"src":8127},[11,9778,8130],{},[42,9780,9781,9783,9785,9787,9789,9791,9793,9795],{},[45,9782,8135],{},[45,9784,8138],{},[45,9786,8141],{},[45,9788,8144],{},[45,9790,8147],{},[45,9792,8150],{},[45,9794,8153],{},[45,9796,8156],{},[11,9798,8159],{},[15,9800,8163],{"id":8162},[11,9802,8166],{},[11,9804,8169],{},[15,9806,8173],{"id":8172},[11,9808,8176],{},[11,9810,8179],{},[11,9812,8182],{},[15,9814,8185],{"id":8185},[11,9816,8188],{},[11,9818,8191],{},[148,9820,8194],{},{"title":69,"searchDepth":152,"depth":152,"links":9822},[9823,9824,9825,9832,9833,9834,9835],{"id":7909,"depth":152,"text":7910},{"id":7995,"depth":152,"text":7996},{"id":8050,"depth":152,"text":8051,"children":9826},[9827,9828,9829,9830,9831],{"id":8054,"depth":420,"text":8054},{"id":8060,"depth":420,"text":8060},{"id":8066,"depth":420,"text":8066},{"id":8102,"depth":420,"text":8102},{"id":8114,"depth":420,"text":8114},{"id":8120,"depth":152,"text":8121},{"id":8162,"depth":152,"text":8163},{"id":8172,"depth":152,"text":8173},{"id":8185,"depth":152,"text":8185},{},{"title":7892,"description":69},[162,175,8218],{"id":5,"title":6,"body":9840,"category":162,"cover":163,"description":13,"extension":164,"meta":9939,"navigation":166,"path":167,"pinned":168,"publishedAt":169,"seo":9940,"slug":171,"stem":172,"summary":173,"tags":9941,"updatedAt":169,"visible":166,"__hash__":177},{"type":8,"value":9841,"toc":9929},[9842,9844,9846,9848,9850,9854,9858,9860,9870,9872,9874,9882,9884,9889,9891,9893,9903,9905,9913,9915,9921,9923,9925,9927],[11,9843,13],{},[15,9845,17],{"id":17},[11,9847,20],{},[15,9849,23],{"id":23},[11,9851,9852],{},[27,9853],{"alt":29,"src":30},[11,9855,9856,37],{},[34,9857,36],{},[15,9859,40],{"id":40},[42,9861,9862,9866,9868],{},[45,9863,47,9864,50],{},[34,9865,36],{},[45,9867,53],{},[45,9869,56],{},[15,9871,59],{"id":59},[11,9873,62],{},[64,9875,9876],{"className":66,"code":67,"language":68,"meta":69,"style":69},[34,9877,9878],{"__ignoreMap":69},[73,9879,9880],{"class":75,"line":76},[73,9881,67],{},[11,9883,81],{},[64,9885,9887],{"className":9886,"code":86,"language":87,"meta":69},[85],[34,9888,86],{"__ignoreMap":69},[11,9890,92],{},[15,9892,95],{"id":95},[97,9894,9895,9899],{},[45,9896,101,9897,105],{},[34,9898,104],{},[45,9900,108,9901,112],{},[34,9902,111],{},[15,9904,115],{"id":115},[42,9906,9907,9909],{},[45,9908,120],{},[45,9910,123,9911,126],{},[34,9912,36],{},[15,9914,129],{"id":129},[97,9916,9917,9919],{},[45,9918,134],{},[45,9920,137],{},[11,9922,140],{},[15,9924,143],{"id":143},[11,9926,146],{},[148,9928,150],{},{"title":69,"searchDepth":152,"depth":152,"links":9930},[9931,9932,9933,9934,9935,9936,9937,9938],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":6,"description":13},[162,175,176],{"id":179,"title":180,"body":9943,"category":162,"cover":163,"description":185,"extension":164,"meta":10058,"navigation":166,"path":334,"pinned":168,"publishedAt":169,"seo":10059,"slug":336,"stem":337,"summary":338,"tags":10060,"updatedAt":169,"visible":166,"__hash__":342},{"type":8,"value":9944,"toc":10048},[9945,9947,9949,9951,9953,9957,9961,9963,9973,9975,9977,9997,9999,10004,10006,10008,10018,10020,10030,10032,10040,10042,10044,10046],[11,9946,185],{},[15,9948,17],{"id":17},[11,9950,190],{},[15,9952,23],{"id":23},[11,9954,9955],{},[27,9956],{"alt":197,"src":198},[11,9958,201,9959,205],{},[34,9960,204],{},[15,9962,40],{"id":40},[42,9964,9965,9967,9969],{},[45,9966,212],{},[45,9968,215],{},[45,9970,218,9971,222],{},[34,9972,221],{},[15,9974,59],{"id":59},[11,9976,227],{},[64,9978,9979],{"className":230,"code":231,"language":232,"meta":69,"style":69},[34,9980,9981,9987],{"__ignoreMap":69},[73,9982,9983,9985],{"class":75,"line":76},[73,9984,204],{"class":239},[73,9986,243],{"class":242},[73,9988,9989,9991,9993,9995],{"class":75,"line":152},[73,9990,204],{"class":239},[73,9992,250],{"class":242},[73,9994,254],{"class":253},[73,9996,243],{"class":242},[11,9998,81],{},[64,10000,10002],{"className":10001,"code":262,"language":87,"meta":69},[85],[34,10003,262],{"__ignoreMap":69},[11,10005,92],{},[15,10007,95],{"id":95},[97,10009,10010,10014],{},[45,10011,10012,276],{},[34,10013,275],{},[45,10015,10016,282],{},[34,10017,281],{},[15,10019,115],{"id":115},[42,10021,10022,10026],{},[45,10023,289,10024,292],{},[34,10025,204],{},[45,10027,295,10028,298],{},[34,10029,204],{},[15,10031,129],{"id":129},[97,10033,10034,10038],{},[45,10035,305,10036,309],{},[34,10037,308],{},[45,10039,312],{},[11,10041,140],{},[15,10043,143],{"id":143},[11,10045,319],{},[148,10047,322],{},{"title":69,"searchDepth":152,"depth":152,"links":10049},[10050,10051,10052,10053,10054,10055,10056,10057],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":180,"description":185},[162,340,341],{"id":344,"title":345,"body":10062,"category":162,"cover":163,"description":514,"extension":164,"meta":10189,"navigation":166,"path":516,"pinned":168,"publishedAt":169,"seo":10190,"slug":518,"stem":519,"summary":520,"tags":10191,"updatedAt":169,"visible":166,"__hash__":524},{"type":8,"value":10063,"toc":10179},[10064,10068,10070,10072,10074,10078,10080,10082,10098,10100,10102,10122,10124,10129,10131,10133,10145,10147,10157,10159,10169,10171,10173,10177],[11,10065,350,10066,353],{},[34,10067,36],{},[15,10069,17],{"id":17},[11,10071,358],{},[15,10073,23],{"id":23},[11,10075,10076],{},[27,10077],{"alt":365,"src":366},[11,10079,369],{},[15,10081,40],{"id":40},[42,10083,10084,10090,10094],{},[45,10085,376,10086,379,10088,383],{},[34,10087,204],{},[34,10089,382],{},[45,10091,386,10092,390],{},[34,10093,389],{},[45,10095,393,10096,396],{},[34,10097,36],{},[15,10099,59],{"id":59},[11,10101,62],{},[64,10103,10104],{"className":403,"code":404,"language":405,"meta":69,"style":69},[34,10105,10106,10110,10114,10118],{"__ignoreMap":69},[73,10107,10108],{"class":75,"line":76},[73,10109,412],{},[73,10111,10112],{"class":75,"line":152},[73,10113,417],{},[73,10115,10116],{"class":75,"line":420},[73,10117,423],{},[73,10119,10120],{"class":75,"line":426},[73,10121,429],{},[11,10123,81],{},[64,10125,10127],{"className":10126,"code":435,"language":87,"meta":69},[85],[34,10128,435],{"__ignoreMap":69},[11,10130,92],{},[15,10132,95],{"id":95},[97,10134,10135,10141],{},[45,10136,446,10137,450,10139,383],{},[34,10138,449],{},[34,10140,453],{},[45,10142,456,10143,459],{},[34,10144,111],{},[15,10146,115],{"id":115},[42,10148,10149,10155],{},[45,10150,466,10151,469,10153,472],{},[34,10152,382],{},[34,10154,36],{},[45,10156,475],{},[15,10158,129],{"id":129},[97,10160,10161,10165],{},[45,10162,482,10163,383],{},[34,10164,485],{},[45,10166,488,10167,491],{},[34,10168,111],{},[11,10170,140],{},[15,10172,143],{"id":143},[11,10174,498,10175,501],{},[34,10176,36],{},[148,10178,150],{},{"title":69,"searchDepth":152,"depth":152,"links":10180},[10181,10182,10183,10184,10185,10186,10187,10188],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":345,"description":514},[162,522,523],{"id":526,"title":527,"body":10193,"category":162,"cover":163,"description":532,"extension":164,"meta":10332,"navigation":166,"path":707,"pinned":168,"publishedAt":169,"seo":10333,"slug":709,"stem":710,"summary":711,"tags":10334,"updatedAt":169,"visible":166,"__hash__":715},{"type":8,"value":10194,"toc":10322},[10195,10197,10199,10201,10203,10207,10211,10213,10225,10227,10229,10265,10267,10272,10274,10276,10292,10294,10304,10306,10314,10316,10318,10320],[11,10196,532],{},[15,10198,17],{"id":17},[11,10200,537],{},[15,10202,23],{"id":23},[11,10204,10205],{},[27,10206],{"alt":544,"src":545},[11,10208,10209,551],{},[34,10210,550],{},[15,10212,40],{"id":40},[42,10214,10215,10217,10223],{},[45,10216,558],{},[45,10218,10219,564,10221,568],{},[34,10220,563],{},[34,10222,567],{},[45,10224,571],{},[15,10226,59],{"id":59},[11,10228,227],{},[64,10230,10231],{"className":230,"code":578,"language":232,"meta":69,"style":69},[34,10232,10233,10239,10245,10249,10259],{"__ignoreMap":69},[73,10234,10235,10237],{"class":75,"line":76},[73,10236,585],{"class":239},[73,10238,588],{"class":253},[73,10240,10241,10243],{"class":75,"line":152},[73,10242,593],{"class":242},[73,10244,588],{"class":253},[73,10246,10247],{"class":75,"line":420},[73,10248,600],{"class":242},[73,10250,10251,10253,10255,10257],{"class":75,"line":426},[73,10252,605],{"class":242},[73,10254,608],{"class":253},[73,10256,612],{"class":611},[73,10258,615],{"class":253},[73,10260,10261,10263],{"class":75,"line":618},[73,10262,204],{"class":239},[73,10264,615],{"class":253},[11,10266,81],{},[64,10268,10270],{"className":10269,"code":628,"language":87,"meta":69},[85],[34,10271,628],{"__ignoreMap":69},[11,10273,92],{},[15,10275,95],{"id":95},[97,10277,10278,10286],{},[45,10279,10280,641,10282,644,10284,647],{},[34,10281,585],{},[34,10283,593],{},[34,10285,563],{},[45,10287,10288,652,10290,656],{},[34,10289,550],{},[34,10291,655],{},[15,10293,115],{"id":115},[42,10295,10296,10302],{},[45,10297,663,10298,666,10300,383],{},[34,10299,563],{},[34,10301,567],{},[45,10303,671],{},[15,10305,129],{"id":129},[97,10307,10308,10312],{},[45,10309,678,10310,682],{},[34,10311,681],{},[45,10313,685],{},[11,10315,140],{},[15,10317,143],{"id":143},[11,10319,692],{},[148,10321,695],{},{"title":69,"searchDepth":152,"depth":152,"links":10323},[10324,10325,10326,10327,10328,10329,10330,10331],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":527,"description":532},[162,713,714],{"id":717,"title":718,"body":10336,"category":162,"cover":163,"description":723,"extension":164,"meta":10457,"navigation":166,"path":872,"pinned":168,"publishedAt":169,"seo":10458,"slug":874,"stem":875,"summary":876,"tags":10459,"updatedAt":169,"visible":166,"__hash__":880},{"type":8,"value":10337,"toc":10447},[10338,10340,10342,10344,10346,10350,10358,10360,10374,10376,10378,10394,10396,10401,10403,10405,10419,10421,10427,10429,10439,10441,10443,10445],[11,10339,723],{},[15,10341,17],{"id":17},[11,10343,728],{},[15,10345,23],{"id":23},[11,10347,10348],{},[27,10349],{"alt":735,"src":736},[11,10351,739,10352,383,10354,745,10356,383],{},[34,10353,111],{},[34,10355,744],{},[34,10357,449],{},[15,10359,40],{"id":40},[42,10361,10362,10366,10372],{},[45,10363,10364,757],{},[34,10365,756],{},[45,10367,10368,763,10370,383],{},[34,10369,762],{},[34,10371,766],{},[45,10373,769],{},[15,10375,59],{"id":59},[11,10377,62],{},[64,10379,10380],{"className":66,"code":776,"language":68,"meta":69,"style":69},[34,10381,10382,10386,10390],{"__ignoreMap":69},[73,10383,10384],{"class":75,"line":76},[73,10385,783],{},[73,10387,10388],{"class":75,"line":152},[73,10389,788],{},[73,10391,10392],{"class":75,"line":420},[73,10393,793],{},[11,10395,81],{},[64,10397,10399],{"className":10398,"code":799,"language":87,"meta":69},[85],[34,10400,799],{"__ignoreMap":69},[11,10402,92],{},[15,10404,95],{"id":95},[97,10406,10407,10413],{},[45,10408,10409,813,10411,383],{},[34,10410,812],{},[34,10412,766],{},[45,10414,10415,820,10417,824],{},[34,10416,111],{},[34,10418,823],{},[15,10420,115],{"id":115},[42,10422,10423,10425],{},[45,10424,831],{},[45,10426,834],{},[15,10428,129],{"id":129},[97,10430,10431,10433],{},[45,10432,841],{},[45,10434,844,10435,847,10437,851],{},[34,10436,744],{},[34,10438,850],{},[11,10440,140],{},[15,10442,143],{"id":143},[11,10444,858],{},[148,10446,150],{},{"title":69,"searchDepth":152,"depth":152,"links":10448},[10449,10450,10451,10452,10453,10454,10455,10456],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":718,"description":723},[162,878,879],{"id":882,"title":883,"body":10461,"category":162,"cover":163,"description":888,"extension":164,"meta":10594,"navigation":166,"path":1057,"pinned":168,"publishedAt":169,"seo":10595,"slug":1059,"stem":1060,"summary":1061,"tags":10596,"updatedAt":169,"visible":166,"__hash__":1065},{"type":8,"value":10462,"toc":10584},[10463,10465,10467,10469,10471,10475,10477,10479,10495,10497,10499,10523,10525,10530,10532,10534,10550,10552,10564,10566,10576,10578,10580,10582],[11,10464,888],{},[15,10466,17],{"id":17},[11,10468,893],{},[15,10470,23],{"id":23},[11,10472,10473],{},[27,10474],{"alt":900,"src":901},[11,10476,904],{},[15,10478,40],{"id":40},[42,10480,10481,10483,10489],{},[45,10482,911],{},[45,10484,914,10485,847,10487,921],{},[34,10486,917],{},[34,10488,920],{},[45,10490,924,10491,928,10493,932],{},[34,10492,927],{},[34,10494,931],{},[15,10496,59],{"id":59},[11,10498,62],{},[64,10500,10501],{"className":66,"code":939,"language":68,"meta":69,"style":69},[34,10502,10503,10507,10511,10515,10519],{"__ignoreMap":69},[73,10504,10505],{"class":75,"line":76},[73,10506,946],{},[73,10508,10509],{"class":75,"line":152},[73,10510,951],{},[73,10512,10513],{"class":75,"line":420},[73,10514,956],{"emptyLinePlaceholder":166},[73,10516,10517],{"class":75,"line":426},[73,10518,961],{},[73,10520,10521],{"class":75,"line":618},[73,10522,951],{},[11,10524,81],{},[64,10526,10528],{"className":10527,"code":971,"language":87,"meta":69},[85],[34,10529,971],{"__ignoreMap":69},[11,10531,92],{},[15,10533,95],{"id":95},[97,10535,10536,10542],{},[45,10537,305,10538,985,10540,988],{},[34,10539,984],{},[34,10541,917],{},[45,10543,305,10544,994,10546,998,10548,383],{},[34,10545,993],{},[34,10547,997],{},[34,10549,1001],{},[15,10551,115],{"id":115},[42,10553,10554,10556],{},[45,10555,1008],{},[45,10557,1011,10558,928,10560,928,10562,1019],{},[34,10559,927],{},[34,10561,931],{},[34,10563,1018],{},[15,10565,129],{"id":129},[97,10567,10568,10574],{},[45,10569,1026,10570,666,10572,1033],{},[34,10571,1029],{},[34,10573,1032],{},[45,10575,1036],{},[11,10577,140],{},[15,10579,143],{"id":143},[11,10581,1043],{},[148,10583,150],{},{"title":69,"searchDepth":152,"depth":152,"links":10585},[10586,10587,10588,10589,10590,10591,10592,10593],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":883,"description":888},[162,1063,1064],{"id":1067,"title":1068,"body":10598,"category":162,"cover":163,"description":1073,"extension":164,"meta":10731,"navigation":166,"path":1241,"pinned":168,"publishedAt":169,"seo":10732,"slug":1243,"stem":1244,"summary":1245,"tags":10733,"updatedAt":169,"visible":166,"__hash__":1249},{"type":8,"value":10599,"toc":10721},[10600,10602,10604,10606,10608,10612,10614,10616,10634,10636,10638,10674,10676,10681,10683,10685,10695,10697,10705,10707,10713,10715,10717,10719],[11,10601,1073],{},[15,10603,17],{"id":17},[11,10605,1078],{},[15,10607,23],{"id":23},[11,10609,10610],{},[27,10611],{"alt":1085,"src":1086},[11,10613,1089],{},[15,10615,40],{"id":40},[42,10617,10618,10624,10632],{},[45,10619,10620,1099,10622,1103],{},[34,10621,1098],{},[34,10623,1102],{},[45,10625,10626,1109,10628,1113,10630,1117],{},[34,10627,1108],{},[34,10629,1112],{},[34,10631,1116],{},[45,10633,1120],{},[15,10635,59],{"id":59},[11,10637,62],{},[64,10639,10640],{"className":66,"code":1127,"language":68,"meta":69,"style":69},[34,10641,10642,10646,10650,10654,10658,10662,10666,10670],{"__ignoreMap":69},[73,10643,10644],{"class":75,"line":76},[73,10645,1134],{},[73,10647,10648],{"class":75,"line":152},[73,10649,1139],{},[73,10651,10652],{"class":75,"line":420},[73,10653,1144],{},[73,10655,10656],{"class":75,"line":426},[73,10657,956],{"emptyLinePlaceholder":166},[73,10659,10660],{"class":75,"line":618},[73,10661,1153],{},[73,10663,10664],{"class":75,"line":1156},[73,10665,1159],{},[73,10667,10668],{"class":75,"line":1162},[73,10669,1165],{},[73,10671,10672],{"class":75,"line":1168},[73,10673,1171],{},[11,10675,81],{},[64,10677,10679],{"className":10678,"code":1177,"language":87,"meta":69},[85],[34,10680,1177],{"__ignoreMap":69},[11,10682,92],{},[15,10684,95],{"id":95},[97,10686,10687,10691],{},[45,10688,10689,1191],{},[34,10690,1190],{},[45,10692,10693,1197],{},[34,10694,1196],{},[15,10696,115],{"id":115},[42,10698,10699,10703],{},[45,10700,1204,10701,383],{},[34,10702,1207],{},[45,10704,1210],{},[15,10706,129],{"id":129},[97,10708,10709,10711],{},[45,10710,1217],{},[45,10712,1220],{},[11,10714,140],{},[15,10716,143],{"id":143},[11,10718,1227],{},[148,10720,150],{},{"title":69,"searchDepth":152,"depth":152,"links":10722},[10723,10724,10725,10726,10727,10728,10729,10730],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":1068,"description":1073},[162,1247,1248],{"id":1251,"title":1252,"body":10735,"category":162,"cover":163,"description":1257,"extension":164,"meta":10872,"navigation":166,"path":1435,"pinned":168,"publishedAt":169,"seo":10873,"slug":1437,"stem":1438,"summary":1439,"tags":10874,"updatedAt":169,"visible":166,"__hash__":1443},{"type":8,"value":10736,"toc":10860},[10737,10739,10741,10743,10745,10749,10755,10757,10765,10767,10769,10793,10795,10800,10802,10804,10822,10824,10826,10830,10832,10834,10840,10842,10852,10854,10856,10858],[11,10738,1257],{},[15,10740,17],{"id":17},[11,10742,1262],{},[15,10744,23],{"id":23},[11,10746,10747],{},[27,10748],{"alt":1269,"src":1270},[11,10750,1273,10751,1277,10753,383],{},[34,10752,1276],{},[34,10754,1280],{},[15,10756,40],{"id":40},[42,10758,10759,10761,10763],{},[45,10760,1287],{},[45,10762,1290],{},[45,10764,1293],{},[15,10766,59],{"id":59},[11,10768,62],{},[64,10770,10771],{"className":66,"code":1300,"language":68,"meta":69,"style":69},[34,10772,10773,10777,10781,10785,10789],{"__ignoreMap":69},[73,10774,10775],{"class":75,"line":76},[73,10776,1307],{},[73,10778,10779],{"class":75,"line":152},[73,10780,1312],{},[73,10782,10783],{"class":75,"line":420},[73,10784,1317],{},[73,10786,10787],{"class":75,"line":426},[73,10788,1322],{},[73,10790,10791],{"class":75,"line":618},[73,10792,1327],{},[11,10794,81],{},[64,10796,10798],{"className":10797,"code":1333,"language":87,"meta":69},[85],[34,10799,1333],{"__ignoreMap":69},[11,10801,92],{},[15,10803,95],{"id":95},[97,10805,10806,10814],{},[45,10807,1344,10808,1347,10810,1351,10812,1355],{},[34,10809,162],{},[34,10811,1350],{},[34,10813,1354],{},[45,10815,10816,1361,10818,1365,10820,1369],{},[34,10817,1360],{},[34,10819,1364],{},[34,10821,1368],{},[1371,10823,1373],{"id":1373},[11,10825,1376],{},[11,10827,10828],{},[27,10829],{"alt":1381,"src":1382},[11,10831,1385],{},[15,10833,115],{"id":115},[42,10835,10836,10838],{},[45,10837,1392],{},[45,10839,1395],{},[15,10841,129],{"id":129},[97,10843,10844,10850],{},[45,10845,1402,10846,1406,10848,383],{},[34,10847,1405],{},[34,10849,1409],{},[45,10851,1412],{},[11,10853,140],{},[15,10855,143],{"id":143},[11,10857,1419],{},[148,10859,150],{},{"title":69,"searchDepth":152,"depth":152,"links":10861},[10862,10863,10864,10865,10866,10869,10870,10871],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":10867},[10868],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":1252,"description":1257},[162,1441,1442],{"id":1445,"title":1446,"body":10876,"category":162,"cover":163,"description":1451,"extension":164,"meta":11041,"navigation":166,"path":1667,"pinned":168,"publishedAt":169,"seo":11042,"slug":1669,"stem":1670,"summary":1671,"tags":11043,"updatedAt":169,"visible":166,"__hash__":1675},{"type":8,"value":10877,"toc":11029},[10878,10880,10882,10884,10886,10890,10896,10898,10918,10920,10922,10958,10960,10965,10967,10969,10983,10985,10987,10991,10997,10999,11009,11011,11021,11023,11025,11027],[11,10879,1451],{},[15,10881,17],{"id":17},[11,10883,1456],{},[15,10885,23],{"id":23},[11,10887,10888],{},[27,10889],{"alt":1463,"src":1464},[11,10891,1467,10892,1471,10894,1475],{},[34,10893,1470],{},[34,10895,1474],{},[15,10897,40],{"id":40},[42,10899,10900,10908,10916],{},[45,10901,10902,1485,10904,1489,10906,1493],{},[34,10903,1484],{},[34,10905,1488],{},[34,10907,1492],{},[45,10909,10910,1499,10912,1503,10914,1507],{},[34,10911,1498],{},[34,10913,1502],{},[34,10915,1506],{},[45,10917,1510],{},[15,10919,59],{"id":59},[11,10921,62],{},[64,10923,10924],{"className":66,"code":1517,"language":68,"meta":69,"style":69},[34,10925,10926,10930,10934,10938,10942,10946,10950,10954],{"__ignoreMap":69},[73,10927,10928],{"class":75,"line":76},[73,10929,1524],{},[73,10931,10932],{"class":75,"line":152},[73,10933,1529],{},[73,10935,10936],{"class":75,"line":420},[73,10937,956],{"emptyLinePlaceholder":166},[73,10939,10940],{"class":75,"line":426},[73,10941,1538],{},[73,10943,10944],{"class":75,"line":618},[73,10945,1543],{},[73,10947,10948],{"class":75,"line":1156},[73,10949,1548],{},[73,10951,10952],{"class":75,"line":1162},[73,10953,1553],{},[73,10955,10956],{"class":75,"line":1168},[73,10957,1558],{},[11,10959,81],{},[64,10961,10963],{"className":10962,"code":1564,"language":87,"meta":69},[85],[34,10964,1564],{"__ignoreMap":69},[11,10966,92],{},[15,10968,95],{"id":95},[97,10970,10971,10977],{},[45,10972,10973,1578,10975,1582],{},[34,10974,1577],{},[34,10976,1581],{},[45,10978,10979,1588,10981,1591],{},[34,10980,1587],{},[34,10982,1506],{},[1371,10984,1373],{"id":1373},[11,10986,1596],{},[11,10988,10989],{},[27,10990],{"alt":1601,"src":1602},[11,10992,10993,1607,10995,1610],{},[34,10994,1498],{},[34,10996,1502],{},[15,10998,115],{"id":115},[42,11000,11001,11007],{},[45,11002,1617,11003,1620,11005,1623],{},[34,11004,1492],{},[34,11006,1484],{},[45,11008,1626],{},[15,11010,129],{"id":129},[97,11012,11013,11017],{},[45,11014,1633,11015,1637],{},[34,11016,1636],{},[45,11018,1640,11019,1644],{},[34,11020,1643],{},[11,11022,140],{},[15,11024,143],{"id":143},[11,11026,1651],{},[148,11028,150],{},{"title":69,"searchDepth":152,"depth":152,"links":11030},[11031,11032,11033,11034,11035,11038,11039,11040],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":11036},[11037],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":1446,"description":1451},[162,1673,1674],{"id":1677,"title":1678,"body":11045,"category":162,"cover":163,"description":1683,"extension":164,"meta":11178,"navigation":166,"path":1852,"pinned":168,"publishedAt":169,"seo":11179,"slug":1854,"stem":1855,"summary":1856,"tags":11180,"updatedAt":169,"visible":166,"__hash__":1859},{"type":8,"value":11046,"toc":11168},[11047,11049,11051,11053,11055,11059,11069,11071,11081,11083,11085,11113,11115,11120,11122,11124,11138,11140,11148,11150,11160,11162,11164,11166],[11,11048,1683],{},[15,11050,17],{"id":17},[11,11052,1688],{},[15,11054,23],{"id":23},[11,11056,11057],{},[27,11058],{"alt":1695,"src":1696},[11,11060,11061,1702,11063,1706,11065,1710,11067,1714],{},[34,11062,1701],{},[34,11064,1705],{},[34,11066,1709],{},[34,11068,1713],{},[15,11070,40],{"id":40},[42,11072,11073,11075,11079],{},[45,11074,1721],{},[45,11076,11077,1726],{},[34,11078,1713],{},[45,11080,1729],{},[15,11082,59],{"id":59},[11,11084,62],{},[64,11086,11087],{"className":66,"code":1736,"language":68,"meta":69,"style":69},[34,11088,11089,11093,11097,11101,11105,11109],{"__ignoreMap":69},[73,11090,11091],{"class":75,"line":76},[73,11092,1743],{},[73,11094,11095],{"class":75,"line":152},[73,11096,1748],{},[73,11098,11099],{"class":75,"line":420},[73,11100,1753],{},[73,11102,11103],{"class":75,"line":426},[73,11104,956],{"emptyLinePlaceholder":166},[73,11106,11107],{"class":75,"line":618},[73,11108,1762],{},[73,11110,11111],{"class":75,"line":1156},[73,11112,1767],{},[11,11114,81],{},[64,11116,11118],{"className":11117,"code":1773,"language":87,"meta":69},[85],[34,11119,1773],{"__ignoreMap":69},[11,11121,92],{},[15,11123,95],{"id":95},[97,11125,11126,11132],{},[45,11127,1784,11128,1787,11130,1791],{},[34,11129,1701],{},[34,11131,1790],{},[45,11133,11134,1797,11136,1801],{},[34,11135,1796],{},[34,11137,1800],{},[15,11139,115],{"id":115},[42,11141,11142,11146],{},[45,11143,1808,11144,1812],{},[34,11145,1811],{},[45,11147,1815],{},[15,11149,129],{"id":129},[97,11151,11152,11154],{},[45,11153,1822],{},[45,11155,386,11156,1828,11158,1831],{},[34,11157,1827],{},[34,11159,1713],{},[11,11161,140],{},[15,11163,143],{"id":143},[11,11165,1838],{},[148,11167,150],{},{"title":69,"searchDepth":152,"depth":152,"links":11169},[11170,11171,11172,11173,11174,11175,11176,11177],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":1678,"description":1683},[162,1018,1858],{"id":1861,"title":1862,"body":11182,"category":162,"cover":163,"description":1867,"extension":164,"meta":11311,"navigation":166,"path":2028,"pinned":168,"publishedAt":169,"seo":11312,"slug":2030,"stem":2031,"summary":2032,"tags":11313,"updatedAt":169,"visible":166,"__hash__":2036},{"type":8,"value":11183,"toc":11301},[11184,11186,11188,11190,11192,11196,11200,11202,11212,11214,11216,11248,11250,11255,11257,11259,11271,11273,11283,11285,11293,11295,11297,11299],[11,11185,1867],{},[15,11187,17],{"id":17},[11,11189,1872],{},[15,11191,23],{"id":23},[11,11193,11194],{},[27,11195],{"alt":1879,"src":1880},[11,11197,1883,11198,1887],{},[34,11199,1886],{},[15,11201,40],{"id":40},[42,11203,11204,11206,11208],{},[45,11205,1894],{},[45,11207,1897],{},[45,11209,1900,11210,383],{},[34,11211,1903],{},[15,11213,59],{"id":59},[11,11215,62],{},[64,11217,11218],{"className":66,"code":1910,"language":68,"meta":69,"style":69},[34,11219,11220,11224,11228,11232,11236,11240,11244],{"__ignoreMap":69},[73,11221,11222],{"class":75,"line":76},[73,11223,1917],{},[73,11225,11226],{"class":75,"line":152},[73,11227,1922],{},[73,11229,11230],{"class":75,"line":420},[73,11231,956],{"emptyLinePlaceholder":166},[73,11233,11234],{"class":75,"line":426},[73,11235,1931],{},[73,11237,11238],{"class":75,"line":618},[73,11239,1936],{},[73,11241,11242],{"class":75,"line":1156},[73,11243,1941],{},[73,11245,11246],{"class":75,"line":1162},[73,11247,1946],{},[11,11249,81],{},[64,11251,11253],{"className":11252,"code":1952,"language":87,"meta":69},[85],[34,11254,1952],{"__ignoreMap":69},[11,11256,92],{},[15,11258,95],{"id":95},[97,11260,11261,11263],{},[45,11262,1963],{},[45,11264,11265,1969,11267,1973,11269,1977],{},[34,11266,1968],{},[34,11268,1972],{},[34,11270,1976],{},[15,11272,115],{"id":115},[42,11274,11275,11281],{},[45,11276,1984,11277,1988,11279,383],{},[34,11278,1987],{},[34,11280,1991],{},[45,11282,1994],{},[15,11284,129],{"id":129},[97,11286,11287,11289],{},[45,11288,2001],{},[45,11290,2004,11291,2007],{},[34,11292,1976],{},[11,11294,140],{},[15,11296,143],{"id":143},[11,11298,2014],{},[148,11300,150],{},{"title":69,"searchDepth":152,"depth":152,"links":11302},[11303,11304,11305,11306,11307,11308,11309,11310],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":1862,"description":1867},[162,2034,2035],{"id":2038,"title":2039,"body":11315,"category":162,"cover":163,"description":2044,"extension":164,"meta":11434,"navigation":166,"path":2186,"pinned":168,"publishedAt":169,"seo":11435,"slug":2188,"stem":2189,"summary":2190,"tags":11436,"updatedAt":169,"visible":166,"__hash__":2193},{"type":8,"value":11316,"toc":11424},[11317,11319,11321,11323,11325,11329,11331,11333,11341,11343,11345,11373,11375,11380,11382,11384,11394,11396,11404,11406,11416,11418,11420,11422],[11,11318,2044],{},[15,11320,17],{"id":17},[11,11322,2049],{},[15,11324,23],{"id":23},[11,11326,11327],{},[27,11328],{"alt":2056,"src":2057},[11,11330,2060],{},[15,11332,40],{"id":40},[42,11334,11335,11337,11339],{},[45,11336,2067],{},[45,11338,2070],{},[45,11340,2073],{},[15,11342,59],{"id":59},[11,11344,62],{},[64,11346,11347],{"className":66,"code":2080,"language":68,"meta":69,"style":69},[34,11348,11349,11353,11357,11361,11365,11369],{"__ignoreMap":69},[73,11350,11351],{"class":75,"line":76},[73,11352,2087],{},[73,11354,11355],{"class":75,"line":152},[73,11356,2092],{},[73,11358,11359],{"class":75,"line":420},[73,11360,2097],{},[73,11362,11363],{"class":75,"line":426},[73,11364,956],{"emptyLinePlaceholder":166},[73,11366,11367],{"class":75,"line":618},[73,11368,2106],{},[73,11370,11371],{"class":75,"line":1156},[73,11372,2111],{},[11,11374,81],{},[64,11376,11378],{"className":11377,"code":2117,"language":87,"meta":69},[85],[34,11379,2117],{"__ignoreMap":69},[11,11381,92],{},[15,11383,95],{"id":95},[97,11385,11386,11390],{},[45,11387,11388,2131],{},[34,11389,2130],{},[45,11391,11392,2137],{},[34,11393,2136],{},[15,11395,115],{"id":115},[42,11397,11398,11402],{},[45,11399,2144,11400,2148],{},[34,11401,2147],{},[45,11403,2151],{},[15,11405,129],{"id":129},[97,11407,11408,11410],{},[45,11409,2158],{},[45,11411,844,11412,847,11414,2165],{},[34,11413,2147],{},[34,11415,2136],{},[11,11417,140],{},[15,11419,143],{"id":143},[11,11421,2172],{},[148,11423,150],{},{"title":69,"searchDepth":152,"depth":152,"links":11425},[11426,11427,11428,11429,11430,11431,11432,11433],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":2039,"description":2044},[162,2192,2035],{"id":2195,"title":2196,"body":11438,"category":162,"cover":163,"description":2201,"extension":164,"meta":11563,"navigation":166,"path":2357,"pinned":168,"publishedAt":169,"seo":11564,"slug":2359,"stem":2360,"summary":2361,"tags":11565,"updatedAt":169,"visible":166,"__hash__":2364},{"type":8,"value":11439,"toc":11553},[11440,11442,11444,11446,11448,11452,11458,11460,11470,11472,11474,11502,11504,11509,11511,11513,11523,11525,11537,11539,11545,11547,11549,11551],[11,11441,2201],{},[15,11443,17],{"id":17},[11,11445,2206],{},[15,11447,23],{"id":23},[11,11449,11450],{},[27,11451],{"alt":2213,"src":2214},[11,11453,2217,11454,2221,11456,2224],{},[34,11455,2220],{},[34,11457,917],{},[15,11459,40],{"id":40},[42,11461,11462,11464,11468],{},[45,11463,2231],{},[45,11465,1011,11466,2237],{},[34,11467,2236],{},[45,11469,2240],{},[15,11471,59],{"id":59},[11,11473,62],{},[64,11475,11476],{"className":66,"code":2247,"language":68,"meta":69,"style":69},[34,11477,11478,11482,11486,11490,11494,11498],{"__ignoreMap":69},[73,11479,11480],{"class":75,"line":76},[73,11481,2254],{},[73,11483,11484],{"class":75,"line":152},[73,11485,2259],{},[73,11487,11488],{"class":75,"line":420},[73,11489,956],{"emptyLinePlaceholder":166},[73,11491,11492],{"class":75,"line":426},[73,11493,2268],{},[73,11495,11496],{"class":75,"line":618},[73,11497,2273],{},[73,11499,11500],{"class":75,"line":1156},[73,11501,2278],{},[11,11503,81],{},[64,11505,11507],{"className":11506,"code":2284,"language":87,"meta":69},[85],[34,11508,2284],{"__ignoreMap":69},[11,11510,92],{},[15,11512,95],{"id":95},[97,11514,11515,11517],{},[45,11516,2295],{},[45,11518,2298,11519,2301,11521,2305],{},[34,11520,917],{},[34,11522,2304],{},[15,11524,115],{"id":115},[42,11526,11527,11531],{},[45,11528,2312,11529,2316],{},[34,11530,2315],{},[45,11532,2319,11533,2323,11535,383],{},[34,11534,2322],{},[34,11536,2326],{},[15,11538,129],{"id":129},[97,11540,11541,11543],{},[45,11542,2333],{},[45,11544,2336],{},[11,11546,140],{},[15,11548,143],{"id":143},[11,11550,2343],{},[148,11552,150],{},{"title":69,"searchDepth":152,"depth":152,"links":11554},[11555,11556,11557,11558,11559,11560,11561,11562],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":2196,"description":2201},[162,2363,2035],{"id":2366,"title":2367,"body":11567,"category":162,"cover":163,"description":2372,"extension":164,"meta":11690,"navigation":166,"path":2522,"pinned":168,"publishedAt":169,"seo":11691,"slug":2524,"stem":2525,"summary":2526,"tags":11692,"updatedAt":169,"visible":166,"__hash__":2529},{"type":8,"value":11568,"toc":11680},[11569,11571,11573,11575,11577,11581,11583,11585,11597,11599,11601,11629,11631,11636,11638,11640,11650,11652,11662,11664,11672,11674,11676,11678],[11,11570,2372],{},[15,11572,17],{"id":17},[11,11574,2377],{},[15,11576,23],{"id":23},[11,11578,11579],{},[27,11580],{"alt":2384,"src":2385},[11,11582,2388],{},[15,11584,40],{"id":40},[42,11586,11587,11589,11591],{},[45,11588,2395],{},[45,11590,2398],{},[45,11592,2401,11593,2405,11595,2409],{},[34,11594,2404],{},[34,11596,2408],{},[15,11598,59],{"id":59},[11,11600,62],{},[64,11602,11603],{"className":66,"code":2416,"language":68,"meta":69,"style":69},[34,11604,11605,11609,11613,11617,11621,11625],{"__ignoreMap":69},[73,11606,11607],{"class":75,"line":76},[73,11608,2423],{},[73,11610,11611],{"class":75,"line":152},[73,11612,2428],{},[73,11614,11615],{"class":75,"line":420},[73,11616,956],{"emptyLinePlaceholder":166},[73,11618,11619],{"class":75,"line":426},[73,11620,2437],{},[73,11622,11623],{"class":75,"line":618},[73,11624,2442],{},[73,11626,11627],{"class":75,"line":1156},[73,11628,2447],{},[11,11630,81],{},[64,11632,11634],{"className":11633,"code":2453,"language":87,"meta":69},[85],[34,11635,2453],{"__ignoreMap":69},[11,11637,92],{},[15,11639,95],{"id":95},[97,11641,11642,11644],{},[45,11643,2464],{},[45,11645,11646,2470,11648,2474],{},[34,11647,2469],{},[34,11649,2473],{},[15,11651,115],{"id":115},[42,11653,11654,11660],{},[45,11655,1011,11656,2483,11658,383],{},[34,11657,2408],{},[34,11659,2404],{},[45,11661,2488],{},[15,11663,129],{"id":129},[97,11665,11666,11670],{},[45,11667,2495,11668,2498],{},[34,11669,2404],{},[45,11671,2501],{},[11,11673,140],{},[15,11675,143],{"id":143},[11,11677,2508],{},[148,11679,150],{},{"title":69,"searchDepth":152,"depth":152,"links":11681},[11682,11683,11684,11685,11686,11687,11688,11689],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":2367,"description":2372},[162,2528,2035],{"id":2531,"title":2532,"body":11694,"category":162,"cover":163,"description":2537,"extension":164,"meta":11853,"navigation":166,"path":2736,"pinned":168,"publishedAt":169,"seo":11854,"slug":2738,"stem":2739,"summary":2740,"tags":11855,"updatedAt":169,"visible":166,"__hash__":2744},{"type":8,"value":11695,"toc":11841},[11696,11698,11700,11702,11704,11708,11714,11716,11728,11730,11732,11772,11774,11779,11781,11783,11797,11799,11801,11805,11807,11809,11819,11821,11833,11835,11837,11839],[11,11697,2537],{},[15,11699,17],{"id":17},[11,11701,2542],{},[15,11703,23],{"id":23},[11,11705,11706],{},[27,11707],{"alt":2549,"src":2550},[11,11709,11710,2556,11712,2560],{},[34,11711,2555],{},[34,11713,2559],{},[15,11715,40],{"id":40},[42,11717,11718,11724,11726],{},[45,11719,11720,2569,11722,2573],{},[34,11721,1484],{},[34,11723,2572],{},[45,11725,2576],{},[45,11727,2579],{},[15,11729,59],{"id":59},[11,11731,62],{},[64,11733,11734],{"className":66,"code":2586,"language":68,"meta":69,"style":69},[34,11735,11736,11740,11744,11748,11752,11756,11760,11764,11768],{"__ignoreMap":69},[73,11737,11738],{"class":75,"line":76},[73,11739,2593],{},[73,11741,11742],{"class":75,"line":152},[73,11743,2598],{},[73,11745,11746],{"class":75,"line":420},[73,11747,2603],{},[73,11749,11750],{"class":75,"line":426},[73,11751,956],{"emptyLinePlaceholder":166},[73,11753,11754],{"class":75,"line":618},[73,11755,2612],{},[73,11757,11758],{"class":75,"line":1156},[73,11759,2617],{},[73,11761,11762],{"class":75,"line":1162},[73,11763,2622],{},[73,11765,11766],{"class":75,"line":1168},[73,11767,2627],{},[73,11769,11770],{"class":75,"line":2630},[73,11771,2633],{},[11,11773,81],{},[64,11775,11777],{"className":11776,"code":2639,"language":87,"meta":69},[85],[34,11778,2639],{"__ignoreMap":69},[11,11780,92],{},[15,11782,95],{"id":95},[97,11784,11785,11789],{},[45,11786,11787,2653],{},[34,11788,2652],{},[45,11790,11791,2659,11793,2663,11795,2667],{},[34,11792,2658],{},[34,11794,2662],{},[34,11796,2666],{},[1371,11798,1373],{"id":1373},[11,11800,2672],{},[11,11802,11803],{},[27,11804],{"alt":2677,"src":2678},[11,11806,2681],{},[15,11808,115],{"id":115},[42,11810,11811,11817],{},[45,11812,2688,11813,2691,11815,383],{},[34,11814,1484],{},[34,11816,2572],{},[45,11818,2696],{},[15,11820,129],{"id":129},[97,11822,11823,11825],{},[45,11824,2703],{},[45,11826,1011,11827,2709,11829,666,11831,383],{},[34,11828,2708],{},[34,11830,2572],{},[34,11832,1484],{},[11,11834,140],{},[15,11836,143],{"id":143},[11,11838,2720],{},[148,11840,150],{},{"title":69,"searchDepth":152,"depth":152,"links":11842},[11843,11844,11845,11846,11847,11850,11851,11852],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":11848},[11849],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":2532,"description":2537},[162,2742,2743],{"id":2746,"title":2747,"body":11857,"category":162,"cover":163,"description":2752,"extension":164,"meta":12029,"navigation":166,"path":2969,"pinned":168,"publishedAt":169,"seo":12030,"slug":2971,"stem":2972,"summary":2973,"tags":12031,"updatedAt":169,"visible":166,"__hash__":2976},{"type":8,"value":11858,"toc":12016},[11859,11861,11863,11865,11867,11871,11879,11881,11889,11891,11893,11937,11939,11944,11946,11948,11960,11962,11964,11968,11974,11976,11978,11982,11986,11988,12000,12002,12008,12010,12012,12014],[11,11860,2752],{},[15,11862,17],{"id":17},[11,11864,2757],{},[15,11866,23],{"id":23},[11,11868,11869],{},[27,11870],{"alt":2764,"src":2765},[11,11872,11873,928,11875,928,11877,2777],{},[34,11874,2770],{},[34,11876,2773],{},[34,11878,2776],{},[15,11880,40],{"id":40},[42,11882,11883,11885,11887],{},[45,11884,2784],{},[45,11886,2787],{},[45,11888,2790],{},[15,11890,59],{"id":59},[11,11892,62],{},[64,11894,11895],{"className":66,"code":2797,"language":68,"meta":69,"style":69},[34,11896,11897,11901,11905,11909,11913,11917,11921,11925,11929,11933],{"__ignoreMap":69},[73,11898,11899],{"class":75,"line":76},[73,11900,2804],{},[73,11902,11903],{"class":75,"line":152},[73,11904,956],{"emptyLinePlaceholder":166},[73,11906,11907],{"class":75,"line":420},[73,11908,2813],{},[73,11910,11911],{"class":75,"line":426},[73,11912,2818],{},[73,11914,11915],{"class":75,"line":618},[73,11916,2823],{},[73,11918,11919],{"class":75,"line":1156},[73,11920,2828],{},[73,11922,11923],{"class":75,"line":1162},[73,11924,2833],{},[73,11926,11927],{"class":75,"line":1168},[73,11928,2838],{},[73,11930,11931],{"class":75,"line":2630},[73,11932,956],{"emptyLinePlaceholder":166},[73,11934,11935],{"class":75,"line":2845},[73,11936,2848],{},[11,11938,81],{},[64,11940,11942],{"className":11941,"code":2854,"language":87,"meta":69},[85],[34,11943,2854],{"__ignoreMap":69},[11,11945,92],{},[15,11947,95],{"id":95},[97,11949,11950,11954],{},[45,11951,2865,11952,2869],{},[34,11953,2868],{},[45,11955,11956,2875,11958,2878],{},[34,11957,2874],{},[34,11959,2776],{},[1371,11961,1373],{"id":1373},[11,11963,2883],{},[11,11965,11966],{},[27,11967],{"alt":2888,"src":2889},[11,11969,11970,2894,11972,2897],{},[34,11971,2868],{},[34,11973,2874],{},[1371,11975,1373],{"id":2900},[11,11977,2903],{},[11,11979,11980],{},[27,11981],{"alt":2908,"src":2909},[11,11983,2912,11984,2915],{},[34,11985,2770],{},[15,11987,115],{"id":115},[42,11989,11990,11994],{},[45,11991,2922,11992,2925],{},[34,11993,2874],{},[45,11995,2928,11996,2931,11998,2935],{},[34,11997,2770],{},[34,11999,2934],{},[15,12001,129],{"id":129},[97,12003,12004,12006],{},[45,12005,2942],{},[45,12007,2945],{},[11,12009,140],{},[15,12011,143],{"id":143},[11,12013,2952],{},[148,12015,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12017},[12018,12019,12020,12021,12022,12026,12027,12028],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":12023},[12024,12025],{"id":1373,"depth":420,"text":1373},{"id":2900,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":2747,"description":2752},[162,2770,2975],{"id":2978,"title":2979,"body":12033,"category":162,"cover":163,"description":2984,"extension":164,"meta":12170,"navigation":166,"path":3151,"pinned":168,"publishedAt":169,"seo":12171,"slug":3153,"stem":3154,"summary":3155,"tags":12172,"updatedAt":169,"visible":166,"__hash__":3158},{"type":8,"value":12034,"toc":12158},[12035,12037,12039,12041,12043,12047,12051,12053,12063,12065,12067,12099,12101,12106,12108,12110,12120,12122,12124,12128,12132,12134,12140,12142,12150,12152,12154,12156],[11,12036,2984],{},[15,12038,17],{"id":17},[11,12040,2989],{},[15,12042,23],{"id":23},[11,12044,12045],{},[27,12046],{"alt":2996,"src":2997},[11,12048,12049,3003],{},[34,12050,3002],{},[15,12052,40],{"id":40},[42,12054,12055,12057,12059],{},[45,12056,3010],{},[45,12058,3013],{},[45,12060,3016,12061,3020],{},[34,12062,3019],{},[15,12064,59],{"id":59},[11,12066,62],{},[64,12068,12069],{"className":66,"code":3027,"language":68,"meta":69,"style":69},[34,12070,12071,12075,12079,12083,12087,12091,12095],{"__ignoreMap":69},[73,12072,12073],{"class":75,"line":76},[73,12074,3034],{},[73,12076,12077],{"class":75,"line":152},[73,12078,956],{"emptyLinePlaceholder":166},[73,12080,12081],{"class":75,"line":420},[73,12082,3043],{},[73,12084,12085],{"class":75,"line":426},[73,12086,3048],{},[73,12088,12089],{"class":75,"line":618},[73,12090,3053],{},[73,12092,12093],{"class":75,"line":1156},[73,12094,956],{"emptyLinePlaceholder":166},[73,12096,12097],{"class":75,"line":1162},[73,12098,3062],{},[11,12100,81],{},[64,12102,12104],{"className":12103,"code":3068,"language":87,"meta":69},[85],[34,12105,3068],{"__ignoreMap":69},[11,12107,92],{},[15,12109,95],{"id":95},[97,12111,12112,12116],{},[45,12113,3079,12114,3083],{},[34,12115,3082],{},[45,12117,3086,12118,3089],{},[34,12119,3082],{},[1371,12121,1373],{"id":1373},[11,12123,3094],{},[11,12125,12126],{},[27,12127],{"alt":3099,"src":3100},[11,12129,3103,12130,3106],{},[34,12131,3082],{},[15,12133,115],{"id":115},[42,12135,12136,12138],{},[45,12137,3113],{},[45,12139,3116],{},[15,12141,129],{"id":129},[97,12143,12144,12148],{},[45,12145,1011,12146,3125],{},[34,12147,3002],{},[45,12149,3128],{},[11,12151,140],{},[15,12153,143],{"id":143},[11,12155,3135],{},[148,12157,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12159},[12160,12161,12162,12163,12164,12167,12168,12169],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":12165},[12166],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":2979,"description":2984},[162,3002,3157],{"id":3160,"title":3161,"body":12174,"category":162,"cover":163,"description":3166,"extension":164,"meta":12299,"navigation":166,"path":3315,"pinned":168,"publishedAt":169,"seo":12300,"slug":3317,"stem":3318,"summary":3319,"tags":12301,"updatedAt":169,"visible":166,"__hash__":3322},{"type":8,"value":12175,"toc":12289},[12176,12178,12180,12182,12184,12188,12192,12194,12204,12206,12208,12240,12242,12247,12249,12251,12263,12265,12271,12273,12281,12283,12285,12287],[11,12177,3166],{},[15,12179,17],{"id":17},[11,12181,3171],{},[15,12183,23],{"id":23},[11,12185,12186],{},[27,12187],{"alt":3178,"src":3179},[11,12189,12190,3184],{},[34,12191,3019],{},[15,12193,40],{"id":40},[42,12195,12196,12200,12202],{},[45,12197,12198,3194],{},[34,12199,3193],{},[45,12201,3197],{},[45,12203,3200],{},[15,12205,59],{"id":59},[11,12207,62],{},[64,12209,12210],{"className":66,"code":3207,"language":68,"meta":69,"style":69},[34,12211,12212,12216,12220,12224,12228,12232,12236],{"__ignoreMap":69},[73,12213,12214],{"class":75,"line":76},[73,12215,3214],{},[73,12217,12218],{"class":75,"line":152},[73,12219,956],{"emptyLinePlaceholder":166},[73,12221,12222],{"class":75,"line":420},[73,12223,3223],{},[73,12225,12226],{"class":75,"line":426},[73,12227,3228],{},[73,12229,12230],{"class":75,"line":618},[73,12231,956],{"emptyLinePlaceholder":166},[73,12233,12234],{"class":75,"line":1156},[73,12235,3237],{},[73,12237,12238],{"class":75,"line":1162},[73,12239,3242],{},[11,12241,81],{},[64,12243,12245],{"className":12244,"code":3248,"language":87,"meta":69},[85],[34,12246,3248],{"__ignoreMap":69},[11,12248,92],{},[15,12250,95],{"id":95},[97,12252,12253,12259],{},[45,12254,3259,12255,3262,12257,3266],{},[34,12256,3019],{},[34,12258,3265],{},[45,12260,12261,3271],{},[34,12262,3193],{},[15,12264,115],{"id":115},[42,12266,12267,12269],{},[45,12268,3278],{},[45,12270,3281],{},[15,12272,129],{"id":129},[97,12274,12275,12277],{},[45,12276,3288],{},[45,12278,1011,12279,3294],{},[34,12280,3293],{},[11,12282,140],{},[15,12284,143],{"id":143},[11,12286,3301],{},[148,12288,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12290},[12291,12292,12293,12294,12295,12296,12297,12298],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":3161,"description":3166},[162,3019,3321],{"id":3324,"title":3325,"body":12303,"category":162,"cover":163,"description":3330,"extension":164,"meta":12448,"navigation":166,"path":3505,"pinned":168,"publishedAt":169,"seo":12449,"slug":3507,"stem":3508,"summary":3509,"tags":12450,"updatedAt":169,"visible":166,"__hash__":3511},{"type":8,"value":12304,"toc":12438},[12305,12307,12309,12311,12313,12317,12323,12325,12339,12341,12343,12387,12389,12394,12396,12398,12408,12410,12422,12424,12430,12432,12434,12436],[11,12306,3330],{},[15,12308,17],{"id":17},[11,12310,3335],{},[15,12312,23],{"id":23},[11,12314,12315],{},[27,12316],{"alt":3342,"src":3343},[11,12318,12319,3349,12321,3353],{},[34,12320,3348],{},[34,12322,3352],{},[15,12324,40],{"id":40},[42,12326,12327,12329,12335],{},[45,12328,3360],{},[45,12330,12331,3365,12333,3368],{},[34,12332,3348],{},[34,12334,3002],{},[45,12336,3371,12337,3374],{},[34,12338,3352],{},[15,12340,59],{"id":59},[11,12342,62],{},[64,12344,12345],{"className":66,"code":3381,"language":68,"meta":69,"style":69},[34,12346,12347,12351,12355,12359,12363,12367,12371,12375,12379,12383],{"__ignoreMap":69},[73,12348,12349],{"class":75,"line":76},[73,12350,3388],{},[73,12352,12353],{"class":75,"line":152},[73,12354,956],{"emptyLinePlaceholder":166},[73,12356,12357],{"class":75,"line":420},[73,12358,3397],{},[73,12360,12361],{"class":75,"line":426},[73,12362,3402],{},[73,12364,12365],{"class":75,"line":618},[73,12366,3407],{},[73,12368,12369],{"class":75,"line":1156},[73,12370,3412],{},[73,12372,12373],{"class":75,"line":1162},[73,12374,3417],{},[73,12376,12377],{"class":75,"line":1168},[73,12378,3242],{},[73,12380,12381],{"class":75,"line":2630},[73,12382,956],{"emptyLinePlaceholder":166},[73,12384,12385],{"class":75,"line":2845},[73,12386,3430],{},[11,12388,81],{},[64,12390,12392],{"className":12391,"code":3436,"language":87,"meta":69},[85],[34,12393,3436],{"__ignoreMap":69},[11,12395,92],{},[15,12397,95],{"id":95},[97,12399,12400,12404],{},[45,12401,3447,12402,3450],{},[34,12403,3348],{},[45,12405,3453,12406,3456],{},[34,12407,3352],{},[15,12409,115],{"id":115},[42,12411,12412,12416],{},[45,12413,2144,12414,3465],{},[34,12415,3348],{},[45,12417,3468,12418,3471,12420,3474],{},[34,12419,3002],{},[34,12421,3348],{},[15,12423,129],{"id":129},[97,12425,12426,12428],{},[45,12427,3481],{},[45,12429,3484],{},[11,12431,140],{},[15,12433,143],{"id":143},[11,12435,3491],{},[148,12437,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12439},[12440,12441,12442,12443,12444,12445,12446,12447],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":3325,"description":3330},[162,3352,3348],{"id":3513,"title":3514,"body":12452,"category":162,"cover":163,"description":3519,"extension":164,"meta":12591,"navigation":166,"path":3691,"pinned":168,"publishedAt":169,"seo":12592,"slug":3693,"stem":3694,"summary":3695,"tags":12593,"updatedAt":169,"visible":166,"__hash__":3699},{"type":8,"value":12453,"toc":12579},[12454,12456,12458,12460,12462,12466,12468,12470,12486,12488,12490,12518,12520,12525,12527,12529,12541,12543,12545,12549,12551,12553,12563,12565,12571,12573,12575,12577],[11,12455,3519],{},[15,12457,17],{"id":17},[11,12459,3524],{},[15,12461,23],{"id":23},[11,12463,12464],{},[27,12465],{"alt":3531,"src":3532},[11,12467,3535],{},[15,12469,40],{"id":40},[42,12471,12472,12474,12476],{},[45,12473,3542],{},[45,12475,3545],{},[45,12477,3548,12478,928,12480,3555,12482,928,12484,383],{},[34,12479,3551],{},[34,12481,3554],{},[34,12483,3558],{},[34,12485,3561],{},[15,12487,59],{"id":59},[11,12489,62],{},[64,12491,12492],{"className":66,"code":3568,"language":68,"meta":69,"style":69},[34,12493,12494,12498,12502,12506,12510,12514],{"__ignoreMap":69},[73,12495,12496],{"class":75,"line":76},[73,12497,3575],{},[73,12499,12500],{"class":75,"line":152},[73,12501,956],{"emptyLinePlaceholder":166},[73,12503,12504],{"class":75,"line":420},[73,12505,3584],{},[73,12507,12508],{"class":75,"line":426},[73,12509,3589],{},[73,12511,12512],{"class":75,"line":618},[73,12513,3594],{},[73,12515,12516],{"class":75,"line":1156},[73,12517,3599],{},[11,12519,81],{},[64,12521,12523],{"className":12522,"code":3605,"language":87,"meta":69},[85],[34,12524,3605],{"__ignoreMap":69},[11,12526,92],{},[15,12528,95],{"id":95},[97,12530,12531,12539],{},[45,12532,3616,12533,3619,12535,666,12537,383],{},[34,12534,3551],{},[34,12536,3622],{},[34,12538,3625],{},[45,12540,3628],{},[1371,12542,1373],{"id":1373},[11,12544,3633],{},[11,12546,12547],{},[27,12548],{"alt":3638,"src":3639},[11,12550,3642],{},[15,12552,115],{"id":115},[42,12554,12555,12561],{},[45,12556,3649,12557,1471,12559,3655],{},[34,12558,3652],{},[34,12560,3558],{},[45,12562,3658],{},[15,12564,129],{"id":129},[97,12566,12567,12569],{},[45,12568,3665],{},[45,12570,3668],{},[11,12572,140],{},[15,12574,143],{"id":143},[11,12576,3675],{},[148,12578,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12580},[12581,12582,12583,12584,12585,12588,12589,12590],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":12586},[12587],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":3514,"description":3519},[162,3697,3698],{"id":3701,"title":3702,"body":12595,"category":162,"cover":163,"description":3707,"extension":164,"meta":12712,"navigation":166,"path":3846,"pinned":168,"publishedAt":169,"seo":12713,"slug":3848,"stem":3849,"summary":3850,"tags":12714,"updatedAt":169,"visible":166,"__hash__":3854},{"type":8,"value":12596,"toc":12702},[12597,12599,12601,12603,12605,12609,12611,12613,12621,12623,12625,12657,12659,12664,12666,12668,12676,12678,12686,12688,12694,12696,12698,12700],[11,12598,3707],{},[15,12600,17],{"id":17},[11,12602,3712],{},[15,12604,23],{"id":23},[11,12606,12607],{},[27,12608],{"alt":3719,"src":3720},[11,12610,3723],{},[15,12612,40],{"id":40},[42,12614,12615,12617,12619],{},[45,12616,3730],{},[45,12618,3733],{},[45,12620,3736],{},[15,12622,59],{"id":59},[11,12624,62],{},[64,12626,12627],{"className":66,"code":3743,"language":68,"meta":69,"style":69},[34,12628,12629,12633,12637,12641,12645,12649,12653],{"__ignoreMap":69},[73,12630,12631],{"class":75,"line":76},[73,12632,3750],{},[73,12634,12635],{"class":75,"line":152},[73,12636,956],{"emptyLinePlaceholder":166},[73,12638,12639],{"class":75,"line":420},[73,12640,3759],{},[73,12642,12643],{"class":75,"line":426},[73,12644,3764],{},[73,12646,12647],{"class":75,"line":618},[73,12648,956],{"emptyLinePlaceholder":166},[73,12650,12651],{"class":75,"line":1156},[73,12652,3773],{},[73,12654,12655],{"class":75,"line":1162},[73,12656,3778],{},[11,12658,81],{},[64,12660,12662],{"className":12661,"code":3784,"language":87,"meta":69},[85],[34,12663,3784],{"__ignoreMap":69},[11,12665,92],{},[15,12667,95],{"id":95},[97,12669,12670,12672],{},[45,12671,3795],{},[45,12673,3798,12674,3802],{},[34,12675,3801],{},[15,12677,115],{"id":115},[42,12679,12680,12684],{},[45,12681,3809,12682,3812],{},[34,12683,3019],{},[45,12685,3815],{},[15,12687,129],{"id":129},[97,12689,12690,12692],{},[45,12691,3822],{},[45,12693,3825],{},[11,12695,140],{},[15,12697,143],{"id":143},[11,12699,3832],{},[148,12701,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12703},[12704,12705,12706,12707,12708,12709,12710,12711],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":3702,"description":3707},[162,3852,3853],{"id":3856,"title":3857,"body":12716,"category":162,"cover":163,"description":3862,"extension":164,"meta":12835,"navigation":166,"path":4006,"pinned":168,"publishedAt":169,"seo":12836,"slug":4008,"stem":4009,"summary":4010,"tags":12837,"updatedAt":169,"visible":166,"__hash__":4014},{"type":8,"value":12717,"toc":12825},[12718,12720,12722,12724,12726,12730,12732,12734,12742,12744,12746,12778,12780,12785,12787,12789,12799,12801,12807,12809,12817,12819,12821,12823],[11,12719,3862],{},[15,12721,17],{"id":17},[11,12723,3867],{},[15,12725,23],{"id":23},[11,12727,12728],{},[27,12729],{"alt":3874,"src":3875},[11,12731,3878],{},[15,12733,40],{"id":40},[42,12735,12736,12738,12740],{},[45,12737,3885],{},[45,12739,3888],{},[45,12741,3891],{},[15,12743,59],{"id":59},[11,12745,62],{},[64,12747,12748],{"className":66,"code":3898,"language":68,"meta":69,"style":69},[34,12749,12750,12754,12758,12762,12766,12770,12774],{"__ignoreMap":69},[73,12751,12752],{"class":75,"line":76},[73,12753,3905],{},[73,12755,12756],{"class":75,"line":152},[73,12757,3910],{},[73,12759,12760],{"class":75,"line":420},[73,12761,3915],{},[73,12763,12764],{"class":75,"line":426},[73,12765,956],{"emptyLinePlaceholder":166},[73,12767,12768],{"class":75,"line":618},[73,12769,3924],{},[73,12771,12772],{"class":75,"line":1156},[73,12773,3929],{},[73,12775,12776],{"class":75,"line":1162},[73,12777,3934],{},[11,12779,81],{},[64,12781,12783],{"className":12782,"code":3940,"language":87,"meta":69},[85],[34,12784,3940],{"__ignoreMap":69},[11,12786,92],{},[15,12788,95],{"id":95},[97,12790,12791,12795],{},[45,12792,305,12793,3954],{},[34,12794,3953],{},[45,12796,3957,12797,3961],{},[34,12798,3960],{},[15,12800,115],{"id":115},[42,12802,12803,12805],{},[45,12804,3968],{},[45,12806,3971],{},[15,12808,129],{"id":129},[97,12810,12811,12815],{},[45,12812,3978,12813,3982],{},[34,12814,3981],{},[45,12816,3985],{},[11,12818,140],{},[15,12820,143],{"id":143},[11,12822,3992],{},[148,12824,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12826},[12827,12828,12829,12830,12831,12832,12833,12834],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":3857,"description":3862},[162,4012,4013],{"id":4016,"title":4017,"body":12839,"category":162,"cover":163,"description":4022,"extension":164,"meta":12984,"navigation":166,"path":4203,"pinned":168,"publishedAt":169,"seo":12985,"slug":4205,"stem":4206,"summary":4207,"tags":12986,"updatedAt":169,"visible":166,"__hash__":4211},{"type":8,"value":12840,"toc":12972},[12841,12843,12845,12847,12849,12853,12857,12859,12871,12873,12875,12903,12905,12910,12912,12914,12928,12930,12932,12936,12944,12946,12956,12958,12964,12966,12968,12970],[11,12842,4022],{},[15,12844,17],{"id":17},[11,12846,4027],{},[15,12848,23],{"id":23},[11,12850,12851],{},[27,12852],{"alt":4034,"src":4035},[11,12854,4038,12855,4042],{},[34,12856,4041],{},[15,12858,40],{"id":40},[42,12860,12861,12863,12865],{},[45,12862,4049],{},[45,12864,4052],{},[45,12866,4055,12867,4058,12869,383],{},[34,12868,4041],{},[34,12870,4061],{},[15,12872,59],{"id":59},[11,12874,62],{},[64,12876,12877],{"className":66,"code":4068,"language":68,"meta":69,"style":69},[34,12878,12879,12883,12887,12891,12895,12899],{"__ignoreMap":69},[73,12880,12881],{"class":75,"line":76},[73,12882,4075],{},[73,12884,12885],{"class":75,"line":152},[73,12886,4080],{},[73,12888,12889],{"class":75,"line":420},[73,12890,4085],{},[73,12892,12893],{"class":75,"line":426},[73,12894,956],{"emptyLinePlaceholder":166},[73,12896,12897],{"class":75,"line":618},[73,12898,4094],{},[73,12900,12901],{"class":75,"line":1156},[73,12902,4099],{},[11,12904,81],{},[64,12906,12908],{"className":12907,"code":4105,"language":87,"meta":69},[85],[34,12909,4105],{"__ignoreMap":69},[11,12911,92],{},[15,12913,95],{"id":95},[97,12915,12916,12922],{},[45,12917,4116,12918,928,12920,4122],{},[34,12919,4119],{},[34,12921,3082],{},[45,12923,12924,4128,12926,4132],{},[34,12925,4127],{},[34,12927,4131],{},[1371,12929,1373],{"id":1373},[11,12931,4137],{},[11,12933,12934],{},[27,12935],{"alt":4142,"src":4143},[11,12937,12938,928,12940,666,12942,4153],{},[34,12939,4119],{},[34,12941,3082],{},[34,12943,4152],{},[15,12945,115],{"id":115},[42,12947,12948,12952],{},[45,12949,4160,12950,4164],{},[34,12951,4163],{},[45,12953,4167,12954,4170],{},[34,12955,4152],{},[15,12957,129],{"id":129},[97,12959,12960,12962],{},[45,12961,4177],{},[45,12963,4180],{},[11,12965,140],{},[15,12967,143],{"id":143},[11,12969,4187],{},[148,12971,150],{},{"title":69,"searchDepth":152,"depth":152,"links":12973},[12974,12975,12976,12977,12978,12981,12982,12983],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":12979},[12980],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":4017,"description":4022},[162,4209,4210],{"id":4213,"title":4214,"body":12988,"category":162,"cover":163,"description":4219,"extension":164,"meta":13137,"navigation":166,"path":4400,"pinned":168,"publishedAt":169,"seo":13138,"slug":4402,"stem":4403,"summary":4404,"tags":13139,"updatedAt":169,"visible":166,"__hash__":4408},{"type":8,"value":12989,"toc":13125},[12990,12992,12994,12996,12998,13002,13004,13006,13018,13020,13022,13066,13068,13073,13075,13077,13089,13091,13093,13097,13099,13101,13109,13111,13117,13119,13121,13123],[11,12991,4219],{},[15,12993,17],{"id":17},[11,12995,4224],{},[15,12997,23],{"id":23},[11,12999,13000],{},[27,13001],{"alt":4231,"src":4232},[11,13003,4235],{},[15,13005,40],{"id":40},[42,13007,13008,13010,13014],{},[45,13009,4242],{},[45,13011,13012,4248],{},[34,13013,4247],{},[45,13015,13016,4254],{},[34,13017,4253],{},[15,13019,59],{"id":59},[11,13021,62],{},[64,13023,13024],{"className":66,"code":4261,"language":68,"meta":69,"style":69},[34,13025,13026,13030,13034,13038,13042,13046,13050,13054,13058,13062],{"__ignoreMap":69},[73,13027,13028],{"class":75,"line":76},[73,13029,4268],{},[73,13031,13032],{"class":75,"line":152},[73,13033,4273],{},[73,13035,13036],{"class":75,"line":420},[73,13037,956],{"emptyLinePlaceholder":166},[73,13039,13040],{"class":75,"line":426},[73,13041,4282],{},[73,13043,13044],{"class":75,"line":618},[73,13045,4287],{},[73,13047,13048],{"class":75,"line":1156},[73,13049,956],{"emptyLinePlaceholder":166},[73,13051,13052],{"class":75,"line":1162},[73,13053,4296],{},[73,13055,13056],{"class":75,"line":1168},[73,13057,4301],{},[73,13059,13060],{"class":75,"line":2630},[73,13061,956],{"emptyLinePlaceholder":166},[73,13063,13064],{"class":75,"line":2845},[73,13065,4310],{},[11,13067,81],{},[64,13069,13071],{"className":13070,"code":4316,"language":87,"meta":69},[85],[34,13072,4316],{"__ignoreMap":69},[11,13074,92],{},[15,13076,95],{"id":95},[97,13078,13079,13083],{},[45,13080,4327,13081,4331],{},[34,13082,4330],{},[45,13084,13085,4337,13087,383],{},[34,13086,4336],{},[34,13088,4340],{},[1371,13090,1373],{"id":1373},[11,13092,4345],{},[11,13094,13095],{},[27,13096],{"alt":4350,"src":4351},[11,13098,4354],{},[15,13100,115],{"id":115},[42,13102,13103,13107],{},[45,13104,4361,13105,4364],{},[34,13106,4061],{},[45,13108,4367],{},[15,13110,129],{"id":129},[97,13112,13113,13115],{},[45,13114,4374],{},[45,13116,4377],{},[11,13118,140],{},[15,13120,143],{"id":143},[11,13122,4384],{},[148,13124,150],{},{"title":69,"searchDepth":152,"depth":152,"links":13126},[13127,13128,13129,13130,13131,13134,13135,13136],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":13132},[13133],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":4214,"description":4219},[162,4406,4407],{"id":4410,"title":4411,"body":13141,"category":162,"cover":163,"description":4416,"extension":164,"meta":13302,"navigation":166,"path":4614,"pinned":168,"publishedAt":169,"seo":13303,"slug":4616,"stem":4617,"summary":4618,"tags":13304,"updatedAt":169,"visible":166,"__hash__":4622},{"type":8,"value":13142,"toc":13290},[13143,13145,13147,13149,13151,13155,13157,13159,13171,13173,13175,13227,13229,13234,13236,13238,13256,13258,13260,13264,13266,13268,13274,13276,13282,13284,13286,13288],[11,13144,4416],{},[15,13146,17],{"id":17},[11,13148,4421],{},[15,13150,23],{"id":23},[11,13152,13153],{},[27,13154],{"alt":4428,"src":4429},[11,13156,4432],{},[15,13158,40],{"id":40},[42,13160,13161,13163,13165],{},[45,13162,4439],{},[45,13164,4442],{},[45,13166,13167,847,13169,4451],{},[34,13168,4447],{},[34,13170,4450],{},[15,13172,59],{"id":59},[11,13174,62],{},[64,13176,13177],{"className":66,"code":4458,"language":68,"meta":69,"style":69},[34,13178,13179,13183,13187,13191,13195,13199,13203,13207,13211,13215,13219,13223],{"__ignoreMap":69},[73,13180,13181],{"class":75,"line":76},[73,13182,4465],{},[73,13184,13185],{"class":75,"line":152},[73,13186,956],{"emptyLinePlaceholder":166},[73,13188,13189],{"class":75,"line":420},[73,13190,4474],{},[73,13192,13193],{"class":75,"line":426},[73,13194,4479],{},[73,13196,13197],{"class":75,"line":618},[73,13198,956],{"emptyLinePlaceholder":166},[73,13200,13201],{"class":75,"line":1156},[73,13202,4488],{},[73,13204,13205],{"class":75,"line":1162},[73,13206,4493],{},[73,13208,13209],{"class":75,"line":1168},[73,13210,4498],{},[73,13212,13213],{"class":75,"line":2630},[73,13214,956],{"emptyLinePlaceholder":166},[73,13216,13217],{"class":75,"line":2845},[73,13218,4507],{},[73,13220,13221],{"class":75,"line":4510},[73,13222,956],{"emptyLinePlaceholder":166},[73,13224,13225],{"class":75,"line":4515},[73,13226,4518],{},[11,13228,81],{},[64,13230,13232],{"className":13231,"code":4524,"language":87,"meta":69},[85],[34,13233,4524],{"__ignoreMap":69},[11,13235,92],{},[15,13237,95],{"id":95},[97,13239,13240,13250],{},[45,13241,13242,4538,13244,4542,13246,4545,13248,4549],{},[34,13243,4537],{},[34,13245,4541],{},[34,13247,4330],{},[34,13249,4548],{},[45,13251,13252,4554,13254,4557],{},[34,13253,3265],{},[34,13255,879],{},[1371,13257,1373],{"id":1373},[11,13259,4562],{},[11,13261,13262],{},[27,13263],{"alt":4567,"src":4568},[11,13265,4571],{},[15,13267,115],{"id":115},[42,13269,13270,13272],{},[45,13271,4578],{},[45,13273,4581],{},[15,13275,129],{"id":129},[97,13277,13278,13280],{},[45,13279,4588],{},[45,13281,4591],{},[11,13283,140],{},[15,13285,143],{"id":143},[11,13287,4598],{},[148,13289,150],{},{"title":69,"searchDepth":152,"depth":152,"links":13291},[13292,13293,13294,13295,13296,13299,13300,13301],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":13297},[13298],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":4411,"description":4416},[162,4620,4621],{"id":4624,"title":4625,"body":13306,"category":162,"cover":163,"description":4630,"extension":164,"meta":13429,"navigation":166,"path":4781,"pinned":168,"publishedAt":169,"seo":13430,"slug":4783,"stem":4784,"summary":4785,"tags":13431,"updatedAt":169,"visible":166,"__hash__":4789},{"type":8,"value":13307,"toc":13419},[13308,13310,13312,13314,13316,13320,13322,13324,13338,13340,13342,13370,13372,13377,13379,13381,13391,13393,13401,13403,13411,13413,13415,13417],[11,13309,4630],{},[15,13311,17],{"id":17},[11,13313,4635],{},[15,13315,23],{"id":23},[11,13317,13318],{},[27,13319],{"alt":4642,"src":4643},[11,13321,4646],{},[15,13323,40],{"id":40},[42,13325,13326,13328,13330],{},[45,13327,4653],{},[45,13329,4656],{},[45,13331,4659,13332,928,13334,928,13336,4667],{},[34,13333,931],{},[34,13335,1098],{},[34,13337,4666],{},[15,13339,59],{"id":59},[11,13341,62],{},[64,13343,13344],{"className":66,"code":4674,"language":68,"meta":69,"style":69},[34,13345,13346,13350,13354,13358,13362,13366],{"__ignoreMap":69},[73,13347,13348],{"class":75,"line":76},[73,13349,4681],{},[73,13351,13352],{"class":75,"line":152},[73,13353,4686],{},[73,13355,13356],{"class":75,"line":420},[73,13357,4691],{},[73,13359,13360],{"class":75,"line":426},[73,13361,956],{"emptyLinePlaceholder":166},[73,13363,13364],{"class":75,"line":618},[73,13365,4700],{},[73,13367,13368],{"class":75,"line":1156},[73,13369,4705],{},[11,13371,81],{},[64,13373,13375],{"className":13374,"code":4711,"language":87,"meta":69},[85],[34,13376,4711],{"__ignoreMap":69},[11,13378,92],{},[15,13380,95],{"id":95},[97,13382,13383,13389],{},[45,13384,4722,13385,4726,13387,4729],{},[34,13386,4725],{},[34,13388,917],{},[45,13390,4732],{},[15,13392,115],{"id":115},[42,13394,13395,13399],{},[45,13396,4739,13397,4743],{},[34,13398,4742],{},[45,13400,4746],{},[15,13402,129],{"id":129},[97,13404,13405,13407],{},[45,13406,4753],{},[45,13408,4756,13409,4760],{},[34,13410,4759],{},[11,13412,140],{},[15,13414,143],{"id":143},[11,13416,4767],{},[148,13418,150],{},{"title":69,"searchDepth":152,"depth":152,"links":13420},[13421,13422,13423,13424,13425,13426,13427,13428],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":4625,"description":4630},[162,4787,4788],{"id":4791,"title":4792,"body":13433,"category":162,"cover":163,"description":4797,"extension":164,"meta":13610,"navigation":166,"path":5026,"pinned":168,"publishedAt":169,"seo":13611,"slug":5028,"stem":5029,"summary":5030,"tags":13612,"updatedAt":169,"visible":166,"__hash__":5034},{"type":8,"value":13434,"toc":13598},[13435,13437,13439,13443,13445,13449,13455,13457,13469,13471,13475,13499,13503,13519,13525,13527,13532,13534,13536,13552,13554,13556,13560,13564,13566,13578,13580,13590,13592,13594,13596],[11,13436,4797],{},[15,13438,17],{"id":17},[11,13440,4802,13441,4806],{},[4804,13442,4725],{},[15,13444,23],{"id":23},[11,13446,13447],{},[27,13448],{"alt":4813,"src":4814},[11,13450,4817,13451,4821,13453,4825],{},[34,13452,4820],{},[34,13454,4824],{},[15,13456,40],{"id":40},[42,13458,13459,13463,13465],{},[45,13460,4832,13461,4835],{},[34,13462,36],{},[45,13464,4838],{},[45,13466,4841,13467,4845],{},[34,13468,4844],{},[15,13470,59],{"id":59},[11,13472,4850,13473,4854],{},[34,13474,4853],{},[64,13476,13477],{"className":66,"code":4857,"language":68,"meta":69,"style":69},[34,13478,13479,13483,13487,13491,13495],{"__ignoreMap":69},[73,13480,13481],{"class":75,"line":76},[73,13482,4864],{},[73,13484,13485],{"class":75,"line":152},[73,13486,4869],{},[73,13488,13489],{"class":75,"line":420},[73,13490,956],{"emptyLinePlaceholder":166},[73,13492,13493],{"class":75,"line":426},[73,13494,4878],{},[73,13496,13497],{"class":75,"line":618},[73,13498,4883],{},[11,13500,4886,13501,4890],{},[34,13502,4889],{},[64,13504,13505],{"className":66,"code":4893,"language":68,"meta":69,"style":69},[34,13506,13507,13511,13515],{"__ignoreMap":69},[73,13508,13509],{"class":75,"line":76},[73,13510,4900],{},[73,13512,13513],{"class":75,"line":152},[73,13514,956],{"emptyLinePlaceholder":166},[73,13516,13517],{"class":75,"line":420},[73,13518,4909],{},[11,13520,4912,13521,666,13523,383],{},[34,13522,4915],{},[34,13524,4918],{},[11,13526,81],{},[64,13528,13530],{"className":13529,"code":4924,"language":87,"meta":69},[85],[34,13531,4924],{"__ignoreMap":69},[11,13533,92],{},[15,13535,95],{"id":95},[97,13537,13538,13544],{},[45,13539,4935,13540,4938,13542,4942],{},[34,13541,4853],{},[34,13543,4941],{},[45,13545,13546,4947,13548,4950,13550,4953],{},[34,13547,4889],{},[34,13549,4853],{},[34,13551,4889],{},[1371,13553,1373],{"id":1373},[11,13555,4958],{},[11,13557,13558],{},[27,13559],{"alt":4963,"src":4964},[11,13561,4967,13562,4970],{},[34,13563,4941],{},[15,13565,115],{"id":115},[42,13567,13568,13574],{},[45,13569,4977,13570,666,13572,383],{},[34,13571,4853],{},[34,13573,4889],{},[45,13575,4984,13576,4988],{},[34,13577,4987],{},[15,13579,129],{"id":129},[97,13581,13582,13586],{},[45,13583,1026,13584,4998],{},[34,13585,4997],{},[45,13587,5001,13588,383],{},[34,13589,4820],{},[11,13591,140],{},[15,13593,143],{"id":143},[11,13595,5010],{},[148,13597,150],{},{"title":69,"searchDepth":152,"depth":152,"links":13599},[13600,13601,13602,13603,13604,13607,13608,13609],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":13605},[13606],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":4792,"description":4797},[162,5032,5033],{"id":5036,"title":5037,"body":13614,"category":162,"cover":163,"description":5042,"extension":164,"meta":13753,"navigation":166,"path":5208,"pinned":168,"publishedAt":169,"seo":13754,"slug":5210,"stem":5211,"summary":5212,"tags":13755,"updatedAt":169,"visible":166,"__hash__":5216},{"type":8,"value":13615,"toc":13743},[13616,13618,13620,13622,13624,13628,13630,13632,13642,13644,13646,13686,13688,13693,13695,13697,13715,13717,13725,13727,13735,13737,13739,13741],[11,13617,5042],{},[15,13619,17],{"id":17},[11,13621,5047],{},[15,13623,23],{"id":23},[11,13625,13626],{},[27,13627],{"alt":5054,"src":5055},[11,13629,5058],{},[15,13631,40],{"id":40},[42,13633,13634,13638,13640],{},[45,13635,13636,5068],{},[34,13637,5067],{},[45,13639,5071],{},[45,13641,5074],{},[15,13643,59],{"id":59},[11,13645,227],{},[64,13647,13648],{"className":230,"code":5081,"language":232,"meta":69,"style":69},[34,13649,13650,13660,13666,13672,13682],{"__ignoreMap":69},[73,13651,13652,13654,13656,13658],{"class":75,"line":76},[73,13653,204],{"class":239},[73,13655,250],{"class":242},[73,13657,5092],{"class":253},[73,13659,5095],{"class":253},[73,13661,13662,13664],{"class":75,"line":152},[73,13663,5100],{"class":242},[73,13665,5103],{"class":253},[73,13667,13668,13670],{"class":75,"line":420},[73,13669,68],{"class":239},[73,13671,243],{"class":242},[73,13673,13674,13676,13678,13680],{"class":75,"line":426},[73,13675,68],{"class":239},[73,13677,250],{"class":242},[73,13679,254],{"class":253},[73,13681,243],{"class":242},[73,13683,13684],{"class":75,"line":618},[73,13685,5124],{"class":239},[11,13687,81],{},[64,13689,13691],{"className":13690,"code":5130,"language":87,"meta":69},[85],[34,13692,5130],{"__ignoreMap":69},[11,13694,92],{},[15,13696,95],{"id":95},[97,13698,13699,13705],{},[45,13700,13701,5144,13703,5147],{},[34,13702,5143],{},[34,13704,204],{},[45,13706,5150,13707,847,13709,5156,13711,2405,13713,5162],{},[34,13708,68],{},[34,13710,5155],{},[34,13712,5067],{},[34,13714,5161],{},[15,13716,115],{"id":115},[42,13718,13719,13721],{},[45,13720,5169],{},[45,13722,2144,13723,5174],{},[34,13724,5067],{},[15,13726,129],{"id":129},[97,13728,13729,13733],{},[45,13730,5181,13731,383],{},[34,13732,5184],{},[45,13734,5187],{},[11,13736,140],{},[15,13738,143],{"id":143},[11,13740,5194],{},[148,13742,322],{},{"title":69,"searchDepth":152,"depth":152,"links":13744},[13745,13746,13747,13748,13749,13750,13751,13752],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":5037,"description":5042},[162,5214,5215],{"id":5218,"title":5219,"body":13757,"category":162,"cover":163,"description":5224,"extension":164,"meta":13910,"navigation":166,"path":5413,"pinned":168,"publishedAt":169,"seo":13911,"slug":5415,"stem":5416,"summary":5417,"tags":13912,"updatedAt":169,"visible":166,"__hash__":5421},{"type":8,"value":13758,"toc":13900},[13759,13761,13763,13765,13767,13771,13777,13779,13795,13797,13799,13843,13845,13850,13852,13854,13866,13868,13882,13884,13892,13894,13896,13898],[11,13760,5224],{},[15,13762,17],{"id":17},[11,13764,5229],{},[15,13766,23],{"id":23},[11,13768,13769],{},[27,13770],{"alt":5236,"src":5237},[11,13772,13773,5243,13775,5246],{},[34,13774,5242],{},[34,13776,1108],{},[15,13778,40],{"id":40},[42,13780,13781,13783,13791],{},[45,13782,5253],{},[45,13784,13785,928,13787,928,13789,5265],{},[34,13786,5258],{},[34,13788,5261],{},[34,13790,5264],{},[45,13792,5268,13793,5272],{},[34,13794,5271],{},[15,13796,59],{"id":59},[11,13798,62],{},[64,13800,13801],{"className":66,"code":5279,"language":68,"meta":69,"style":69},[34,13802,13803,13807,13811,13815,13819,13823,13827,13831,13835,13839],{"__ignoreMap":69},[73,13804,13805],{"class":75,"line":76},[73,13806,5286],{},[73,13808,13809],{"class":75,"line":152},[73,13810,956],{"emptyLinePlaceholder":166},[73,13812,13813],{"class":75,"line":420},[73,13814,5295],{},[73,13816,13817],{"class":75,"line":426},[73,13818,5300],{},[73,13820,13821],{"class":75,"line":618},[73,13822,5305],{},[73,13824,13825],{"class":75,"line":1156},[73,13826,956],{"emptyLinePlaceholder":166},[73,13828,13829],{"class":75,"line":1162},[73,13830,5314],{},[73,13832,13833],{"class":75,"line":1168},[73,13834,5319],{},[73,13836,13837],{"class":75,"line":2630},[73,13838,5324],{},[73,13840,13841],{"class":75,"line":2845},[73,13842,5329],{},[11,13844,81],{},[64,13846,13848],{"className":13847,"code":5335,"language":87,"meta":69},[85],[34,13849,5335],{"__ignoreMap":69},[11,13851,92],{},[15,13853,95],{"id":95},[97,13855,13856,13860],{},[45,13857,13858,5349],{},[34,13859,5348],{},[45,13861,1011,13862,5354,13864,5357],{},[34,13863,1108],{},[34,13865,5242],{},[15,13867,115],{"id":115},[42,13869,13870,13876],{},[45,13871,2144,13872,5366,13874,5369],{},[34,13873,5242],{},[34,13875,5258],{},[45,13877,5372,13878,1471,13880,5378],{},[34,13879,1108],{},[34,13881,5377],{},[15,13883,129],{"id":129},[97,13885,13886,13890],{},[45,13887,5385,13888,5389],{},[34,13889,5388],{},[45,13891,5392],{},[11,13893,140],{},[15,13895,143],{"id":143},[11,13897,5399],{},[148,13899,150],{},{"title":69,"searchDepth":152,"depth":152,"links":13901},[13902,13903,13904,13905,13906,13907,13908,13909],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":5219,"description":5224},[162,5419,5420],{"id":5423,"title":5424,"body":13914,"category":162,"cover":163,"description":5429,"extension":164,"meta":14061,"navigation":166,"path":5609,"pinned":168,"publishedAt":169,"seo":14062,"slug":5611,"stem":5612,"summary":5613,"tags":14063,"updatedAt":169,"visible":166,"__hash__":5617},{"type":8,"value":13915,"toc":14051},[13916,13918,13920,13922,13924,13928,13930,13932,13950,13952,13954,14002,14004,14009,14011,14013,14021,14023,14033,14035,14043,14045,14047,14049],[11,13917,5429],{},[15,13919,17],{"id":17},[11,13921,5434],{},[15,13923,23],{"id":23},[11,13925,13926],{},[27,13927],{"alt":5441,"src":5442},[11,13929,5445],{},[15,13931,40],{"id":40},[42,13933,13934,13938,13944],{},[45,13935,13936,5455],{},[34,13937,5454],{},[45,13939,13940,5461,13942,383],{},[34,13941,5460],{},[34,13943,5464],{},[45,13945,5467,13946,5471,13948,5475],{},[34,13947,5470],{},[34,13949,5474],{},[15,13951,59],{"id":59},[11,13953,62],{},[64,13955,13956],{"className":66,"code":5482,"language":68,"meta":69,"style":69},[34,13957,13958,13962,13966,13970,13974,13978,13982,13986,13990,13994,13998],{"__ignoreMap":69},[73,13959,13960],{"class":75,"line":76},[73,13961,5286],{},[73,13963,13964],{"class":75,"line":152},[73,13965,956],{"emptyLinePlaceholder":166},[73,13967,13968],{"class":75,"line":420},[73,13969,5497],{},[73,13971,13972],{"class":75,"line":426},[73,13973,5502],{},[73,13975,13976],{"class":75,"line":618},[73,13977,5507],{},[73,13979,13980],{"class":75,"line":1156},[73,13981,5512],{},[73,13983,13984],{"class":75,"line":1162},[73,13985,956],{"emptyLinePlaceholder":166},[73,13987,13988],{"class":75,"line":1168},[73,13989,5521],{},[73,13991,13992],{"class":75,"line":2630},[73,13993,5526],{},[73,13995,13996],{"class":75,"line":2845},[73,13997,5531],{},[73,13999,14000],{"class":75,"line":4510},[73,14001,5536],{},[11,14003,81],{},[64,14005,14007],{"className":14006,"code":5542,"language":87,"meta":69},[85],[34,14008,5542],{"__ignoreMap":69},[11,14010,92],{},[15,14012,95],{"id":95},[97,14014,14015,14019],{},[45,14016,5553,14017,5556],{},[34,14018,5470],{},[45,14020,5559],{},[15,14022,115],{"id":115},[42,14024,14025,14029],{},[45,14026,1011,14027,5568],{},[34,14028,5454],{},[45,14030,5571,14031,383],{},[34,14032,5574],{},[15,14034,129],{"id":129},[97,14036,14037,14039],{},[45,14038,5581],{},[45,14040,5584,14041,5588],{},[34,14042,5587],{},[11,14044,140],{},[15,14046,143],{"id":143},[11,14048,5595],{},[148,14050,150],{},{"title":69,"searchDepth":152,"depth":152,"links":14052},[14053,14054,14055,14056,14057,14058,14059,14060],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":5424,"description":5429},[162,5615,5616],{"id":5619,"title":5620,"body":14065,"category":162,"cover":163,"description":5625,"extension":164,"meta":14208,"navigation":166,"path":5793,"pinned":168,"publishedAt":169,"seo":14209,"slug":5795,"stem":5796,"summary":5797,"tags":14210,"updatedAt":169,"visible":166,"__hash__":5801},{"type":8,"value":14066,"toc":14198},[14067,14069,14071,14073,14075,14079,14085,14087,14097,14099,14101,14153,14155,14160,14162,14164,14174,14176,14182,14184,14190,14192,14194,14196],[11,14068,5625],{},[15,14070,17],{"id":17},[11,14072,5630],{},[15,14074,23],{"id":23},[11,14076,14077],{},[27,14078],{"alt":5637,"src":5638},[11,14080,14081,5644,14083,5648],{},[34,14082,5643],{},[34,14084,5647],{},[15,14086,40],{"id":40},[42,14088,14089,14091,14095],{},[45,14090,5655],{},[45,14092,14093,5661],{},[34,14094,5660],{},[45,14096,5664],{},[15,14098,59],{"id":59},[11,14100,62],{},[64,14102,14103],{"className":66,"code":5671,"language":68,"meta":69,"style":69},[34,14104,14105,14109,14113,14117,14121,14125,14129,14133,14137,14141,14145,14149],{"__ignoreMap":69},[73,14106,14107],{"class":75,"line":76},[73,14108,5678],{},[73,14110,14111],{"class":75,"line":152},[73,14112,956],{"emptyLinePlaceholder":166},[73,14114,14115],{"class":75,"line":420},[73,14116,5687],{},[73,14118,14119],{"class":75,"line":426},[73,14120,956],{"emptyLinePlaceholder":166},[73,14122,14123],{"class":75,"line":618},[73,14124,5696],{},[73,14126,14127],{"class":75,"line":1156},[73,14128,5701],{},[73,14130,14131],{"class":75,"line":1162},[73,14132,5512],{},[73,14134,14135],{"class":75,"line":1168},[73,14136,956],{"emptyLinePlaceholder":166},[73,14138,14139],{"class":75,"line":2630},[73,14140,5714],{},[73,14142,14143],{"class":75,"line":2845},[73,14144,5719],{},[73,14146,14147],{"class":75,"line":4510},[73,14148,5531],{},[73,14150,14151],{"class":75,"line":4515},[73,14152,5728],{},[11,14154,81],{},[64,14156,14158],{"className":14157,"code":5734,"language":87,"meta":69},[85],[34,14159,5734],{"__ignoreMap":69},[11,14161,92],{},[15,14163,95],{"id":95},[97,14165,14166,14170],{},[45,14167,14168,5747],{},[34,14169,5643],{},[45,14171,14172,5752],{},[34,14173,5647],{},[15,14175,115],{"id":115},[42,14177,14178,14180],{},[45,14179,5759],{},[45,14181,5762],{},[15,14183,129],{"id":129},[97,14185,14186,14188],{},[45,14187,5769],{},[45,14189,5772],{},[11,14191,140],{},[15,14193,143],{"id":143},[11,14195,5779],{},[148,14197,150],{},{"title":69,"searchDepth":152,"depth":152,"links":14199},[14200,14201,14202,14203,14204,14205,14206,14207],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":5620,"description":5625},[162,5799,5800],{"id":5803,"title":5804,"body":14212,"category":162,"cover":163,"description":5809,"extension":164,"meta":14363,"navigation":166,"path":5994,"pinned":168,"publishedAt":169,"seo":14364,"slug":5996,"stem":5997,"summary":5998,"tags":14365,"updatedAt":169,"visible":166,"__hash__":6002},{"type":8,"value":14213,"toc":14353},[14214,14216,14218,14220,14222,14226,14230,14232,14246,14248,14250,14302,14304,14309,14311,14313,14325,14327,14337,14339,14345,14347,14349,14351],[11,14215,5809],{},[15,14217,17],{"id":17},[11,14219,5814],{},[15,14221,23],{"id":23},[11,14223,14224],{},[27,14225],{"alt":5821,"src":5822},[11,14227,14228,5828],{},[34,14229,5827],{},[15,14231,40],{"id":40},[42,14233,14234,14240,14244],{},[45,14235,1011,14236,5838,14238,5842],{},[34,14237,5837],{},[34,14239,5841],{},[45,14241,5845,14242,5849],{},[34,14243,5848],{},[45,14245,5852],{},[15,14247,59],{"id":59},[11,14249,62],{},[64,14251,14252],{"className":66,"code":5859,"language":68,"meta":69,"style":69},[34,14253,14254,14258,14262,14266,14270,14274,14278,14282,14286,14290,14294,14298],{"__ignoreMap":69},[73,14255,14256],{"class":75,"line":76},[73,14257,5866],{},[73,14259,14260],{"class":75,"line":152},[73,14261,956],{"emptyLinePlaceholder":166},[73,14263,14264],{"class":75,"line":420},[73,14265,5875],{},[73,14267,14268],{"class":75,"line":426},[73,14269,5880],{},[73,14271,14272],{"class":75,"line":618},[73,14273,5885],{},[73,14275,14276],{"class":75,"line":1156},[73,14277,5890],{},[73,14279,14280],{"class":75,"line":1162},[73,14281,5895],{},[73,14283,14284],{"class":75,"line":1168},[73,14285,956],{"emptyLinePlaceholder":166},[73,14287,14288],{"class":75,"line":2630},[73,14289,5904],{},[73,14291,14292],{"class":75,"line":2845},[73,14293,5909],{},[73,14295,14296],{"class":75,"line":4510},[73,14297,5914],{},[73,14299,14300],{"class":75,"line":4515},[73,14301,5919],{},[11,14303,81],{},[64,14305,14307],{"className":14306,"code":5925,"language":87,"meta":69},[85],[34,14308,5925],{"__ignoreMap":69},[11,14310,92],{},[15,14312,95],{"id":95},[97,14314,14315,14321],{},[45,14316,14317,5939,14319,5942],{},[34,14318,5938],{},[34,14320,5848],{},[45,14322,14323,5947],{},[34,14324,5827],{},[15,14326,115],{"id":115},[42,14328,14329,14331],{},[45,14330,5954],{},[45,14332,5957,14333,5960,14335,5963],{},[34,14334,5837],{},[34,14336,5841],{},[15,14338,129],{"id":129},[97,14340,14341,14343],{},[45,14342,5970],{},[45,14344,5973],{},[11,14346,140],{},[15,14348,143],{"id":143},[11,14350,5980],{},[148,14352,150],{},{"title":69,"searchDepth":152,"depth":152,"links":14354},[14355,14356,14357,14358,14359,14360,14361,14362],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":5804,"description":5809},[162,6000,6001],{"id":6004,"title":6005,"body":14367,"category":162,"cover":163,"description":6010,"extension":164,"meta":14581,"navigation":166,"path":6284,"pinned":168,"publishedAt":169,"seo":14582,"slug":6286,"stem":6287,"summary":6288,"tags":14583,"updatedAt":169,"visible":166,"__hash__":6292},{"type":8,"value":14368,"toc":14568},[14369,14371,14373,14375,14377,14381,14387,14389,14401,14403,14405,14465,14467,14472,14474,14476,14494,14496,14504,14508,14516,14518,14522,14526,14532,14534,14544,14546,14560,14562,14564,14566],[11,14370,6010],{},[15,14372,17],{"id":17},[11,14374,6015],{},[15,14376,23],{"id":23},[11,14378,14379],{},[27,14380],{"alt":6022,"src":6023},[11,14382,6026,14383,6030,14385,6034],{},[34,14384,6029],{},[34,14386,6033],{},[15,14388,40],{"id":40},[42,14390,14391,14395,14399],{},[45,14392,6041,14393,6044],{},[34,14394,6029],{},[45,14396,14397,6050],{},[34,14398,6049],{},[45,14400,6053],{},[15,14402,59],{"id":59},[11,14404,62],{},[64,14406,14407],{"className":66,"code":6060,"language":68,"meta":69,"style":69},[34,14408,14409,14413,14417,14421,14425,14429,14433,14437,14441,14445,14449,14453,14457,14461],{"__ignoreMap":69},[73,14410,14411],{"class":75,"line":76},[73,14412,6067],{},[73,14414,14415],{"class":75,"line":152},[73,14416,6072],{},[73,14418,14419],{"class":75,"line":420},[73,14420,6077],{},[73,14422,14423],{"class":75,"line":426},[73,14424,6082],{},[73,14426,14427],{"class":75,"line":618},[73,14428,6087],{},[73,14430,14431],{"class":75,"line":1156},[73,14432,956],{"emptyLinePlaceholder":166},[73,14434,14435],{"class":75,"line":1162},[73,14436,6096],{},[73,14438,14439],{"class":75,"line":1168},[73,14440,6101],{},[73,14442,14443],{"class":75,"line":2630},[73,14444,6106],{},[73,14446,14447],{"class":75,"line":2845},[73,14448,6111],{},[73,14450,14451],{"class":75,"line":4510},[73,14452,2833],{},[73,14454,14455],{"class":75,"line":4515},[73,14456,6120],{},[73,14458,14459],{"class":75,"line":6123},[73,14460,6126],{},[73,14462,14463],{"class":75,"line":6129},[73,14464,6132],{},[11,14466,81],{},[64,14468,14470],{"className":14469,"code":6138,"language":87,"meta":69},[85],[34,14471,6138],{"__ignoreMap":69},[11,14473,92],{},[15,14475,95],{"id":95},[97,14477,14478,14486],{},[45,14479,14480,6151,14482,6154,14484,6158],{},[34,14481,1713],{},[34,14483,6049],{},[34,14485,6157],{},[45,14487,6161,14488,6164,14490,6167,14492,383],{},[34,14489,6029],{},[34,14491,2776],{},[34,14493,6033],{},[1371,14495,1373],{"id":1373},[11,14497,14498,928,14500,666,14502,6180],{},[34,14499,6029],{},[34,14501,2776],{},[34,14503,6033],{},[11,14505,14506],{},[27,14507],{"alt":6185,"src":6186},[11,14509,14510,6191,14512,6194,14514,6197],{},[34,14511,6029],{},[34,14513,2776],{},[34,14515,6033],{},[1371,14517,1373],{"id":2900},[11,14519,14520,6205],{},[34,14521,6204],{},[11,14523,14524],{},[27,14525],{"alt":6210,"src":6211},[11,14527,6214,14528,6217,14530,6220],{},[34,14529,6204],{},[34,14531,2776],{},[15,14533,115],{"id":115},[42,14535,14536,14540],{},[45,14537,6227,14538,6231],{},[34,14539,6230],{},[45,14541,6234,14542,6237],{},[34,14543,6204],{},[15,14545,129],{"id":129},[97,14547,14548,14556],{},[45,14549,6244,14550,6248,14552,666,14554,383],{},[34,14551,6247],{},[34,14553,6251],{},[34,14555,6254],{},[45,14557,6257,14558,6260],{},[34,14559,5464],{},[11,14561,140],{},[15,14563,143],{"id":143},[11,14565,6267],{},[148,14567,150],{},{"title":69,"searchDepth":152,"depth":152,"links":14569},[14570,14571,14572,14573,14574,14578,14579,14580],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":14575},[14576,14577],{"id":1373,"depth":420,"text":1373},{"id":2900,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":6005,"description":6010},[162,6290,6291],{"id":6294,"title":6295,"body":14585,"category":162,"cover":163,"description":6300,"extension":164,"meta":14736,"navigation":166,"path":6477,"pinned":168,"publishedAt":169,"seo":14737,"slug":6479,"stem":6480,"summary":6481,"tags":14738,"updatedAt":169,"visible":166,"__hash__":6484},{"type":8,"value":14586,"toc":14726},[14587,14589,14591,14593,14595,14599,14603,14605,14617,14619,14621,14669,14671,14676,14678,14680,14690,14692,14702,14704,14718,14720,14722,14724],[11,14588,6300],{},[15,14590,17],{"id":17},[11,14592,6305],{},[15,14594,23],{"id":23},[11,14596,14597],{},[27,14598],{"alt":6312,"src":6313},[11,14600,6316,14601,6319],{},[34,14602,5474],{},[15,14604,40],{"id":40},[42,14606,14607,14611,14615],{},[45,14608,14609,6328],{},[34,14610,5474],{},[45,14612,14613,6334],{},[34,14614,6333],{},[45,14616,6337],{},[15,14618,59],{"id":59},[11,14620,62],{},[64,14622,14623],{"className":66,"code":6344,"language":68,"meta":69,"style":69},[34,14624,14625,14629,14633,14637,14641,14645,14649,14653,14657,14661,14665],{"__ignoreMap":69},[73,14626,14627],{"class":75,"line":76},[73,14628,5286],{},[73,14630,14631],{"class":75,"line":152},[73,14632,956],{"emptyLinePlaceholder":166},[73,14634,14635],{"class":75,"line":420},[73,14636,5497],{},[73,14638,14639],{"class":75,"line":426},[73,14640,956],{"emptyLinePlaceholder":166},[73,14642,14643],{"class":75,"line":618},[73,14644,6367],{},[73,14646,14647],{"class":75,"line":1156},[73,14648,6372],{},[73,14650,14651],{"class":75,"line":1162},[73,14652,956],{"emptyLinePlaceholder":166},[73,14654,14655],{"class":75,"line":1168},[73,14656,6381],{},[73,14658,14659],{"class":75,"line":2630},[73,14660,6386],{},[73,14662,14663],{"class":75,"line":2845},[73,14664,956],{"emptyLinePlaceholder":166},[73,14666,14667],{"class":75,"line":4510},[73,14668,6395],{},[11,14670,81],{},[64,14672,14674],{"className":14673,"code":6401,"language":87,"meta":69},[85],[34,14675,6401],{"__ignoreMap":69},[11,14677,92],{},[15,14679,95],{"id":95},[97,14681,14682,14688],{},[45,14683,6316,14684,6414,14686,383],{},[34,14685,5474],{},[34,14687,6417],{},[45,14689,6420],{},[15,14691,115],{"id":115},[42,14693,14694,14698],{},[45,14695,3468,14696,6429],{},[34,14697,5474],{},[45,14699,6432,14700,6435],{},[34,14701,5474],{},[15,14703,129],{"id":129},[97,14705,14706,14712],{},[45,14707,6442,14708,6446,14710,383],{},[34,14709,6445],{},[34,14711,5474],{},[45,14713,3468,14714,6453,14716,383],{},[34,14715,5474],{},[34,14717,6456],{},[11,14719,140],{},[15,14721,143],{"id":143},[11,14723,6463],{},[148,14725,150],{},{"title":69,"searchDepth":152,"depth":152,"links":14727},[14728,14729,14730,14731,14732,14733,14734,14735],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":6295,"description":6300},[162,5474,6483],{"id":6486,"title":6487,"body":14740,"category":162,"cover":163,"description":6492,"extension":164,"meta":14911,"navigation":166,"path":6705,"pinned":168,"publishedAt":169,"seo":14912,"slug":6707,"stem":6708,"summary":6709,"tags":14913,"updatedAt":169,"visible":166,"__hash__":6713},{"type":8,"value":14741,"toc":14899},[14742,14744,14746,14748,14750,14754,14756,14758,14770,14772,14774,14830,14832,14837,14839,14841,14857,14859,14861,14865,14871,14873,14881,14883,14891,14893,14895,14897],[11,14743,6492],{},[15,14745,17],{"id":17},[11,14747,6497],{},[15,14749,23],{"id":23},[11,14751,14752],{},[27,14753],{"alt":6504,"src":6505},[11,14755,6508],{},[15,14757,40],{"id":40},[42,14759,14760,14764,14768],{},[45,14761,14762,6518],{},[34,14763,6517],{},[45,14765,14766,6524],{},[34,14767,6523],{},[45,14769,6527],{},[15,14771,59],{"id":59},[11,14773,62],{},[64,14775,14776],{"className":66,"code":6534,"language":68,"meta":69,"style":69},[34,14777,14778,14782,14786,14790,14794,14798,14802,14806,14810,14814,14818,14822,14826],{"__ignoreMap":69},[73,14779,14780],{"class":75,"line":76},[73,14781,6541],{},[73,14783,14784],{"class":75,"line":152},[73,14785,6546],{},[73,14787,14788],{"class":75,"line":420},[73,14789,6551],{},[73,14791,14792],{"class":75,"line":426},[73,14793,6556],{},[73,14795,14796],{"class":75,"line":618},[73,14797,956],{"emptyLinePlaceholder":166},[73,14799,14800],{"class":75,"line":1156},[73,14801,6565],{},[73,14803,14804],{"class":75,"line":1162},[73,14805,6570],{},[73,14807,14808],{"class":75,"line":1168},[73,14809,6575],{},[73,14811,14812],{"class":75,"line":2630},[73,14813,6580],{},[73,14815,14816],{"class":75,"line":2845},[73,14817,956],{"emptyLinePlaceholder":166},[73,14819,14820],{"class":75,"line":4510},[73,14821,6589],{},[73,14823,14824],{"class":75,"line":4515},[73,14825,6594],{},[73,14827,14828],{"class":75,"line":6123},[73,14829,6599],{},[11,14831,81],{},[64,14833,14835],{"className":14834,"code":6605,"language":87,"meta":69},[85],[34,14836,6605],{"__ignoreMap":69},[11,14838,92],{},[15,14840,95],{"id":95},[97,14842,14843,14849],{},[45,14844,6616,14845,6620,14847,6623],{},[34,14846,6619],{},[34,14848,6523],{},[45,14850,14851,6629,14853,6633,14855,6636],{},[34,14852,6628],{},[34,14854,6632],{},[34,14856,6517],{},[1371,14858,1373],{"id":1373},[11,14860,6641],{},[11,14862,14863],{},[27,14864],{"alt":6646,"src":6647},[11,14866,6650,14867,666,14869,6656],{},[34,14868,3265],{},[34,14870,6655],{},[15,14872,115],{"id":115},[42,14874,14875,14879],{},[45,14876,6663,14877,6666],{},[34,14878,6517],{},[45,14880,6669],{},[15,14882,129],{"id":129},[97,14884,14885,14889],{},[45,14886,3978,14887,6679],{},[34,14888,6678],{},[45,14890,6682],{},[11,14892,140],{},[15,14894,143],{"id":143},[11,14896,6689],{},[148,14898,150],{},{"title":69,"searchDepth":152,"depth":152,"links":14900},[14901,14902,14903,14904,14905,14908,14909,14910],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":14906},[14907],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":6487,"description":6492},[162,6711,6712],{"id":6715,"title":6716,"body":14915,"category":162,"cover":163,"description":6721,"extension":164,"meta":15062,"navigation":166,"path":6900,"pinned":168,"publishedAt":169,"seo":15063,"slug":6902,"stem":6903,"summary":6904,"tags":15064,"updatedAt":169,"visible":166,"__hash__":6908},{"type":8,"value":14916,"toc":15052},[14917,14919,14921,14923,14925,14929,14931,14933,14941,14943,14945,15001,15003,15008,15010,15012,15024,15026,15032,15034,15044,15046,15048,15050],[11,14918,6721],{},[15,14920,17],{"id":17},[11,14922,6726],{},[15,14924,23],{"id":23},[11,14926,14927],{},[27,14928],{"alt":6733,"src":6734},[11,14930,6737],{},[15,14932,40],{"id":40},[42,14934,14935,14937,14939],{},[45,14936,6744],{},[45,14938,6747],{},[45,14940,6750],{},[15,14942,59],{"id":59},[11,14944,62],{},[64,14946,14947],{"className":66,"code":6757,"language":68,"meta":69,"style":69},[34,14948,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997],{"__ignoreMap":69},[73,14950,14951],{"class":75,"line":76},[73,14952,6764],{},[73,14954,14955],{"class":75,"line":152},[73,14956,6769],{},[73,14958,14959],{"class":75,"line":420},[73,14960,6774],{},[73,14962,14963],{"class":75,"line":426},[73,14964,956],{"emptyLinePlaceholder":166},[73,14966,14967],{"class":75,"line":618},[73,14968,6783],{},[73,14970,14971],{"class":75,"line":1156},[73,14972,6788],{},[73,14974,14975],{"class":75,"line":1162},[73,14976,6793],{},[73,14978,14979],{"class":75,"line":1168},[73,14980,956],{"emptyLinePlaceholder":166},[73,14982,14983],{"class":75,"line":2630},[73,14984,6802],{},[73,14986,14987],{"class":75,"line":2845},[73,14988,6807],{},[73,14990,14991],{"class":75,"line":4510},[73,14992,956],{"emptyLinePlaceholder":166},[73,14994,14995],{"class":75,"line":4515},[73,14996,6816],{},[73,14998,14999],{"class":75,"line":6123},[73,15000,6821],{},[11,15002,81],{},[64,15004,15006],{"className":15005,"code":6827,"language":87,"meta":69},[85],[34,15007,6827],{"__ignoreMap":69},[11,15009,92],{},[15,15011,95],{"id":95},[97,15013,15014,15020],{},[45,15015,15016,6841,15018,6845],{},[34,15017,6840],{},[34,15019,6844],{},[45,15021,6848,15022,6852],{},[34,15023,6851],{},[15,15025,115],{"id":115},[42,15027,15028,15030],{},[45,15029,6859],{},[45,15031,6862],{},[15,15033,129],{"id":129},[97,15035,15036,15042],{},[45,15037,6869,15038,6873,15040,383],{},[34,15039,6872],{},[34,15041,6876],{},[45,15043,6879],{},[11,15045,140],{},[15,15047,143],{"id":143},[11,15049,6886],{},[148,15051,150],{},{"title":69,"searchDepth":152,"depth":152,"links":15053},[15054,15055,15056,15057,15058,15059,15060,15061],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":6716,"description":6721},[162,6906,6907],{"id":6910,"title":6911,"body":15066,"category":162,"cover":163,"description":6916,"extension":164,"meta":15229,"navigation":166,"path":7120,"pinned":168,"publishedAt":169,"seo":15230,"slug":7122,"stem":7123,"summary":7124,"tags":15231,"updatedAt":169,"visible":166,"__hash__":7128},{"type":8,"value":15067,"toc":15217},[15068,15070,15072,15074,15076,15080,15084,15086,15102,15104,15106,15150,15152,15157,15159,15161,15175,15177,15181,15185,15189,15191,15197,15199,15209,15211,15213,15215],[11,15069,6916],{},[15,15071,17],{"id":17},[11,15073,6921],{},[15,15075,23],{"id":23},[11,15077,15078],{},[27,15079],{"alt":6928,"src":6929},[11,15081,6932,15082,6936],{},[34,15083,6935],{},[15,15085,40],{"id":40},[42,15087,15088,15094,15100],{},[45,15089,15090,6946,15092,6950],{},[34,15091,6945],{},[34,15093,6949],{},[45,15095,6953,15096,6957,15098,6960],{},[34,15097,6956],{},[34,15099,3019],{},[45,15101,6963],{},[15,15103,59],{"id":59},[11,15105,62],{},[64,15107,15108],{"className":66,"code":6970,"language":68,"meta":69,"style":69},[34,15109,15110,15114,15118,15122,15126,15130,15134,15138,15142,15146],{"__ignoreMap":69},[73,15111,15112],{"class":75,"line":76},[73,15113,6977],{},[73,15115,15116],{"class":75,"line":152},[73,15117,6982],{},[73,15119,15120],{"class":75,"line":420},[73,15121,6987],{},[73,15123,15124],{"class":75,"line":426},[73,15125,6992],{},[73,15127,15128],{"class":75,"line":618},[73,15129,6997],{},[73,15131,15132],{"class":75,"line":1156},[73,15133,956],{"emptyLinePlaceholder":166},[73,15135,15136],{"class":75,"line":1162},[73,15137,7006],{},[73,15139,15140],{"class":75,"line":1168},[73,15141,7011],{},[73,15143,15144],{"class":75,"line":2630},[73,15145,7011],{},[73,15147,15148],{"class":75,"line":2845},[73,15149,7011],{},[11,15151,81],{},[64,15153,15155],{"className":15154,"code":7025,"language":87,"meta":69},[85],[34,15156,7025],{"__ignoreMap":69},[11,15158,92],{},[15,15160,95],{"id":95},[97,15162,15163,15167],{},[45,15164,6616,15165,7039],{},[34,15166,7038],{},[45,15168,7042,15169,7045,15171,7048,15173,7052],{},[34,15170,6949],{},[34,15172,6935],{},[34,15174,7051],{},[1371,15176,1373],{"id":1373},[11,15178,7057,15179,7060],{},[34,15180,6949],{},[11,15182,15183],{},[27,15184],{"alt":7065,"src":7066},[11,15186,7069,15187,7072],{},[34,15188,6935],{},[15,15190,115],{"id":115},[42,15192,15193,15195],{},[45,15194,7079],{},[45,15196,7082],{},[15,15198,129],{"id":129},[97,15200,15201,15203],{},[45,15202,7089],{},[45,15204,2688,15205,7094,15207,7097],{},[34,15206,3019],{},[34,15208,6949],{},[11,15210,140],{},[15,15212,143],{"id":143},[11,15214,7104],{},[148,15216,150],{},{"title":69,"searchDepth":152,"depth":152,"links":15218},[15219,15220,15221,15222,15223,15226,15227,15228],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":15224},[15225],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":6911,"description":6916},[162,7126,7127],{"id":7130,"title":7131,"body":15233,"category":162,"cover":163,"description":7136,"extension":164,"meta":15416,"navigation":166,"path":7361,"pinned":168,"publishedAt":169,"seo":15417,"slug":7363,"stem":7364,"summary":7365,"tags":15418,"updatedAt":169,"visible":166,"__hash__":7368},{"type":8,"value":15234,"toc":15404},[15235,15237,15239,15241,15243,15247,15249,15251,15265,15267,15269,15337,15339,15344,15346,15348,15362,15364,15366,15370,15376,15378,15386,15388,15396,15398,15400,15402],[11,15236,7136],{},[15,15238,17],{"id":17},[11,15240,7141],{},[15,15242,23],{"id":23},[11,15244,15245],{},[27,15246],{"alt":7148,"src":7149},[11,15248,7152],{},[15,15250,40],{"id":40},[42,15252,15253,15259,15261],{},[45,15254,15255,7162,15257,383],{},[34,15256,7161],{},[34,15258,7165],{},[45,15260,7168],{},[45,15262,15263,7174],{},[34,15264,7173],{},[15,15266,59],{"id":59},[11,15268,62],{},[64,15270,15271],{"className":66,"code":7181,"language":68,"meta":69,"style":69},[34,15272,15273,15277,15281,15285,15289,15293,15297,15301,15305,15309,15313,15317,15321,15325,15329,15333],{"__ignoreMap":69},[73,15274,15275],{"class":75,"line":76},[73,15276,7188],{},[73,15278,15279],{"class":75,"line":152},[73,15280,956],{"emptyLinePlaceholder":166},[73,15282,15283],{"class":75,"line":420},[73,15284,7197],{},[73,15286,15287],{"class":75,"line":426},[73,15288,7202],{},[73,15290,15291],{"class":75,"line":618},[73,15292,7207],{},[73,15294,15295],{"class":75,"line":1156},[73,15296,7212],{},[73,15298,15299],{"class":75,"line":1162},[73,15300,7217],{},[73,15302,15303],{"class":75,"line":1168},[73,15304,7222],{},[73,15306,15307],{"class":75,"line":2630},[73,15308,7227],{},[73,15310,15311],{"class":75,"line":2845},[73,15312,7232],{},[73,15314,15315],{"class":75,"line":4510},[73,15316,956],{"emptyLinePlaceholder":166},[73,15318,15319],{"class":75,"line":4515},[73,15320,7241],{},[73,15322,15323],{"class":75,"line":6123},[73,15324,4864],{},[73,15326,15327],{"class":75,"line":6129},[73,15328,4869],{},[73,15330,15331],{"class":75,"line":7252},[73,15332,956],{"emptyLinePlaceholder":166},[73,15334,15335],{"class":75,"line":7257},[73,15336,7260],{},[11,15338,81],{},[64,15340,15342],{"className":15341,"code":7266,"language":87,"meta":69},[85],[34,15343,7266],{"__ignoreMap":69},[11,15345,92],{},[15,15347,95],{"id":95},[97,15349,15350,15360],{},[45,15351,7277,15352,7281,15354,7285,15356,7289,15358,383],{},[34,15353,7280],{},[34,15355,7284],{},[34,15357,7288],{},[34,15359,7280],{},[45,15361,7294],{},[1371,15363,1373],{"id":1373},[11,15365,7299],{},[11,15367,15368],{},[27,15369],{"alt":7304,"src":7305},[11,15371,15372,7310,15374,383],{},[34,15373,7161],{},[34,15375,7165],{},[15,15377,115],{"id":115},[42,15379,15380,15384],{},[45,15381,7319,15382,383],{},[34,15383,4061],{},[45,15385,7324],{},[15,15387,129],{"id":129},[97,15389,15390,15392],{},[45,15391,7331],{},[45,15393,7334,15394,7338],{},[34,15395,7337],{},[11,15397,140],{},[15,15399,143],{"id":143},[11,15401,7345],{},[148,15403,150],{},{"title":69,"searchDepth":152,"depth":152,"links":15405},[15406,15407,15408,15409,15410,15413,15414,15415],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":15411},[15412],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":7131,"description":7136},[162,7367,4012],{"id":7370,"title":7371,"body":15420,"category":162,"cover":163,"description":7376,"extension":164,"meta":15579,"navigation":166,"path":7564,"pinned":168,"publishedAt":169,"seo":15580,"slug":7566,"stem":7567,"summary":7568,"tags":15581,"updatedAt":169,"visible":166,"__hash__":7572},{"type":8,"value":15421,"toc":15567},[15422,15424,15426,15428,15430,15434,15436,15438,15446,15448,15450,15514,15516,15521,15523,15525,15533,15535,15537,15541,15543,15545,15551,15553,15559,15561,15563,15565],[11,15423,7376],{},[15,15425,17],{"id":17},[11,15427,7381],{},[15,15429,23],{"id":23},[11,15431,15432],{},[27,15433],{"alt":7388,"src":7389},[11,15435,7392],{},[15,15437,40],{"id":40},[42,15439,15440,15442,15444],{},[45,15441,7399],{},[45,15443,7402],{},[45,15445,7405],{},[15,15447,59],{"id":59},[11,15449,62],{},[64,15451,15452],{"className":66,"code":7412,"language":68,"meta":69,"style":69},[34,15453,15454,15458,15462,15466,15470,15474,15478,15482,15486,15490,15494,15498,15502,15506,15510],{"__ignoreMap":69},[73,15455,15456],{"class":75,"line":76},[73,15457,7419],{},[73,15459,15460],{"class":75,"line":152},[73,15461,7424],{},[73,15463,15464],{"class":75,"line":420},[73,15465,956],{"emptyLinePlaceholder":166},[73,15467,15468],{"class":75,"line":426},[73,15469,7433],{},[73,15471,15472],{"class":75,"line":618},[73,15473,956],{"emptyLinePlaceholder":166},[73,15475,15476],{"class":75,"line":1156},[73,15477,7442],{},[73,15479,15480],{"class":75,"line":1162},[73,15481,7447],{},[73,15483,15484],{"class":75,"line":1168},[73,15485,7452],{},[73,15487,15488],{"class":75,"line":2630},[73,15489,956],{"emptyLinePlaceholder":166},[73,15491,15492],{"class":75,"line":2845},[73,15493,7461],{},[73,15495,15496],{"class":75,"line":4510},[73,15497,7466],{},[73,15499,15500],{"class":75,"line":4515},[73,15501,7471],{},[73,15503,15504],{"class":75,"line":6123},[73,15505,956],{"emptyLinePlaceholder":166},[73,15507,15508],{"class":75,"line":6129},[73,15509,4878],{},[73,15511,15512],{"class":75,"line":7252},[73,15513,7484],{},[11,15515,81],{},[64,15517,15519],{"className":15518,"code":7490,"language":87,"meta":69},[85],[34,15520,7490],{"__ignoreMap":69},[11,15522,92],{},[15,15524,95],{"id":95},[97,15526,15527,15531],{},[45,15528,15529,7504],{},[34,15530,7503],{},[45,15532,7507],{},[1371,15534,1373],{"id":1373},[11,15536,7512],{},[11,15538,15539],{},[27,15540],{"alt":7517,"src":7518},[11,15542,7521],{},[15,15544,115],{"id":115},[42,15546,15547,15549],{},[45,15548,7528],{},[45,15550,7531],{},[15,15552,129],{"id":129},[97,15554,15555,15557],{},[45,15556,7538],{},[45,15558,7541],{},[11,15560,140],{},[15,15562,143],{"id":143},[11,15564,7548],{},[148,15566,150],{},{"title":69,"searchDepth":152,"depth":152,"links":15568},[15569,15570,15571,15572,15573,15576,15577,15578],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":15574},[15575],{"id":1373,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":7371,"description":7376},[162,7570,7571],{"id":7574,"title":7575,"body":15583,"category":162,"cover":163,"description":7580,"extension":164,"meta":15821,"navigation":166,"path":7881,"pinned":168,"publishedAt":169,"seo":15822,"slug":7883,"stem":7884,"summary":7885,"tags":15823,"updatedAt":169,"visible":166,"__hash__":7889},{"type":8,"value":15584,"toc":15808},[15585,15587,15589,15591,15593,15597,15599,15601,15611,15613,15615,15731,15733,15738,15740,15742,15752,15754,15756,15760,15762,15764,15766,15770,15774,15776,15784,15786,15800,15802,15804,15806],[11,15586,7580],{},[15,15588,17],{"id":17},[11,15590,7585],{},[15,15592,23],{"id":23},[11,15594,15595],{},[27,15596],{"alt":7592,"src":7593},[11,15598,7596],{},[15,15600,40],{"id":40},[42,15602,15603,15605,15607],{},[45,15604,7603],{},[45,15606,7606],{},[45,15608,7609,15609,7613],{},[34,15610,7612],{},[15,15612,59],{"id":59},[11,15614,62],{},[64,15616,15617],{"className":66,"code":7620,"language":68,"meta":69,"style":69},[34,15618,15619,15623,15627,15631,15635,15639,15643,15647,15651,15655,15659,15663,15667,15671,15675,15679,15683,15687,15691,15695,15699,15703,15707,15711,15715,15719,15723,15727],{"__ignoreMap":69},[73,15620,15621],{"class":75,"line":76},[73,15622,5678],{},[73,15624,15625],{"class":75,"line":152},[73,15626,5286],{},[73,15628,15629],{"class":75,"line":420},[73,15630,956],{"emptyLinePlaceholder":166},[73,15632,15633],{"class":75,"line":426},[73,15634,7639],{},[73,15636,15637],{"class":75,"line":618},[73,15638,7644],{},[73,15640,15641],{"class":75,"line":1156},[73,15642,7649],{},[73,15644,15645],{"class":75,"line":1162},[73,15646,7654],{},[73,15648,15649],{"class":75,"line":1168},[73,15650,956],{"emptyLinePlaceholder":166},[73,15652,15653],{"class":75,"line":2630},[73,15654,7663],{},[73,15656,15657],{"class":75,"line":2845},[73,15658,7668],{},[73,15660,15661],{"class":75,"line":4510},[73,15662,7673],{},[73,15664,15665],{"class":75,"line":4515},[73,15666,7678],{},[73,15668,15669],{"class":75,"line":6123},[73,15670,7683],{},[73,15672,15673],{"class":75,"line":6129},[73,15674,956],{"emptyLinePlaceholder":166},[73,15676,15677],{"class":75,"line":7252},[73,15678,7692],{},[73,15680,15681],{"class":75,"line":7257},[73,15682,7697],{},[73,15684,15685],{"class":75,"line":7700},[73,15686,7703],{},[73,15688,15689],{"class":75,"line":7706},[73,15690,956],{"emptyLinePlaceholder":166},[73,15692,15693],{"class":75,"line":7711},[73,15694,7714],{},[73,15696,15697],{"class":75,"line":7717},[73,15698,956],{"emptyLinePlaceholder":166},[73,15700,15701],{"class":75,"line":7722},[73,15702,6096],{},[73,15704,15705],{"class":75,"line":7727},[73,15706,7730],{},[73,15708,15709],{"class":75,"line":7733},[73,15710,7736],{},[73,15712,15713],{"class":75,"line":7739},[73,15714,7742],{},[73,15716,15717],{"class":75,"line":7745},[73,15718,6106],{},[73,15720,15721],{"class":75,"line":7750},[73,15722,7753],{},[73,15724,15725],{"class":75,"line":7756},[73,15726,2833],{},[73,15728,15729],{"class":75,"line":7761},[73,15730,7764],{},[11,15732,81],{},[64,15734,15736],{"className":15735,"code":7770,"language":87,"meta":69},[85],[34,15737,7770],{"__ignoreMap":69},[11,15739,92],{},[15,15741,95],{"id":95},[97,15743,15744,15748],{},[45,15745,7781,15746,7784],{},[34,15747,7612],{},[45,15749,15750,7789],{},[34,15751,6844],{},[1371,15753,1373],{"id":1373},[11,15755,7794],{},[11,15757,15758],{},[27,15759],{"alt":7799,"src":7800},[11,15761,7803],{},[1371,15763,1373],{"id":2900},[11,15765,7808],{},[11,15767,15768],{},[27,15769],{"alt":7813,"src":7814},[11,15771,7817,15772,7821],{},[34,15773,7820],{},[15,15775,115],{"id":115},[42,15777,15778,15780],{},[45,15779,7828],{},[45,15781,7831,15782,7834],{},[34,15783,7820],{},[15,15785,129],{"id":129},[97,15787,15788,15792,15794],{},[45,15789,7841,15790,7844],{},[34,15791,7820],{},[45,15793,7847],{},[45,15795,7850,15796,7854,15798,7857],{},[34,15797,7853],{},[34,15799,4820],{},[11,15801,140],{},[15,15803,143],{"id":143},[11,15805,7864],{},[148,15807,150],{},{"title":69,"searchDepth":152,"depth":152,"links":15809},[15810,15811,15812,15813,15814,15818,15819,15820],{"id":17,"depth":152,"text":17},{"id":23,"depth":152,"text":23},{"id":40,"depth":152,"text":40},{"id":59,"depth":152,"text":59},{"id":95,"depth":152,"text":95,"children":15815},[15816,15817],{"id":1373,"depth":420,"text":1373},{"id":2900,"depth":420,"text":1373},{"id":115,"depth":152,"text":115},{"id":129,"depth":152,"text":129},{"id":143,"depth":152,"text":143},{},{"title":7575,"description":7580},[162,7887,7888],1786973363593]