<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>CloudyMount&#39;s blog</title>
    <link>https://cloudymount789.github.io/</link>
    <description>Recent content on CloudyMount&#39;s blog created by </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Wed, 08 Apr 2026 20:26:49 +0800</lastBuildDate><atom:link href="https://cloudymount789.github.io/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>live2D全栈制作教程/避坑</title>
      <link>https://cloudymount789.github.io/blog/live2d_note/</link>
      <pubDate>Wed, 08 Apr 2026 20:26:49 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/live2d_note/</guid>
      <description>&lt;p&gt;本文是一份针对 Live2D 制作全链路的进阶手册，浓缩了作者疯狂踩坑总结出来的心酸血泪史，几近全部排雷，旨在帮助读者从零构建一套完整的虚拟形象驱动方案。通过阅读本文，你将建立起从高精度图层拆分、多模态网格布点到多层级变形器架构，面部表情、头部、身体九轴动画，配置物理效果的核心技术认知。文章更深度复盘了跨平台文件兼容性处理与模型稳定性调优的实战经验，通过这篇教程，你将学会一套高效、稳定的 Live2D 开发工作流。&lt;/p&gt;
&lt;h1 id=&#34;live2d全栈制作教程&#34;&gt;live2D全栈制作教程&lt;/h1&gt;
&lt;p&gt;参考了一些教程，大部分用自己语言重写了&lt;/p&gt;
&lt;h2 id=&#34;拆分&#34;&gt;拆分&lt;/h2&gt;
&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;拆分很重要！！！基本决定了你后续做出的效果，拆分的好可以让你后续的效率大大提升！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重视拆分！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;做live2D之前，你需要有一个包含图层信息的绘画工程文件&lt;/p&gt;
&lt;p&gt;因为煮啵自己是画师，所以使用了自己绘制的立绘&lt;/p&gt;
&lt;p&gt;由于煮啵是画完立绘之后才想做个live2D的，就导致即使有过程文件也得痛苦的手动拆分&lt;/p&gt;
&lt;p&gt;立绘绘制花了约7小时，然后拆分拆了14个小时（）笑晕了&lt;/p&gt;
&lt;p&gt;什么坑全被煮啵踩了一遍/泪&lt;/p&gt;
&lt;h3 id=&#34;立绘的注意事项&#34;&gt;立绘的注意事项&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;建议画正面对称的角色，可动性会高一点&lt;/li&gt;
&lt;li&gt;关于颜色：不要把背景色扣除的颜色全用上了（）&lt;/li&gt;
&lt;li&gt;最好是在画的时候就把每个部件分图层绘制和上色&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;拆分原则&#34;&gt;拆分原则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完整性：&lt;/strong&gt; 遮挡部分必须补全（例如：由于头发遮挡看不见的额头、由于手遮挡看不见的衣服）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立性：&lt;/strong&gt; 所有需要独立变形的部件必须分层。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图层命名：&lt;/strong&gt; 使用清晰的命名。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;拆分层级结构&#34;&gt;拆分层级结构&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;├── 头
│   ├── 脸（补全发际线，画完整）
│   ├── 鼻
│   ├── 左眉
│   ├── 右眉
│   ├── 左耳（长的耳环等饰品需要单独做物理摆动效果的，要单独拆分）
│   ├── 右耳（耳朵要多画出正面看不到的部分）
│   ├── 左眼
│   │   ├── 上眼皮
│   │   ├── 下眼皮+下睫毛
│   │   ├── 上睫毛(睫毛也可以一根一根拆出)
│   │   ├── 外眼角
│   │   ├── 眼白
│   │   ├── 眼珠
│   │   ├── 瞳孔
│   │   └── 高光
│   ├── 右眼（具体同上）
│   └── 嘴
│       ├── 上嘴唇（要带一点皮肤，要盖的住嘴巴内部）
│       ├── 下嘴唇
│       ├── 嘴巴（建议画张开状态）
│       ├── 上牙
│       ├── 下牙
│       └── 嘴的整体纯色蒙版
├── 头发
│   ├── 刘海（根据不同角色发型，要拆出每个发片，如左右中刘海）
│   ├── 鬓发
│   ├── 后发 （一定要补全脑壳地方的头发！！！发旋也可以画出来，头发的内面可以用暗色）
│   ├── （呆毛）
│   └── 其他
└── 身体
    ├── 脖子（要画够长）
    ├── 上半身
    ├── 胸（左右）（看个人爱好hhhhh）
    ├── 下半身（在腰处相交）
    ├── （两个胳膊）（想旋转更大可拆）
    ├── 衣服（可拆前后，动的幅度不同）
    └── 角色特色的饰品（你想让它动起来）
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;小贴士&#34;&gt;小贴士&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;live2D中可实现的图层效果：正片叠底，剪切蒙版&lt;/li&gt;
&lt;li&gt;其他发光/叠加等图层效果带不进去&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;保存psd&#34;&gt;保存PSD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一定要有序命名图层！！并可以打好图层组&lt;/li&gt;
&lt;li&gt;文件格式：PSD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;踩坑总结&#34;&gt;踩坑总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这是极其影响煮啵编辑体验感的几个坑呜呜呜&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;问题一&#34;&gt;问题一&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一定要先确认拆分没问题了再开始布点和打变形器！！！&lt;/li&gt;
&lt;li&gt;虽然可以导入更新后的PSD文件，并且理论上它会将新增的图层识别并放进另一个文件夹，但是就我的使用来说&lt;/li&gt;
&lt;li&gt;如果图层顺序发生了更改，或是新增/删除了图层，都有概率出现新导入的PSD图层和布点/变形器对不上的问题！！！&lt;/li&gt;
&lt;li&gt;关于这个问题，我询问了很久的ai，寻找了很久的解决方案，最后还是没能解决，卡了非常久最后放弃了。&lt;/li&gt;
&lt;li&gt;ai老是编造软件的功能，实际上软件里没有这个选项&lt;/li&gt;
&lt;li&gt;后来我发现即使图层名完全一致，没有顺序和数量的不同，导入一个新的也会出现问题/泪&lt;/li&gt;
&lt;li&gt;不知道是不是我的图层命名是中文可能被识别成乱码的原因，没有排查&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;问题二&#34;&gt;问题二&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;procreate在导出PSD文件的时候&lt;/li&gt;
&lt;li&gt;尽管关闭了背景的显示，成为了透明底&lt;/li&gt;
&lt;li&gt;但是由于它不能删除背景这个图层，导致每个图层默认大小都是整个画布大小，而不是贴合在图像四周的&lt;/li&gt;
&lt;li&gt;首先就是导致布点的时候，每个图层的画布的最边上四个角莫名其妙都各有一个点，导致用不了自动连接布点&lt;/li&gt;
&lt;li&gt;其次就是导致变形器不会贴合在图像四周&lt;/li&gt;
&lt;li&gt;当时因为已经做了很多布点了，并且因为问题一想要重新导入一直失败，最后的解决办法是一个一个图层手动擦，增加了很多工作量&lt;/li&gt;
&lt;li&gt;应该可行的解决方案是将PSD文件在Photoshop里打开，删除背景图层后再导入live2D&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;感触&#34;&gt;感触&lt;/h4&gt;
&lt;p&gt;问ai很难解决这类问题，一个是他们并非这方面的专家，一个是他们会一直编造软件的功能，或是可能是因为他们检索到的文章使用的软件版本不同？不清楚，反正困难重重&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;布点&#34;&gt;布点&lt;/h2&gt;
&lt;h3 id=&#34;导入&#34;&gt;导入&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将整理好的 PSD 文件直接拖入 Live2D Cubism Editor。&lt;/li&gt;
&lt;li&gt;或者在文件-&amp;gt;打开文件&lt;/li&gt;
&lt;li&gt;如果要替换：模型设定-&amp;gt;选择当前模型-&amp;gt;选择要运行或替换当前的psd文件-&amp;gt;替换&lt;/li&gt;
&lt;li&gt;新增图层在文件夹(未找到对应)里面,本来就有的图层会叠加更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;开始布点&#34;&gt;开始布点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;形状: 三角形&lt;/li&gt;
&lt;li&gt;网格越密集,变形越精细&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动布点：&lt;/strong&gt; 初学者可全选图层使用“自动生成网格”,参数可以自己看情况试一试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后续手动布点：&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;眼睛、嘴唇等需要细腻变形的部位，需手动增加网格密度（点越细，变形越平滑）。&lt;/li&gt;
&lt;li&gt;自动布点有缺漏的地方需要手动补上&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;tips&#34;&gt;tips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;没有被布点圈住的图像在live2D中不会显示&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;改变笔刷大小只能使用快捷键B&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重要&lt;/strong&gt;：建议先大概了解一下布点工具栏中的工具都有什么用途，提高效率。可以自己摸索或者网上找教程学习。
&lt;img src=&#34;https://cloudymount789.github.io/images/image-14.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;还有这里的工具&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-1775638609079.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重要&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;保护线不被拉扯变形，要在线上和线的上下两侧都布点&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-1775638384024.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以使用一个快捷的工具&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;绘制顺序&#34;&gt;绘制顺序&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;数值越大，图层越靠前。头发和饰品根据前后关系上下浮动。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;动画制作&#34;&gt;动画制作&lt;/h2&gt;
&lt;h3 id=&#34;图层属性&#34;&gt;图层属性&lt;/h3&gt;
&lt;h3 id=&#34;参数与关键帧&#34;&gt;参数与关键帧&lt;/h3&gt;
&lt;p&gt;和剪辑有点像，在参数的轴上打关键帧，之后再调整变形器，软件会自动计算出关键帧之间的变形器是怎么移动的、
&lt;img src=&#34;https://cloudymount789.github.io/images/image-12.png&#34; alt=&#34;alt text&#34;&gt;
&lt;img src=&#34;https://cloudymount789.github.io/images/image-13.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不打关键帧就会白给！！！！一定要记得！！！&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;变形器&#34;&gt;变形器&lt;/h3&gt;
&lt;h4 id=&#34;分类&#34;&gt;分类&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;曲面变形器 (Warp Deformer)：&lt;/strong&gt; 用于处理物体的位移、旋转和整体变形（最常用）。
&lt;ul&gt;
&lt;li&gt;常用参数如下，可以看情况调
&lt;img src=&#34;https://cloudymount789.github.io/images/image-1775639778583.png&#34; alt=&#34;alt text&#34;&gt;&lt;/li&gt;
&lt;li&gt;上⾯是让⽹格更密集，让变形更平滑（灰色）&lt;/li&gt;
&lt;li&gt;下⾯是扳⼿数量，⽅便调整&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;旋转变形器 (Rotation Deformer)：&lt;/strong&gt; 用于关节转动（如手臂、头颈摆动，即z轴）。
&lt;ul&gt;
&lt;li&gt;ctrl改变中⼼点&lt;/li&gt;
&lt;li&gt;建议放在所有变形器最外层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;层级结构&#34;&gt;层级结构&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;必须遵循“父子关系”。例如：【头旋转】控制【五官曲面】控制【具体器官】&lt;/li&gt;
&lt;li&gt;建议旋转变形器永远套在曲面变形器外面&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;其他&#34;&gt;其他&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ctrl可改变形器⼤⼩，注意要在打关键帧前做&lt;/li&gt;
&lt;li&gt;按住ctrl可以选中多个图层，然后给多个图层打变形器，注意不能跨父子层级&lt;/li&gt;
&lt;li&gt;移动变形器的上下顺序，不影响图层的顺序&lt;/li&gt;
&lt;li&gt;可以把不同图层组的图层放在同⼀个变形区中⼀起做变形&lt;/li&gt;
&lt;li&gt;因为变形器就像个图层组，所以不能把同个图层同时放在多个组⾥，要放的话只能⼀个组套⼀个组&lt;/li&gt;
&lt;li&gt;套两个及以上的变形器，外⾯的变形器扭曲的是⾥⾯的变形器，⽽不是作⽤图层，所以⾥⾯那层变形器⼀定要覆盖图层所有⾯积,不然外⾯的变形区就⽆法精准控制⾥⾯的物体&lt;/li&gt;
&lt;li&gt;如果打错了变形器，可以先把变形器调到初始状态，将内⾥的图层取出。如果没有回到初始就取出 ，图
层会保持变形状态&lt;/li&gt;
&lt;li&gt;变形器也要做好清晰命名！！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;制作&#34;&gt;制作&lt;/h3&gt;
&lt;p&gt;建议按照表情制作-&amp;gt;头部旋转(即鼎鼎大名的九轴)-&amp;gt;身体旋转&lt;/p&gt;
&lt;p&gt;把参数里有的东西都做一遍就好了（）&lt;/p&gt;
&lt;p&gt;这里挑几个讲一下&lt;/p&gt;
&lt;h4 id=&#34;踩坑点&#34;&gt;踩坑点&lt;/h4&gt;
&lt;p&gt;我看很多教程基本上没讲,但是我觉得知道这个很重要&lt;/p&gt;
&lt;p&gt;在这里也踩了大量坑/泪，因为这个前提条件做错就只能重做了&lt;/p&gt;
&lt;p&gt;当时不知道这个，简直狠狠地难住我了，后来由于尝试强行删除关键帧，直接把眼睛弄的睁不开了！！！！&lt;/p&gt;
&lt;p&gt;但是由于眼睛闭上几乎把所有眼睛图层压缩成一条线了，还原几乎不可能，只能找以前版本，可是我没保存！！！！&lt;/p&gt;
&lt;p&gt;点撤销也没用（&lt;strong&gt;live2D在做完某些操作时候不能撤回&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;最后研究了很久回退，好在救回来了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;血泪经验：做一点保存一点，最好使用另存&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不到万不得已不要删关键帧，会把一整个环境弄坏&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个变形器或者图层绑多个参数的不同关键帧的时候,会出现&lt;strong&gt;优先级问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个变形器先做了一个参数的动画&lt;/li&gt;
&lt;li&gt;在对同一个变形器做下一个操作的时候&lt;/li&gt;
&lt;li&gt;上一个做好的参数&lt;strong&gt;放在哪个关键帧&lt;/strong&gt;，会成为下一个动画&lt;strong&gt;生效的前提条件&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;举个例子：如果你做完了X轴，还没有和Y轴链接，但做Y的时候你把X放在最左边的位置，&lt;/li&gt;
&lt;li&gt;你会发现当你把X移到中间的关键帧的时候，移动Y轴没反应&lt;/li&gt;
&lt;li&gt;这是因为X放在最左边变成了Y参数生效的前提条件&lt;/li&gt;
&lt;li&gt;利用这个特性可以实现一些东西，比如由于面捕软件对眼睛微笑很不明显&lt;/li&gt;
&lt;li&gt;所以可以将微笑绑定到: &lt;em&gt;嘴巴抿起&lt;/em&gt; 和 &lt;em&gt;眼睛闭上&lt;/em&gt; 这两个前提下触发&lt;/li&gt;
&lt;li&gt;live2D在同一个东西绑定了2个以上的参数的时候会报提示，也不建议这样&lt;/li&gt;
&lt;li&gt;解决方法有：&lt;strong&gt;链接两个参数&lt;/strong&gt;, &lt;strong&gt;分别绑参数在变形器和原图层&lt;/strong&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;眼球移动&#34;&gt;眼球移动&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;先打变形器&lt;/li&gt;
&lt;li&gt;分开做完X、Y轴（建议两边严谨点平行移动等距离，煮啵拿尺子量的）
&lt;ul&gt;
&lt;li&gt;（这也是一个踩坑点hhh因为第一遍用目测的实在是太不准了，而且做X的时候Y也发生了偏移hhh，最后调了非常久效果还是不满意直接用尺子量重做了，快了好多，浪费了两个小时呜呜）&lt;/li&gt;
&lt;li&gt;（眼球可以稍微偏出去一点，因为最后导入面捕的时候灵敏度可以调，幅度太小会变化不明显，同样适用后面）&lt;/li&gt;
&lt;li&gt;（上面那点也是踩坑点hhh煮啵怎么这么命苦）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意做Y轴的时候X轴要放在正中间！！！！很重要&lt;/strong&gt;，做后面的也是一样&lt;/li&gt;
&lt;li&gt;在左侧列表点链接&lt;/li&gt;
&lt;li&gt;感觉有点不自然？右上角三横线-&amp;gt;四角形状合成&lt;/li&gt;
&lt;li&gt;微调9个关键帧的位置，链接之后的是ai帮你计算的&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;剪贴蒙版&#34;&gt;剪贴蒙版&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;用途：&lt;/strong&gt; 实现“眼珠不超出眼白”等效果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;操作：&lt;/strong&gt; 复制眼白的图层 ID，粘贴到瞳孔图层的“剪贴蒙版”栏目中。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;眨眼：&lt;/strong&gt; 设置参数值 1 为睁眼，0 为闭眼。利用变形器微调网格，确保闭眼时睫毛覆盖眼眶。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;睁眼闭眼&#34;&gt;睁眼闭眼&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;做这些形状没什么讲究的，怎么好看怎么调，这里略写，如果调不好看可能是布点布的不够好，可以重新布一下&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;善用软件操作和工具&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;眼睛动画自动生成的如果不满意，就多K⼀个点调整&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同理，闭眼的时候只要把所有东西压成一条线藏进睫毛就好了，微笑也是&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;嘴巴&#34;&gt;嘴巴&lt;/h4&gt;
&lt;p&gt;同理，以下形状可供参考
&lt;img src=&#34;https://cloudymount789.github.io/images/image-1775639088561.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;p&gt;进阶版可做9个点
&lt;img src=&#34;https://cloudymount789.github.io/images/image-1775639198875.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;眉毛&#34;&gt;眉毛&lt;/h4&gt;
&lt;p&gt;建议不要做，live2D诡异的给了很多参数，但是其实都不明显，面捕可能会抽搐&lt;/p&gt;
&lt;h4 id=&#34;微笑&#34;&gt;微笑&lt;/h4&gt;
&lt;p&gt;接刚刚所说，由于面捕软件对眼睛微笑很不明显&lt;/p&gt;
&lt;p&gt;所以可以将微笑绑定到: &lt;em&gt;嘴巴抿起&lt;/em&gt; 和 &lt;em&gt;眼睛闭上&lt;/em&gt; 这两个前提下触发&lt;/p&gt;
&lt;p&gt;可以直接ctrl多选闭上的眼睛的所有图层，打上曲线并整体移动曲线&lt;/p&gt;
&lt;p&gt;（煮啵尝试失败了，自己手动k的，此为理论方法）&lt;/p&gt;
&lt;h4 id=&#34;踩坑点-1&#34;&gt;踩坑点&lt;/h4&gt;
&lt;p&gt;如果不知道0和1分别对应的是什么（不要相信中文翻译的语序！！我就被骗了呜呜呜）&lt;/p&gt;
&lt;p&gt;可以点参数界面右上角的三个横线-&amp;gt;参数设定&lt;/p&gt;
&lt;p&gt;另外!!!做反了或者绑错参数了不要急着重做(是的呜呜呜我就是直接重做了，煮啵踩了无数的坑真的)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-1775640244295.png&#34; alt=&#34;alt text&#34;&gt;
点反映可以交换参数轴
&lt;strong&gt;选择：&lt;/strong&gt; 选中轴绑定的所有物体
&lt;strong&gt;反映：&lt;/strong&gt; 是将整个参数轴翻转（是把左右数值搞反⽤的，注意跟动作反转是完全不⼀样的东西）
&lt;strong&gt;调整：&lt;/strong&gt; 可以把关键Z互换，不⼩⼼个别打错的换⼀下
&lt;strong&gt;变更：&lt;/strong&gt; 将该参数转移到正确的轴上&lt;/p&gt;
&lt;p&gt;还有这个
&lt;img src=&#34;https://cloudymount789.github.io/images/image-1775640164033.png&#34; alt=&#34;alt text&#34;&gt;
可以比较方便的做另一边，但是建议还是手动k&lt;/p&gt;
&lt;h4 id=&#34;感悟&#34;&gt;感悟&lt;/h4&gt;
&lt;p&gt;在做一件事之前先详细的了解工具有什么功能,可以大大提高效率/泪&lt;/p&gt;
&lt;p&gt;反正我是印象深刻了&lt;/p&gt;
&lt;h4 id=&#34;头部九轴&#34;&gt;头部九轴&lt;/h4&gt;
&lt;p&gt;也是同理，就是工作量比较大&lt;/p&gt;
&lt;p&gt;对透视没信心，可以网上找一些参考图叠放在后面做参考&lt;/p&gt;
&lt;p&gt;调⼀条轴时，另⼀条轴的状态要在正中间（就是初始状态），不然之后可能会重做&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;记得打关键帧&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;身体&#34;&gt;身体&lt;/h4&gt;
&lt;p&gt;⾝体的旋转变形器中⼼要放在腰上（按ctrl改）
然后在做⾝体Z轴时，外⾯建多⼀层⼀个曲⾯变形器，来做⾝体旋转时⾐服不⾃然的地⽅
最后，是⾝体跟头部的旋转其实是做相同⽅向绑定的，所以在调整时，可以把头部调到相应的⽅向再做调整&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;物理效果&#34;&gt;物理效果&lt;/h2&gt;
&lt;p&gt;此处直接引用&lt;a href=&#34;https://www.bilibili.com/video/BV1PA411i7f3/?spm_id_from=333.1007.top_right_bar_window_history.content.click&amp;amp;vd_source=c5ccffd7970c0f321a37c787c3da4b8d&#34;&gt;教程&lt;/a&gt;，讲的很清楚&lt;/p&gt;
&lt;p&gt;下面引用的是&lt;a href=&#34;https://www.bilibili.com/opus/744981271905566787?spm_id_from=333.1387.0.0&#34;&gt;小小巡山的总结&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;P5&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/b57cb123393b921f94635a8416d3f358c91f0ae2.png&#34; alt=&#34;Image&#34;&gt;
来模拟做一个头发（前额发）跟随头动产生的物理：&lt;/p&gt;
&lt;p&gt;1.新建摇动变形器&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/add551b9cfa7d741804aff3d69fd709235ec79a1.jpg&#34; alt=&#34;Image&#34;&gt;
2绑定参数&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/5408ce569f6b73c4d9ff8592e85c3b3c49413f41.png&#34; alt=&#34;Image&#34;&gt;
3可以增加按下面的按钮增加想要的参数&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/8c6d90aa52722eae61ade2d4fa9172bb698034f6.jpg&#34; alt=&#34;Image&#34;&gt;
4调整名称和参数&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/5de9634605a92586c1bb5cd988865437977a05cc.png&#34; alt=&#34;Image&#34;&gt;
5做好参数后，调出&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/a70164824557f771550b256a619eb0ad452e3944.png&#34; alt=&#34;Image&#34;&gt;
6追加组&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/fee31f9278113ecd59e719b203ed540508787755.jpg&#34; alt=&#34;Image&#34;&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/6feaebfd32e20e1913e484773b48d105eca9fead.png&#34; alt=&#34;Image&#34;&gt;
**5，物理 P5 - 01:05&lt;/p&gt;
&lt;p&gt;接下来先介绍下摆锤&lt;/p&gt;
&lt;p&gt;7添加摆锤节数&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/bb9e4c8711e60d86d2c8131ea94e1329c608680f.png&#34; alt=&#34;Image&#34;&gt;
这里听讲解吧&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/59f6707086469fd7bbac9e2d725f0312adcbce76.png&#34; alt=&#34;Image&#34;&gt;
**5，物理 P5 - 01:39&lt;/p&gt;
&lt;p&gt;然后介绍物理系统的输入和输出&lt;/p&gt;
&lt;p&gt;输入系统&lt;/p&gt;
&lt;p&gt;**5，物理 P5 - 02:25&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/eeab44cd5fdb453ec53fe6c5123fd2ff36ef9660.png&#34; alt=&#34;Image&#34;&gt;
8这里介绍下我们要输入的物理动力的来源（头的摆动，输入角度X，和角度Z）&lt;/p&gt;
&lt;p&gt;这里的类型（位置X和角度）是指对摆锤的影响&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/f4f04354273287f82f3ad7a98e65eaa2d92d6d79.png&#34; alt=&#34;Image&#34;&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/ce257fa797ebe4a4007e9822dc74f0213ce5bc4d.png&#34; alt=&#34;Image&#34;&gt;
设置成位置X时，摆锤上方的点在X轴的位置，&lt;/p&gt;
&lt;p&gt;这样摆动幅度大，最后会恢复状态（感觉转动时的跟随？？）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/67b86568f719d8bbbd1af4d9f3940fc3395f3f97.png&#34; alt=&#34;Image&#34;&gt;
设置成角度时，则影响摆锤处坐标轴的变化&lt;/p&gt;
&lt;p&gt;这样摆动幅度小，最后不会回到原位（感觉像重力？？）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/41ea3e70d1f69eecc4c0085609c1e7421dd592a5.png&#34; alt=&#34;Image&#34;&gt;
输入物理动力的多个参数可以组合起来，控制一个摆锤时使用&lt;/p&gt;
&lt;p&gt;影响度不一样动起来才自然&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/4ed82c77c5ad434c0cb93e32cde4273f6897c0c7.png&#34; alt=&#34;Image&#34;&gt;
9然后输出&lt;/p&gt;
&lt;p&gt;追加我们要的输出素材&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/fe7de354c1e8b7a5a484da5ae960eaf2b951219a.png&#34; alt=&#34;Image&#34;&gt;
可以改是哪一节，是摆锤数指第几节&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/f3360f4d6054d35909d192211f7ea6a1d74ea562.png&#34; alt=&#34;Image&#34;&gt;
**5，物理 P5 - 03:44&lt;/p&gt;
&lt;p&gt;10如何让头发运动更自然&lt;/p&gt;
&lt;p&gt;**5，物理 P5 - 04:28&lt;/p&gt;
&lt;p&gt;蒙皮：&lt;/p&gt;
&lt;p&gt;用曲线工具给头发图层加一条控制线&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/6adfc6c666e23e8f53fd9522ed7fb6ddc3ccc7f0.png&#34; alt=&#34;Image&#34;&gt;
12然后蒙皮&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/6f373b44e13e166b77444e98842fa57b6a86d621.png&#34; alt=&#34;Image&#34;&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/a464f388afab6cd79c0257725166f85958340ed9.png&#34; alt=&#34;Image&#34;&gt;
13重新打开：&lt;/p&gt;
&lt;p&gt;建模—物理场景混合面板&lt;/p&gt;
&lt;p&gt;14追加摆锤&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/da9263fd56fd8a441b9dc465d247da45555c758d.png&#34; alt=&#34;Image&#34;&gt;
15在输出追加&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/f9e3d0e3b79241f2fbd373eb799e11a6545fdbc9.png&#34; alt=&#34;Image&#34;&gt;
16勾选&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/981cd1fd13fb21034e684436c9a338bddcafa729.png&#34; alt=&#34;Image&#34;&gt;
17调整影响度&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/57eeecff16a7b62472b2470fa2410d2d29f1a51f.png&#34; alt=&#34;Image&#34;&gt;
就可以模拟多段的摆动啦&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/914f0782be4529387847673faaddeb1051f0e70a.png&#34; alt=&#34;Image&#34;&gt;
小技巧：&lt;/p&gt;
&lt;p&gt;把物理分为&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/51f70718f5c5619c7361ac588ad434cf2ba72a4b.png&#34; alt=&#34;Image&#34;&gt;
惯性：角度X影响的左右摆动，用物理系统做&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/f01674eb3d22ef0db21ed966866b13bd101c38a6.png&#34; alt=&#34;Image&#34;&gt;
重力：新建一个重力变形器，绑定角度Z轴进行调整&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/d1293772ed16496da7aff0913e6c083c40ae83b9.jpg&#34; alt=&#34;Image&#34;&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/7ea5c4b6fa9856446767f6d606c3ad2044b17a2b.png&#34; alt=&#34;Image&#34;&gt;
**5，物理 P5 - 05:03&lt;/p&gt;
&lt;p&gt;变形器的顺序：从外到内是&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/live2d/7843bcbeebc6d743b6663b6d0fa674550ca8627a.png&#34; alt=&#34;Image&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;导出&#34;&gt;导出&lt;/h2&gt;
&lt;p&gt;导出具体观看的是这个&lt;a href=&#34;https://www.bilibili.com/video/BV1Km421j7tM/?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=c5ccffd7970c0f321a37c787c3da4b8d&#34;&gt;教程&lt;/a&gt;，讲的 听清楚的&lt;/p&gt;
&lt;h3 id=&#34;纹理集&#34;&gt;纹理集&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;导出前必须点击“编辑纹理图集”，将所有部件排列在正方形画布内（通常为 2048x2048 或 4096x4096px）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;文件清点&#34;&gt;文件清点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模型文件：&lt;/strong&gt; .moc3（核心数据）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;导入vtube-studio调整细节参数&#34;&gt;导入VTube Studio，调整细节参数&lt;/h2&gt;
&lt;p&gt;观看的是这个&lt;a href=&#34;https://www.bilibili.com/video/BV1sE421M7PB?spm_id_from=333.788.videopod.sections&amp;amp;vd_source=c5ccffd7970c0f321a37c787c3da4b8d&#34;&gt;教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;软件是免费的，在steam可以下载&lt;/p&gt;
&lt;h4 id=&#34;踩坑点-2&#34;&gt;踩坑点&lt;/h4&gt;
&lt;p&gt;VTube一直识别不出我的模型，应该是导出过程抽风了导致文件损坏吧，最后导出了三遍后重启电脑重新导出成功了（）&lt;/p&gt;
&lt;p&gt;另外，用ipad驾驶模型会明显精细度更好，但是导入ipad中也是困难重重，因为苹果这该死的文件管理系统（怒）导入竟然又研究了我两小时&lt;/p&gt;
&lt;h2 id=&#34;在直播中使用&#34;&gt;在直播中使用&lt;/h2&gt;
&lt;p&gt;同样也是这个&lt;a href=&#34;https://www.bilibili.com/video/BV1sE421M7PB?spm_id_from=333.788.videopod.sections&amp;amp;vd_source=c5ccffd7970c0f321a37c787c3da4b8d&#34;&gt;教程&lt;/a&gt;的末尾有讲，有不明白的可以去额外搜索一些教程&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>VScode设置图片粘贴路径</title>
      <link>https://cloudymount789.github.io/blog/vscode_paste_image_setting/</link>
      <pubDate>Wed, 08 Apr 2026 19:49:56 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/vscode_paste_image_setting/</guid>
      <description>&lt;p&gt;本文针对 Markdown 写作中静态资源管理的碎片化痛点，提供了 VS Code 自动化图床化配置方案，有效解决了默认路径混乱与同名覆盖风险，是构建结构化博客文档流的硬核提效手段。&lt;/p&gt;
&lt;h2 id=&#34;vscode中如何配置粘贴入的图像的默认位置&#34;&gt;VScode中如何配置粘贴入的图像的默认位置&lt;/h2&gt;
&lt;h3 id=&#34;需求由来&#34;&gt;需求由来&lt;/h3&gt;
&lt;p&gt;因为在写博客的时候需要大量插入图片&lt;/p&gt;
&lt;p&gt;默认的图片插在同目录下，直接命名为image-?，它会在md文件中命名为&lt;code&gt;[!alt](image-?.png)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;但是因为我的博客的文件目录管理是统一将图片放在images里的，所以需要加一个前缀./images/&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;方法&#34;&gt;方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ctrl + ,&lt;/code&gt;打开设置&lt;/li&gt;
&lt;li&gt;搜索&lt;code&gt;markdown.copyFiles.destination&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;添加键值对：键&lt;code&gt;**/*.md&lt;/code&gt;（匹配所有.md文件，对所有markdown生效），值&lt;code&gt;${documentDirName}/images/image-${unixTime}.${fileExtName}&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注：unixtime:毫秒级时间戳，防止重名&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>VScode多文件编译方法</title>
      <link>https://cloudymount789.github.io/blog/vscode_multiple_files_compile/</link>
      <pubDate>Wed, 08 Apr 2026 19:49:33 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/vscode_multiple_files_compile/</guid>
      <description>&lt;p&gt;本文针对 VS Code 环境下 C++ 多文件编译报错的痛点，提供了两种维度的硬核解决方案：一是通过魔改 &lt;code&gt;tasks.json&lt;/code&gt; 中的 &lt;code&gt;args&lt;/code&gt; 参数，将单一文件编译重定向为路径通配符编译；二是引入 &lt;code&gt;CMake Tools&lt;/code&gt; 扩展，利用 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 构建工程化的声明式编译流，旨在帮助开发者实现多模块代码的顺畅协同。&lt;/p&gt;
&lt;h2 id=&#34;vscode-多文件编译解决方法&#34;&gt;VScode 多文件编译解决方法&lt;/h2&gt;
&lt;h3 id=&#34;way-1-修改config文件&#34;&gt;way 1 修改config文件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;按下 &lt;code&gt;Ctrl + Shift + P&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输入 &lt;code&gt;Tasks: Configure Task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选择 &lt;code&gt;g++.exe build active file&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;这会自动生成或打开 &lt;code&gt;.vscode/tasks.json&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;找到 &lt;code&gt;args&lt;/code&gt;（参数）数组&lt;/li&gt;
&lt;li&gt;把 &lt;code&gt;&amp;quot;${file}&amp;quot;&lt;/code&gt; 修改为 &lt;code&gt;&amp;quot;${fileDirname}\\*.cpp&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;原理：改为多文件编译&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;way-2-使用cmake扩展&#34;&gt;way 2 使用cmake扩展&lt;/h3&gt;
&lt;p&gt;对于大型项目或需要跨平台的开发需求，使用 &lt;strong&gt;CMake&lt;/strong&gt; 是更硬核且通用的选择。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安装插件&lt;/strong&gt;：在 VS Code 扩展市场搜索并安装 &lt;code&gt;CMake Tools&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建 CMakeLists.txt&lt;/strong&gt;：在项目根目录下新建该文件，写入基础配置：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmake&#34; data-lang=&#34;cmake&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmake_minimum_required(&lt;span style=&#34;color:#e6db74&#34;&gt;VERSION&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;3.10&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;project(&lt;span style=&#34;color:#e6db74&#34;&gt;MyProject&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 自动搜集目录下所有源文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;aux_source_directory(&lt;span style=&#34;color:#e6db74&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;DIR_SRCS&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;add_executable(&lt;span style=&#34;color:#e6db74&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;${&lt;/span&gt;DIR_SRCS&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建与运行&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;点击底部状态栏的 &lt;strong&gt;Build&lt;/strong&gt; 进行编译。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;三角形图标 (Run)&lt;/strong&gt; 或 &lt;strong&gt;小虫子图标 (Debug)&lt;/strong&gt; 即可运行或调试。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：无需手动修改 JSON 配置文件，支持复杂的库依赖管理。&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    
    <item>
      <title>linux入门/快速上手命令行</title>
      <link>https://cloudymount789.github.io/blog/bash_note/</link>
      <pubDate>Wed, 08 Apr 2026 19:39:42 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/bash_note/</guid>
      <description>&lt;p&gt;本文是我自用总结的常用的 Bash 命令行技巧，旨在帮助新手快速上手终端的使用，离一名帅气的极客更进一步。内容涵盖基础路径跳转与增删改查,系统与网络监控, 高效进阶技巧, 开发工具联动等，适合linux新手入门，大部分同时也可用于windows系统的windows powershell。&lt;/p&gt;
&lt;h1 id=&#34;bash命令行编程&#34;&gt;Bash命令行编程&lt;/h1&gt;
&lt;h2 id=&#34;文件夹跳转&#34;&gt;文件夹跳转&lt;/h2&gt;
&lt;h3 id=&#34;1-看当前所在位置&#34;&gt;1. 看当前所在位置&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（Windows是cd，Linux是pwd看路径）&lt;/p&gt;
&lt;h3 id=&#34;2-进入文件夹&#34;&gt;2. 进入文件夹&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd 文件夹名
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 举例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd Desktop
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /home/用户名   &lt;span style=&#34;color:#75715e&#34;&gt;# 绝对路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-返回上一级&#34;&gt;3. 返回上一级&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;4-直接回自己家目录主页&#34;&gt;4. 直接回自己家目录（主页）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;5-回到上一次所在文件夹&#34;&gt;5. 回到上一次所在文件夹&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;二查看文件列表&#34;&gt;二、查看文件/列表&lt;/h2&gt;
&lt;h3 id=&#34;1-列出当前所有文件文件夹&#34;&gt;1. 列出当前所有文件、文件夹&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls          &lt;span style=&#34;color:#75715e&#34;&gt;# 简单列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -l       &lt;span style=&#34;color:#75715e&#34;&gt;# 详细信息（权限、大小、时间）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -a       &lt;span style=&#34;color:#75715e&#34;&gt;# 显示隐藏文件（带 . 的文件）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la      &lt;span style=&#34;color:#75715e&#34;&gt;# 详细+隐藏，最常用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;三新建--删除--复制谨慎删&#34;&gt;三、新建 &amp;amp; 删除 &amp;amp; 复制（谨慎删！）&lt;/h2&gt;
&lt;h3 id=&#34;1-建文件夹&#34;&gt;1. 建文件夹&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir 文件夹名
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-建空文件&#34;&gt;2. 建空文件&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;touch 文件名.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;touch note.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim 文件名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-复制&#34;&gt;3. 复制&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp 源文件 目标
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp note.txt /home/备份/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -r 文件夹A 文件夹B   &lt;span style=&#34;color:#75715e&#34;&gt;# 复制整个文件夹&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;4-移动重命名&#34;&gt;4. 移动/重命名&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv 旧名字 新名字       &lt;span style=&#34;color:#75715e&#34;&gt;# 重命名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv 文件 /目标路径/     &lt;span style=&#34;color:#75715e&#34;&gt;# 移动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;5-删除--linux删了很难找回&#34;&gt;5. 删除（⚠️  Linux删了很难找回！）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm 文件名.txt          &lt;span style=&#34;color:#75715e&#34;&gt;# 删文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -r 文件夹名         &lt;span style=&#34;color:#75715e&#34;&gt;# 删文件夹+里面所有&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf 文件夹名        &lt;span style=&#34;color:#75715e&#34;&gt;# 强制彻底删除（慎用！）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;四查看文件内容&#34;&gt;四、查看文件内容&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat 文件名.txt        &lt;span style=&#34;color:#75715e&#34;&gt;# 直接全打印&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;less 文件名.txt       &lt;span style=&#34;color:#75715e&#34;&gt;# 分页看（上下翻）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;head 文件名.txt       &lt;span style=&#34;color:#75715e&#34;&gt;# 看开头几行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tail 文件名.txt       &lt;span style=&#34;color:#75715e&#34;&gt;# 看结尾几行（看日志神器）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tail -f 日志.log      &lt;span style=&#34;color:#75715e&#34;&gt;# 实时刷新日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;五系统--网络常用&#34;&gt;五、系统 &amp;amp; 网络常用&lt;/h2&gt;
&lt;h3 id=&#34;1-看ip&#34;&gt;1. 看IP&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ifconfig
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 新版也用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-测试网络通不通&#34;&gt;2. 测试网络通不通&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ping www.baidu.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-看当前正在运行的程序&#34;&gt;3. 看当前正在运行的程序&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps aux
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;top        &lt;span style=&#34;color:#75715e&#34;&gt;# 实时看进程、占用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;4-清屏&#34;&gt;4. 清屏&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clear
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;六解压压缩&#34;&gt;六、解压/压缩&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 解压 zip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unzip 压缩包.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 解压 tar.gz（Linux标配）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -zxvf 压缩包.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 压缩成 tar.gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -zcvf 打包名.tar.gz 要打包的文件夹
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;七实用快捷键&#34;&gt;七、实用快捷键&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Tab&lt;/code&gt;：自动补全文件名/命令，救命神器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;↑ ↓&lt;/code&gt;：调出之前输过的命令&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Ctrl + L&lt;/code&gt;：快速清屏（等于clear）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Ctrl + C&lt;/code&gt;：强制停止当前运行的程序&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vim ...&lt;/code&gt; 启动vim编辑器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;code .&lt;/code&gt;在当前工作区打开vscode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;·&lt;code&gt;Ctrl + Shift + E&lt;/code&gt;：聚焦到左侧文件资源管理器（用上下键选文件）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Ctrl + P&lt;/code&gt;：快速搜索文件（输入文件名直接跳转，不需要去文件夹里翻）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;任意位置&lt;code&gt;win + x + i&lt;/code&gt; -&amp;gt; 唤起终端(我已配置默认目录为D盘)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这份 Bash 命令行笔记已经非常扎实，涵盖了最常用的基础操作。为了让它更完整、更符合“从入门到进阶”的逻辑，我为你补充了&lt;strong&gt;文件搜索&lt;/strong&gt;、&lt;strong&gt;权限管理&lt;/strong&gt;、&lt;strong&gt;管道与重定向&lt;/strong&gt;这三个核心板块，并提供了一个适合博客首页的 &lt;strong&gt;Summary&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;八查找与搜索&#34;&gt;八、查找与搜索&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. 在当前目录及子目录下查找文件名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find . -name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 在文件中搜索特定文本内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt; server.log        &lt;span style=&#34;color:#75715e&#34;&gt;# 在 log 中找包含 error 的行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt; server.log     &lt;span style=&#34;color:#75715e&#34;&gt;# 忽略大小写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -r &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;function&amp;#34;&lt;/span&gt; ./src       &lt;span style=&#34;color:#75715e&#34;&gt;# 在文件夹内递归搜索&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3. 查找命令的可执行文件路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;which python
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;九权限管理遇到-permission-denied-时看这里&#34;&gt;九、权限管理（遇到 Permission Denied 时看这里）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. 修改文件权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;755&lt;/span&gt; script.sh      &lt;span style=&#34;color:#75715e&#34;&gt;# 赋予执行权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x script.sh       &lt;span style=&#34;color:#75715e&#34;&gt;# 简单直接地赋予执行权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 临时提升为管理员权限执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update          &lt;span style=&#34;color:#75715e&#34;&gt;# 以 root 权限运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3. 修改文件所属用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chown user:group file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;十管道与重定向将命令组合起来&#34;&gt;十、管道与重定向（将命令组合起来）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. 重定向：将结果保存到文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls &amp;gt; files.txt           &lt;span style=&#34;color:#75715e&#34;&gt;# 覆盖写入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls &amp;gt;&amp;gt; files.txt          &lt;span style=&#34;color:#75715e&#34;&gt;# 追加写入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2. 管道符 | ：把前一个命令的结果交给下一个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps aux | grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;python&amp;#34;&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;# 在所有进程中过滤出包含 python 的行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat log.txt | wc -l      &lt;span style=&#34;color:#75715e&#34;&gt;# 统计 log 文件有多少行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>AI 驱动的技术书“脱水”学习流分享</title>
      <link>https://cloudymount789.github.io/blog/ai-fast-book-learning-workflow/</link>
      <pubDate>Tue, 07 Apr 2026 23:04:24 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/ai-fast-book-learning-workflow/</guid>
      <description>&lt;p&gt;别再死磕技术书全文了。这套流派的核心是 &lt;strong&gt;“先搭骨架，后填血肉”&lt;/strong&gt;：利用 AI 将原书强行拆解为知识切片、讲义正文和动态验收题，构建一个结构化的 e-book 知识库。引入 &lt;strong&gt;“零基础可读性自检”&lt;/strong&gt; ，通过规约强制 AI 有计划的输出带有直觉解释、边界说明和逻辑自洽的干货讲义。这不仅是一套 Prompt 技巧，更是一次对传统阅读习惯的底层重构，让 AI 真正承担起知识压缩与逻辑重组的任务。&lt;/p&gt;
&lt;h1 id=&#34;如何用ai做技术书籍速读学习&#34;&gt;如何用AI做技术书籍速读学习&lt;/h1&gt;
&lt;h2 id=&#34;你会得到什么&#34;&gt;你会得到什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一套快速落地的技术书学习流程，再也不用“硬啃全文”。&lt;/li&gt;
&lt;li&gt;一套“讲义优先”的产出结构：读完就能复习、能自测、能复用。&lt;/li&gt;
&lt;li&gt;一套质量控制机制：防止 AI 只会“总结漂亮话”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适用对象：要快速掌握一本技术书主线、但不想陷入低效摘抄的人。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一核心原则先搭框架再填细节&#34;&gt;一、核心原则：先搭框架，再填细节&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;我的思路是: 先规范好ai需要做什么，将需要做的事情拆分为很多个子任务，每一步做好规定好的事：
下面的思路可供参考：&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;&lt;strong&gt;想清楚整体学习工作流&lt;/strong&gt;  (做一个大致的plan，和ai制定&lt;a href=&#34;https://cloudymount789.github.io/blog/ai-fast-book-learning-workflow/#%e4%ba%94%e5%8f%82%e8%80%83%e8%a7%84%e7%ba%a6&#34;&gt;规约&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抽取全书结构&lt;/strong&gt;（目录级、章节级、小节级）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再做知识切片&lt;/strong&gt;（按小标题拆成可讲单元）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再写讲义正文&lt;/strong&gt;（不是模板笔记）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后做验收题&lt;/strong&gt;（按当天学到的内容动态生成）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;先有地图，再走路&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二目录结构&#34;&gt;二、目录结构&lt;/h2&gt;
&lt;p&gt;建议用下面这套结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─ lectures/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│  ├─ 00-overall-5day-plan.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│  └─ day?-???.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─ hangouts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│  ├─ 00-overview.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│  └─ day?-???.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└─ knowledge-slices/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ├─ ch01-...-slices.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ├─ ch02-...-slices.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   └─ ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;职责分工：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;knowledge-slices/&lt;/code&gt;：知识切片底稿（按原书小节）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hangouts/&lt;/code&gt;：讲义正文（真正学习材料）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lectures/&lt;/code&gt;：学习安排 + 验收题 + 参考答案&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三质量闸门零基础可读性检查&#34;&gt;三、质量闸门：零基础可读性检查&lt;/h2&gt;
&lt;p&gt;这是整套流程中最值钱的一步。&lt;/p&gt;
&lt;p&gt;每次讲义生成后，强制跑一遍检查：&lt;/p&gt;
&lt;p&gt;这份根据原文提取出的脱水讲义是否逻辑自洽？&lt;/p&gt;
&lt;p&gt;即作为一名什么都不知道的小白，我能不能通过这篇讲义弄懂这个知识点？&lt;/p&gt;
&lt;p&gt;可以检查以下几点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这一段是否先解释术语，再讲结论？&lt;/li&gt;
&lt;li&gt;是否默认读者已经懂前置概念（但文中没解释）？&lt;/li&gt;
&lt;li&gt;不查外部资料，能否理解这段主旨？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例（错误写法）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“词袋模型优点是简单，缺点是忽略上下文。”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例（可读写法）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“词袋模型是把文本当作‘词频统计表’，只看词出现次数，不看顺序。&lt;br&gt;
因此它快、好实现，但像‘我喜欢你/你喜欢我’这类句子会被误判为很像，语义区分能力有限。”&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四建议学习步骤&#34;&gt;四、建议学习步骤&lt;/h2&gt;
&lt;p&gt;可以固定学习步骤和节奏，便于更加科学的学习&lt;/p&gt;
&lt;p&gt;但是不要精确到分钟，保持灵活的时间安排&lt;/p&gt;
&lt;p&gt;以下是我的学习步骤：&lt;/p&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;复习昨天的学习内容
&lt;ul&gt;
&lt;li&gt;只需要大概看一遍&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;阅读slice
&lt;ul&gt;
&lt;li&gt;形成一个大概的印象&lt;/li&gt;
&lt;li&gt;明确要掌握那些概念&lt;/li&gt;
&lt;li&gt;便于后续脑中建模知识点的联系&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;阅读lecture
&lt;ul&gt;
&lt;li&gt;了解学习重点，防止阅读时死扣没那么重要的细节&lt;/li&gt;
&lt;li&gt;有的内容读到后面和后面的东西联系起来自然就懂了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;阅读hangout
&lt;ul&gt;
&lt;li&gt;期间有不懂的直接新建对话问ai&lt;/li&gt;
&lt;li&gt;并对hangout(现在是你的note)进行补充&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;复盘（很重要）
&lt;ul&gt;
&lt;li&gt;并在脑中建模知识点间的联系&lt;/li&gt;
&lt;li&gt;为什么要引入这个概念？我学到了什么？有哪些思想可以复用？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;完成课后习题，进行查漏补缺
&lt;ul&gt;
&lt;li&gt;不懂的继续实时做笔记&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五参考规约&#34;&gt;五、参考规约&lt;/h2&gt;
&lt;p&gt;下面贴出我的参考规约&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# 《图解大模型》学习总体规约
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 规约定位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;这是后续生成高质量讲义的总控文档。核心目标是：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 严格对齐原书知识范围（第1-12章 + DeepSeek-R1附录）；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 先把知识点切分清楚，再生成易懂讲义；
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 每天的验收提问完全根据当天实际学习内容动态调整，文末给参考答案。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 不要死板于制定优美的计划，应该更专注于知识点本身的提取和学习的质量，深耕hangout文档的生成
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 学习目标
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 所有内容以 &lt;span style=&#34;color:#e6db74&#34;&gt;`e-book.pdf`&lt;/span&gt; 为唯一知识源，禁止编造书外关键结论。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 讲义按原书章节和小标题组织，尽可能覆盖原书知识点。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 讲义正文必须可直接学习，不使用同质化空模板。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 每天验收题只围绕当天学过的小节，文末提供可核对的参考答案。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 目标是快速概览与建立框架，不追求一次性吃透全部推导细节。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 便于用户少做重复整理工作，ai负责把内容压缩成可读、可学、可复习的讲义正文。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 讲义质量优先于流程形式：强调概念清晰、边界清晰、应用场景清晰。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 全书主线（与原书一致）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 第一部分：理解语言模型（第1-3章）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 第二部分：使用预训练语言模型（第4-9章）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 第三部分：训练和微调语言模型（第10-12章）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 附录：图解 DeepSeek-R1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 5天学习主线（保持高密度但不僵化）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Day 1：第1-3章（基础概念、分词嵌入、Transformer内部机制）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Day 2：第4-6章（文本分类、聚类主题、提示工程）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Day 3：第7-9章（链路与记忆、Agent、RAG、多模态）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Day 4：第10-11章（嵌入模型构建、表示模型微调）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Day 5：第12章 + 附录（生成模型微调、偏好优化、DeepSeek-R1）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 文件职责
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`knowledge-slices/`&lt;/span&gt;：按章节沉淀知识点切片，作为讲义生成底稿。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`notes/`&lt;/span&gt;：每日讲义正文（学习材料本体）。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`lectures/`&lt;/span&gt;：每日安排、验收题、参考答案、复盘。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 讲义撰写标准
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 结构：按知识点切片展开。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 允许结构化重写与通俗化解释，但必须保留原书知识逻辑。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 风格：优先用直觉解释复杂概念，必要时再补技术术语。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 目标：读完即可复述主线，遇到任务能做初步方法选型。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 零基础可读性检查
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 每次生成讲义后，都要用“完全零基础学习者”视角自检一次。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 自检问题可以包括：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 这一段是否先解释了术语本身，再讲优缺点或结论？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 有没有默认读者已知前置概念（如 BoW、token、embedding）却未解释？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 读者是否能在不查外部资料的情况下理解本段主旨？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 若答案是否定，则立即补充相关解释，如：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 一句话定义（这是什么）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 一个直觉例子（像什么）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 一句边界说明（它不能做什么）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 允许 AI 在不偏离原书事实的前提下补充通俗化解释，优先保证“读得懂”。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 执行顺序
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;1.&lt;/span&gt; 先维护 &lt;span style=&#34;color:#e6db74&#34;&gt;`knowledge-slices/`&lt;/span&gt; 的章节切片。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;2.&lt;/span&gt; 基于切片生成当日讲义正文到 &lt;span style=&#34;color:#e6db74&#34;&gt;`notes/`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;3.&lt;/span&gt; 基于当日讲义生成验收题到 &lt;span style=&#34;color:#e6db74&#34;&gt;`lectures/`&lt;/span&gt;，文末附答案。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;4.&lt;/span&gt; 生成当日复盘（高频误区 + 第二天预热）。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 完成标准
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 全书已有章节级知识切片。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 每天有可直接学习的讲义正文。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 每天有与内容强绑定的验收题与答案。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>powertoys快速上手/windoews开发人员手册/辅助讲解工具zoomlt</title>
      <link>https://cloudymount789.github.io/blog/powertoys_note/</link>
      <pubDate>Mon, 06 Apr 2026 11:17:15 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/powertoys_note/</guid>
      <description>&lt;p&gt;本文精炼了 PowerToys 与 ZoomIt 两大极客工具的好用指令集，涵盖窗口常驻、全局 OCR 提取、像素级取色以及演示级的屏幕缩放与动态标注技巧。通过映射核心快捷键位，实现对系统底层交互逻辑的深度重塑，旨在打造一套极简、高效的 Windows 开发者工作流。&lt;/p&gt;
&lt;h2 id=&#34;windows开发人员工具手册&#34;&gt;windows开发人员工具手册&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;用来装逼&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/microsoft/PowerToys/releases&#34;&gt;安装powertools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://learn.microsoft.com/zh-cn/windows/powertoys/&#34;&gt;windows开发人员工具手册&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;我整理出的实用工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ctrl + win + t&lt;/code&gt;可以固定或取消固定所选窗口，使其始终位于所有其他窗口的顶部，哪怕焦点丢失&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl + win + c&lt;/code&gt;可以打开颜色选择器，在任何应用程序中选取颜色并复制可配置文件到剪贴板&lt;/li&gt;
&lt;li&gt;&lt;code&gt;win + shift + t&lt;/code&gt;可以打开文本提取器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;win + shift + /&lt;/code&gt;可以打开快捷键指南&lt;/li&gt;
&lt;li&gt;两次&lt;code&gt;ctrl&lt;/code&gt;寻找鼠标&lt;/li&gt;
&lt;li&gt;&lt;code&gt;win + shift + h&lt;/code&gt;鼠标荧光笔&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;zoomlt&#34;&gt;zoomlt&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ctrl + 1&lt;/code&gt; 激活缩放：按鼠标滚轮或向上/向下箭头键放大或缩小。 按 Esc 或鼠标右键退出缩放模式。 按 Ctrl + C 捕获缩放视图，按 Ctrl + S 保存它。 按 Ctrl + Shift 在复制或保存之前裁剪。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ctrl + 4&lt;/code&gt; 激活实时缩放:按 Ctrl + Shift + 4 激活实时绘图，按 Esc 清除批注或退出。
按Ctrl + 向上/向下调整缩放级别。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ctrl +２&lt;/code&gt;屏幕绘制：
放大时，按鼠标左键切换绘图模式，按鼠标右键退出。 按 Ctrl + Z 撤消，按 E 清除绘图，按空格键使光标居中。
笔控制 按 Ctrl + 鼠标滚轮 或 Ctrl + 向上/向下调整笔宽度。
颜色 按 R(红色)、G(绿色)、B(蓝色)、O(橙色)、Y(黄色)或 P(粉色)切换颜色。
高亮和模糊 按 Shift + 颜色键表示半透明高亮，按 X 表示模糊，按 Shift + X 表示更强的模糊。
形状 按 Shift 表示线，按 Ctrl 表示矩形，按 Tab 表示椭圆形，按 Shift + Ctrl 表示箭头。
屏幕 按 W 或 K 表示白色或黑色素描本。 按 Ctrl + C 复制，按 Ctrl + S 保存，按 Ctrl + Shift 裁剪。
按t进入文本编辑&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Claude Code 终端集成与 API 中转避坑</title>
      <link>https://cloudymount789.github.io/blog/claude_deploy/</link>
      <pubDate>Sat, 04 Apr 2026 17:00:04 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/claude_deploy/</guid>
      <description>&lt;p&gt;本文深度还原了在 Windows 环境下部署 Claude Code 终端工具的实战历程，针对初次配置中常见的环境变量冲突、网络受限及 API 连通性等痛点提供了硬核解决方案。文章总结了通过第三方中转站绕过地理限制、优化模型路由分组以及利用脚本跳过冗长初始化流程的进阶调优经验，旨在帮助开发者快速打通 Claude 与本地终端的交互链路，构建高效的命令行 AI 开发环境。&lt;/p&gt;
&lt;h1 id=&#34;claude-code-安装与配置&#34;&gt;Claude Code 安装与配置&lt;/h1&gt;
&lt;p&gt;找了好几个教程，历经艰难险阻终于装上了，，，
但是发现费用不菲啊，，，&lt;/p&gt;
&lt;h3 id=&#34;教程&#34;&gt;教程&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/weixin_46211269/article/details/157613957&#34;&gt;好不容易找到的可以用的教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;跟着几个不同的教程做都失败了，，一直在解决各式各样的报错
我有统计工作时长的习惯，花了我5个小时wc（泪）&lt;/p&gt;
&lt;p&gt;###　更换不同api中转站配置&lt;/p&gt;
&lt;p&gt;最后总结出来的配置三件套(因为我一直换各个不同的api中转站hhh)&lt;/p&gt;
&lt;p&gt;（适用于windows powershell）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;修改环境变量（这个好像是单进程生效）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$env:ANTHROPIC_API_KEY = &amp;#34;your_api_key&amp;#34;
$env:ANTHROPIC_BASE_URL = &amp;#34;中转站网址，大部分情况是网址，一般中转站有文档会写出&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检查是否成功输入（不要多括号和引号什么的）&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo $env:ANTHROPIC_API_KEY

echo $env:ANTHROPIC_BASE_URL
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;notice: don&amp;rsquo;t use both api_key and token，他们本质上作用是一样的，因为我看了不同的教程用了不同的东西导致我两个都设置了，然后就报错了，，&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;改长期配置（其实我不知道这个必不必要，但是在解决报错的过程中ai叫我这么做hhh）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;notepad $PROFILE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;创建新的文件是正常现象，然后把上一步的两行环境变量粘进去&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;改~/.claude/setting.json&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;有的教程又叫我用config,,,乱七八糟的&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;粘贴一些基础配置（同样我也不知道必不必要hhh，ai说的）&lt;/p&gt;
&lt;p&gt;可以参考我的&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
&amp;#34;primaryModel&amp;#34;: &amp;#34;claude-sonnet-4-5-20250929&amp;#34;,
&amp;#34;apiBaseUrl&amp;#34;: &amp;#34;https://api.cphone.vip/&amp;#34;,
&amp;#34;env&amp;#34;: {
	&amp;#34;ANTHROPIC_BASE_URL&amp;#34;: &amp;#34;同上&amp;#34;,
	&amp;#34;ANTHROPIC_DEFAULT_HAIKU_MODEL&amp;#34;: &amp;#34;claude-sonnet-4-5-20250929&amp;#34;,
	&amp;#34;ANTHROPIC_DEFAULT_OPUS_MODEL&amp;#34;: &amp;#34;claude-sonnet-4-5-20250929&amp;#34;,
	&amp;#34;ANTHROPIC_DEFAULT_SONNET_MODEL&amp;#34;: &amp;#34;claude-sonnet-4-5-20250929&amp;#34;,
	&amp;#34;ANTHROPIC_MODEL&amp;#34;: &amp;#34;claude-sonnet-4-5-20250929&amp;#34;
	},
&amp;#34;preferences&amp;#34;: {
	&amp;#34;language&amp;#34;: &amp;#34;zh-CN&amp;#34;,
	&amp;#34;showCost&amp;#34;: true,
	&amp;#34;showTokenCount&amp;#34;: true,
	&amp;#34;autoComplete&amp;#34;: true
		},
	&amp;#34;hasCompletedOnboarding&amp;#34;: true
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在历经艰难险阻之后我的claude终于能在终端说话了/泪目&lt;/p&gt;
&lt;p&gt;###　修复错误的简单历程&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;似乎是没有成功设置url，claude一直走官网拉取，报网络问题：您所在国家不能使用，开代理也不行
就是这一步诞生了上面一堆修复的尝试hhh，但是其实都没奏效，
卡了很久之后选择换教程，换了两三个教程看找到了上面贴的那个教程，通过一个windows power shell脚本绕开了初始的新手教程，拉取和配置，终于成功连上了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;连上了之后开始报503错误：account not exist,问ai半天后选择去找客服，客服不理我&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尝试换api中转站，找到这篇&lt;a href=&#34;https://blog.csdn.net/Xulijun079/article/details/159020920&#34;&gt;博客&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;换了api易之后，进去是进去了，但是开始报model not support，换了几个分组都不行&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;上一个中转站客服终于理我了，说是那个分组的号最近被封的厉害让我换个分组，我照做终于好了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;补充：现在用的&lt;a href=&#34;https://api.cphone.vip/&#34;&gt;中转站&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;省钱tips&#34;&gt;省钱tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;多用 claude ignore：把不需要扫描的文件夹（如 node_modules, dist）排除掉，减少 Context 消耗。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;控制对话深度：定时输入 /clear 或者重新开启对话，防止上下文堆叠导致单次请求 Token 爆炸。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;别跟风加一堆rules，那些也烧token&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>vim配置分享/快速上手指南</title>
      <link>https://cloudymount789.github.io/blog/vim_note/</link>
      <pubDate>Sat, 04 Apr 2026 00:44:45 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/vim_note/</guid>
      <description>&lt;p&gt;本文将 Vim 视为一种高度可组合的“编程语言”，深度解析了“动词+名词”的核心交互逻辑与多模态操作架构。内容涵盖从基础位移到宏录制、修饰符等进阶技巧，并集成了 CapsLock 改键映射及 .vimrc 生产力配置实战。通过打通从终端到浏览器的全域 Vim 生态，旨在帮助开发者彻底摆脱鼠标依赖，重塑极致的文本编辑效率。&lt;/p&gt;
&lt;h1 id=&#34;vim-note&#34;&gt;Vim Note&lt;/h1&gt;
&lt;h2 id=&#34;学习目标&#34;&gt;学习目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;避免离开键盘热键，避免使用鼠标，提高开发效率&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;学习资源&#34;&gt;学习资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://missing-semester-cn.github.io/2020/editors/&#34;&gt;Missing Semester - 3. Vim 编辑器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;大佬们的学习笔记
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wsdjeg.net/vim-galore-zh-cn/&#34;&gt;Vim从入门到精通&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://imageslr.com/2021/vim.html&#34;&gt;【Linux】Vim 入门笔记&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;vim自带的vimtutor&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;配置&#34;&gt;配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;键位映射&lt;/li&gt;
&lt;li&gt;插件配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;特色&#34;&gt;特色&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多模态编辑器：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;ESC&amp;gt;正常模式：在文件中四处移动光标进行修改&lt;/li&gt;
&lt;li&gt;i 插入模式：插入文本&lt;/li&gt;
&lt;li&gt;r 替换模式：替换文本&lt;/li&gt;
&lt;li&gt;v 可视化模式（一般，V 行，&amp;lt;C-v&amp;gt;块）：选中文本块&lt;/li&gt;
&lt;li&gt;: 命令模式：用于执行命令&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vim的接口是一种编程语言&lt;/strong&gt;：
Vim 的接口本身也是一个程序语言：键入操作（以及其助记名） 是命令，这些命令也是可组合的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;基本操作&#34;&gt;基本操作&lt;/h2&gt;
&lt;h3 id=&#34;一缓存标签页窗口&#34;&gt;一、缓存，标签页，窗口&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vim 会维护一系列打开的文件，称为 &lt;strong&gt;“缓存”&lt;/strong&gt;。一个 Vim 会话包含一系列 &lt;strong&gt;标签页&lt;/strong&gt;，每个标签页包含 一系列  &lt;strong&gt;窗口&lt;/strong&gt;（分隔面板）。每个窗口显示一个缓存&lt;/li&gt;
&lt;li&gt;跟网页浏览器等其他你熟悉的程序不一样的是， 缓存和窗口不是一一对应的关系； &lt;strong&gt;窗口只是缓冲区的视图&lt;/strong&gt;。一个缓存可以在 多个 窗口打开，甚至在同一 个标签页内的多个窗口打开。这个功能其实很好用，比如可以 &lt;strong&gt;查看同一个文件的不同部分。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分屏：&lt;/strong&gt; &lt;code&gt;:sp&lt;/code&gt; (水平) | &lt;code&gt;:vsp&lt;/code&gt; (垂直)。&lt;strong&gt;窗口只是缓存的视图&lt;/strong&gt;，可同时查看同文件的不同部分。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;二命令行&#34;&gt;二、命令行&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:q&lt;/code&gt; 退出（关闭窗口）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:w&lt;/code&gt; 保存（写）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:wq&lt;/code&gt; 保存然后退出&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:e&lt;/code&gt; {文件名} 打开要编辑的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:ls&lt;/code&gt; 显示打开的缓存&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:help {标题}&lt;/code&gt; 打开帮助文档
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:help :w&lt;/code&gt; 打开 &lt;code&gt;:w&lt;/code&gt; 命令的帮助文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:help w&lt;/code&gt; 打开 &lt;code&gt;w&lt;/code&gt; 移动的帮助文档&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;三指令组成&#34;&gt;三、指令组成&lt;/h3&gt;
&lt;h4 id=&#34;1-名词---noun&#34;&gt;1. 名词 - Noun&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;尽量放弃方向键，使用 &lt;code&gt;hjkl&lt;/code&gt; 保持手指在主键区。&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基础：&lt;/strong&gt; &lt;code&gt;h&lt;/code&gt;(左) &lt;code&gt;j&lt;/code&gt;(下) &lt;code&gt;k&lt;/code&gt;(上) &lt;code&gt;l&lt;/code&gt;(右)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单词：&lt;/strong&gt; &lt;code&gt;w&lt;/code&gt; (下个词首) | &lt;code&gt;b&lt;/code&gt; (词初) | &lt;code&gt;e&lt;/code&gt; (词尾)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行内：&lt;/strong&gt; &lt;code&gt;0&lt;/code&gt; (绝对行初) | &lt;code&gt;^&lt;/code&gt; (第一个非空字符) | &lt;code&gt;$&lt;/code&gt; (行尾)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;垂直：&lt;/strong&gt; &lt;code&gt;gg&lt;/code&gt; (文件头) | &lt;code&gt;G&lt;/code&gt; (文件尾) | &lt;code&gt;{行数}G&lt;/code&gt; (跳至指定行)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查找：&lt;/strong&gt; &lt;code&gt;f{字符}&lt;/code&gt; (行内向前找字符) | &lt;code&gt;t{字符}&lt;/code&gt; (找字符前一个位置)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;搜索：&lt;/strong&gt; &lt;code&gt;/{正则表达式}&lt;/code&gt; (向下搜索) | &lt;code&gt;?&lt;/code&gt; (向上搜索) | &lt;code&gt;n&lt;/code&gt;/&lt;code&gt;N&lt;/code&gt; (跳至下/上一个匹配)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-动词---verb&#34;&gt;2. 动词 - Verb&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;i&lt;/code&gt; 进入插入模式 | &lt;code&gt;o&lt;/code&gt; / &lt;code&gt;O&lt;/code&gt; 在下方/上方新开一行并进入插入模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d{移动}&lt;/code&gt; &lt;strong&gt;删除&lt;/strong&gt;（如 &lt;code&gt;dw&lt;/code&gt; 删词, &lt;code&gt;d$&lt;/code&gt; 删至行尾）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c{移动}&lt;/code&gt; &lt;strong&gt;改变&lt;/strong&gt;（删除并进入插入模式，如 &lt;code&gt;cw&lt;/code&gt; 改写单词）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;y&lt;/code&gt; &lt;strong&gt;复制 (Yank)&lt;/strong&gt; | &lt;code&gt;p&lt;/code&gt; &lt;strong&gt;粘贴 (Paste)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;u&lt;/code&gt; 撤销 | &lt;code&gt;&amp;lt;C-r&amp;gt;&lt;/code&gt; 重做&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; 删除单个字符 | &lt;code&gt;s&lt;/code&gt; 替换单个字符&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在 Visual (可视) 模式下：选中一段文字后按 U，选中的内容会全部变大写。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;三-vim-编程语言&#34;&gt;三、 Vim 编程语言&lt;/h3&gt;
&lt;p&gt;Vim 的强大源于这个公式：&lt;strong&gt;&lt;code&gt;[数字] + [修饰符] + [动词] + [名词]&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;1-计数-count&#34;&gt;1. 计数 (Count)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;3w&lt;/code&gt; 向后移动 3 个单词。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5j&lt;/code&gt; 向下移动 5 行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;10dd&lt;/code&gt; 删除 10 行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-修饰符-modifiers&#34;&gt;2. 修饰符 (Modifiers)&lt;/h4&gt;
&lt;p&gt;用于定义操作范围：&lt;code&gt;i&lt;/code&gt; (inner - 内部) 或 &lt;code&gt;a&lt;/code&gt; (around - 周围)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ci(&lt;/code&gt; 改变当前括号 &lt;code&gt;()&lt;/code&gt; 内部的内容。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;di&amp;quot;&lt;/code&gt; 删除双引号内的字符串。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;da{&lt;/code&gt; 删除整个花括号块（含花括号本身）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-宏-macro&#34;&gt;3. 宏 (Macro)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宏录制：&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;q{a}&lt;/code&gt; 开始录制到寄存器 &lt;code&gt;a&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;执行一系列复杂操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q&lt;/code&gt; 停止录制。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@{a}&lt;/code&gt; 重放操作（配合数字如 &lt;code&gt;100@a&lt;/code&gt; 批量处理）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;四-个人配置与扩展&#34;&gt;四、 个人配置与扩展&lt;/h3&gt;
&lt;h4 id=&#34;1-配置文件-vimrc&#34;&gt;1. 配置文件 &lt;code&gt;.vimrc&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Vim 的灵魂在于自定义。&lt;/p&gt;
&lt;p&gt;可以说，一个好的配置决定了vim是古老编辑器还是现代实用工具（）&lt;/p&gt;
&lt;p&gt;建议手动维护，不要盲目复制他人配置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;必改映射：&lt;/strong&gt; 建议将 &lt;code&gt;&amp;lt;CapsLock&amp;gt;&lt;/code&gt; (大小写锁定) 映射为 &lt;code&gt;&amp;lt;ESC&amp;gt;&lt;/code&gt;，极大缓解手指压力。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（后文附修改方法）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心插件推荐：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ctrlp.vim&lt;/code&gt;：模糊搜索文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NERDTree&lt;/code&gt;：树形文件浏览器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim-easymotion&lt;/code&gt;：远距离光标“瞬移”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-生态延伸&#34;&gt;2. 生态延伸&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shell：&lt;/strong&gt; &lt;code&gt;set -o vi&lt;/code&gt; 让命令行支持 Vim 快捷键。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器：&lt;/strong&gt; 安装 &lt;code&gt;Vimium&lt;/code&gt; (Chrome) 或 &lt;code&gt;Tridactyl&lt;/code&gt; (Firefox) 实现纯键盘冲浪。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;del&gt;(但是我还是贴出我的配置hhh大家按需选用)&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;首先就是我改了windows系统设置,把大写锁定映射成了esc&lt;/p&gt;
&lt;p&gt;方法如下&lt;/p&gt;
&lt;p&gt;下载并安装 Microsoft PowerToys
如果你还没有安装，可以通过以下几种方式获取：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;官方下载：&lt;/strong&gt; 前往 &lt;a href=&#34;https://github.com/microsoft/PowerToys/releases&#34;&gt;GitHub PowerToys 发布页面&lt;/a&gt; 下载最新的 &lt;code&gt;.exe&lt;/code&gt; 安装包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用商店：&lt;/strong&gt; 在 Windows 11 的 &lt;strong&gt;Microsoft Store&lt;/strong&gt; 中搜索 &amp;ldquo;PowerToys&amp;rdquo; 并安装。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行安装：&lt;/strong&gt; 打开终端（PowerShell），输入：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;winget install Microsoft.PowerToys
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完成后，按以下步骤操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;打开 PowerToys 设置：&lt;/strong&gt; 在任务栏右下角找到 PowerToys 图标并双击，或从开始菜单搜索打开。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进入键盘管理器：&lt;/strong&gt; 在左侧菜单栏中找到 &lt;strong&gt;键盘管理器 (Keyboard Manager)&lt;/strong&gt;，确保顶部的开关处于“开启”状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重新映射键：&lt;/strong&gt; 点击中间部分的 &lt;strong&gt;重新映射键 (Remap a key)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加映射关系：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;点击左侧的加号 &lt;code&gt;+&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在左侧的 &lt;strong&gt;选择 (Select)&lt;/strong&gt; 下拉框中找到 &lt;code&gt;Caps Lock&lt;/code&gt;（或者直接点击“按下”，然后在键盘上按一下大写锁定键）。&lt;/li&gt;
&lt;li&gt;在右侧的 &lt;strong&gt;发送 (To send)&lt;/strong&gt; 下拉框中选择 &lt;code&gt;Esc&lt;/code&gt;（同理可以点击“按下”后按一下 Esc 键）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保存设置：&lt;/strong&gt; 点击右上角的“确定”。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vimrc&#34; data-lang=&#34;vimrc&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; --- 基础设置 ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nocompatible&lt;/span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 关闭 Vi 兼容模式，解锁 Vim 更多功能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;syntax&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;on&lt;/span&gt;             &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 开启语法高亮&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;shortmess&lt;/span&gt;+=&lt;span style=&#34;color:#a6e22e&#34;&gt;I&lt;/span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 启动时不显示欢迎界面（捐赠提示等）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;number&lt;/span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 显示行号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;relativenumber&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 显示相对行号（方便 5j, 10k 这种跳转）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;laststatus&lt;/span&gt;=&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 总是显示状态栏&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ruler&lt;/span&gt;                                 &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 打开状态栏标尺&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;backspace&lt;/span&gt;=&lt;span style=&#34;color:#a6e22e&#34;&gt;indent&lt;/span&gt;,&lt;span style=&#34;color:#a6e22e&#34;&gt;eol&lt;/span&gt;,&lt;span style=&#34;color:#a6e22e&#34;&gt;start&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 允许在自动缩进、行尾、插入点前使用退格键&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hidden&lt;/span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 允许在未保存当前文件的情况下切换缓冲区（Buffer）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mouse&lt;/span&gt;+=&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 开启鼠标支持&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;smartindent&lt;/span&gt;                           &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 智能自动缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;autoindent&lt;/span&gt;                            &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 新行自动继承上一行的缩进&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;shiftwidth&lt;/span&gt;=&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;                          &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 设置自动缩进时，每一级缩进4个空格的宽度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tabstop&lt;/span&gt;=&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;                             &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 设定 tab 长度为 4 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hlsearch&lt;/span&gt;                              &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 搜索时高亮匹配项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 输入 :noh 可以临时关闭高亮&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;autochdir&lt;/span&gt;                             &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 自动切换当前目录为当前文件所在的目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;showcmd&lt;/span&gt;         &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 在右下角显示当前输入的命令（比如输入 d 时会显示）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;wildmenu&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 命令行模式下的补全增强（以列表形式展示选项）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nobackup&lt;/span&gt;           &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 不生成备份文件 (~ 文件)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;noswapfile&lt;/span&gt;         &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 不生成交换文件 (.swp 文件)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; --- 搜索优化 ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ignorecase&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 搜索时忽略大小写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;smartcase&lt;/span&gt;         &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 如果搜索词包含大写，则自动转为大小写敏感&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;incsearch&lt;/span&gt;         &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 边输入边显示匹配结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; --- 快捷键与行为调整 ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 禁用 Q 键，防止误入容易卡住的 Ex 模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nmap&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Q&lt;/span&gt; &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Nop&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mapleader&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 设置空格为 Leader 键&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 按空格 + w 保存，按空格 + q 退出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nnoremap&lt;/span&gt; &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;leader&lt;/span&gt;&amp;gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;w&lt;/span&gt; :&lt;span style=&#34;color:#a6e22e&#34;&gt;w&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CR&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nnoremap&lt;/span&gt; &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;leader&lt;/span&gt;&amp;gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;q&lt;/span&gt; :&lt;span style=&#34;color:#a6e22e&#34;&gt;q&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CR&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 按空格 + nh 取消搜索高亮&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nnoremap&lt;/span&gt; &amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;leader&lt;/span&gt;&amp;gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;nh&lt;/span&gt; :&lt;span style=&#34;color:#a6e22e&#34;&gt;nohlsearch&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CR&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34; 禁用声音提示（报错时不会发出叮叮声）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;noerrorbells&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;visualbell&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;t_vb&lt;/span&gt;=
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将vimrc文件保存到~/.vimrc文件中（~指的是c:/&lt;user&gt;）&lt;/p&gt;
&lt;h2 id=&#34;在命令行唤起vim输入echo-myvimrc可以检查识别出的配置文件的路径&#34;&gt;在命令行唤起vim，输入&lt;code&gt;:echo $MYVIMRC&lt;/code&gt;可以检查识别出的配置文件的路径&lt;/h2&gt;
&lt;h3 id=&#34;五-练习建议&#34;&gt;五、 练习建议&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;初级：&lt;/strong&gt; 运行终端指令 &lt;code&gt;vimtutor&lt;/code&gt;（或 &lt;code&gt;:Tutor&lt;/code&gt;），完成 30 分钟互动教学。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中级：&lt;/strong&gt; 强制在所有编辑任务（笔记、代码、README）中使用 Vim，忍受最初 20 小时的低效期。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高级：&lt;/strong&gt; 当你觉得某个操作太慢时，去搜“Vim better way for&amp;hellip;”，永远有新命令等着你。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;</description>
    </item>
    
    <item>
      <title>如何面对绩点和“过时的”科班教育</title>
      <link>https://cloudymount789.github.io/blog/how_to_face_gpa/</link>
      <pubDate>Wed, 01 Apr 2026 21:39:26 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/how_to_face_gpa/</guid>
      <description>&lt;p&gt;&lt;strong&gt;我要我的青春洋洋洒洒。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所有，或一无所有。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;如何面对绩点和过时的科班教育&#34;&gt;如何面对绩点和“过时的”科班教育&lt;/h2&gt;
&lt;h3 id=&#34;所有人在上大学后都会怀疑的问题&#34;&gt;所有人在上大学后都会怀疑的问题&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;我为什么要学这门课！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这门课有什么用吗！！！&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;纠结&#34;&gt;纠结&lt;/h3&gt;
&lt;p&gt;我仔细思考过花大量时间学好这些过时的，以后很可能用不上的课程对于长远的发展实际意义。&lt;/p&gt;
&lt;p&gt;尤其是ai时代，我感觉自己根本没有必要学习这些知识，我的学习速度比起ai简直是尾灯都看不见。&lt;/p&gt;
&lt;p&gt;学习这些知识，更像是为了卷绩点保研，卷果酱，卷出国。&lt;/p&gt;
&lt;p&gt;走这些主流的大路。&lt;/p&gt;
&lt;p&gt;大抵是这么多年根深蒂固的&lt;strong&gt;学生思维&lt;/strong&gt;吧。&lt;/p&gt;
&lt;p&gt;在听学长们提到各种东西究竟卷的有多可怕的时候，我真真切切的想：&lt;strong&gt;好累呀，不然别卷了？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们都知道路有很多条，人生是旷野，可是。&lt;strong&gt;真的那么容易放得下吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;至少我真的在这个怪圈里纠缠了非常久。感觉学这些没有意义，想做的事情有很多，想把这些事件腾出来做自己感兴趣的事情，和可能真的跟上时代，对就业后的能力有意义的事情。但是又会在哪个突如其来的小测考得很差，或者说看到绩点很低，排名很差，忍不住有点怀疑自己的选择，忍不住焦虑&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人就是既要又要&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我大一上就是做好了不想卷这些的想法，但是最后回顾一整个大一上，发现不被push着学其实我也不会干其他的事情，最后绩点没有，其他事也什么都没干成，好像我的决策是错的。这让我产生了怀疑。&lt;/p&gt;
&lt;h3 id=&#34;为什么放不下绩点&#34;&gt;为什么放不下绩点&lt;/h3&gt;
&lt;p&gt;我想，究其本质，可能是因为。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我没有冒险的勇气。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们习惯了在稳妥的路上走，&lt;strong&gt;稳妥其实并非真正的稳妥&lt;/strong&gt;，是&lt;strong&gt;主流、大众和熟悉&lt;/strong&gt;给自己带来了&lt;strong&gt;安全感&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当你做出了一个和大众相背的结论后，你真的需要足够有&lt;strong&gt;勇气&lt;/strong&gt;，足够有&lt;strong&gt;信心&lt;/strong&gt;，来说服自己：&lt;strong&gt;“我做的选择是对的。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;否则，你很有可能陷入&amp;quot;fear of missing out&amp;quot;。&lt;/p&gt;
&lt;p&gt;所以我不敢完全的放弃绩点，或者说一直在反复纠结的原因，可能就是：&lt;/p&gt;
&lt;p&gt;我不敢抛弃一切去做没有很大把握的事情，不敢“&lt;strong&gt;疯狂&lt;/strong&gt;”一点，也做不到坚信自己的决策。尽管我知道&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“高风险，高回报。”&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;所以&#34;&gt;所以&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;我想钻出我的乌龟壳了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;做一些疯狂一点的事吧。&lt;/p&gt;
&lt;p&gt;我相信人的心态会慢慢变得开放，观念也会渐渐转变。&lt;/p&gt;
&lt;p&gt;我要想清楚&lt;strong&gt;自己想要的是什么&lt;/strong&gt;，为此我已经下定决心&lt;strong&gt;舍弃什么&lt;/strong&gt;，不能因为这些东西而后悔，也不要因为一时的挫败怀疑自己的选择。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我要我的青春洋洋洒洒。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;成功了，那就成一段佳话。失败了，其实也没那么过不去嘛，办法总比困难多，再想办法给过去的自己擦屁股就好了。&lt;/p&gt;
&lt;p&gt;学着勇敢。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“所有，或一无所有。”&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;批判性思维&#34;&gt;批判性思维&lt;/h3&gt;
&lt;p&gt;虽然可能只是目前的知识有限目光短浅还感受不到这门课的真正作用&lt;/p&gt;
&lt;p&gt;我怀疑过这种想法是不是&lt;strong&gt;急功近利急于求成的快节奏和焦虑&lt;/strong&gt;带来的，也怀疑过这样会不会学不到真的硬核的东西。&lt;/p&gt;
&lt;p&gt;但是，正如前面所说的，&lt;strong&gt;我现在想相信自己的选择&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>SICP系列笔记汇总</title>
      <link>https://cloudymount789.github.io/blog/sicp_notes_series/</link>
      <pubDate>Wed, 01 Apr 2026 21:14:48 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/sicp_notes_series/</guid>
      <description>&lt;p&gt;本系列为《计算机程序的构造和解释》（SICP，CS61A 南大引进版）核心笔记，聚焦程序设计的底层逻辑与核心思想，旨在帮助学习者搭建“知其然更知其所以然”的编程认知框架。适合正在学习 CS61A 课程的学习者梳理知识体系，也可作为编程入门者夯实基础、理解程序设计本质的参考资料。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://sicp.pascal-lab.net/2025/&#34;&gt;课程主页&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;一些碎碎念&#34;&gt;一些碎碎念&lt;/h3&gt;
&lt;p&gt;大一上的我的笔记真是青涩啊（）&lt;/p&gt;
&lt;p&gt;记得一开始刚进入大学真的是措手不及&lt;/p&gt;
&lt;p&gt;期中前感觉什么都没学，快要考试了才开始疯狂抱佛脚&lt;/p&gt;
&lt;p&gt;一个星期抱了半个学期的佛脚，&lt;/p&gt;
&lt;p&gt;（最后期中还是喜提不及格hhh，好在平均分也没及格()）&lt;/p&gt;
&lt;h3 id=&#34;课程评价&#34;&gt;课程评价&lt;/h3&gt;
&lt;p&gt;总的来说，这门课的氛围真的很好！&lt;/p&gt;
&lt;p&gt;真的很少能有机会遇到这么好的老师和助教了！还有交流群里的氛围也很好，现在都还挺活跃hhh&lt;/p&gt;
&lt;p&gt;这门课真的是让你学习编程背后的思想&lt;/p&gt;
&lt;p&gt;（你能真切的感受到编程的有趣（？），而不像国内很多其他的编程课程一样扣语法，像在做脑筋急转弯题）&lt;/p&gt;
&lt;p&gt;当然我的笔记是脱水版了hhh可能没有这些有趣的东西，还是有点干的&lt;/p&gt;
&lt;p&gt;最高兴的是初学者也能一上来就工程化的完成了四个代码量很多的大作业！真的受益匪浅！&lt;/p&gt;
&lt;p&gt;遗憾的是我没能逼自己适应全英阅读，每次写作业就够痛苦了还要读英文真的要很强大毅力了&lt;/p&gt;
&lt;p&gt;——沉浸式翻译启动！（）&lt;/p&gt;
&lt;p&gt;上了一学期，我想我真的能说是收获良多！&lt;/p&gt;
&lt;h3 id=&#34;一些建议&#34;&gt;一些建议&lt;/h3&gt;
&lt;p&gt;除去一些老生常谈的认真学习的学习方法&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不到万不得已不要用ai写作业！！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;打基础的时候用ai真的会基础很不扎实/泪&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学会自己解决问题&lt;/strong&gt; STFW RTFW ATFAI()&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学会自己debug&lt;/strong&gt;，不要写出代码跑不过没耐心就丢给ai问问题在哪！！！&lt;/p&gt;
&lt;p&gt;(大一下机测我才意识到我已经被ai养的debug都不会了，还得痛苦学习)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;逼自己全英阅读！！！逼自己逼自己！！要有决心！！&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>SICP_interpreter_笔记</title>
      <link>https://cloudymount789.github.io/blog/sicp_note_interpreter/</link>
      <pubDate>Sat, 03 Jan 2026 15:47:49 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/sicp_note_interpreter/</guid>
      <description>&lt;p&gt;摘要&lt;/p&gt;
&lt;p&gt;本文为《计算机程序的构造和解释》（SICP，CS61A 南大引进版）用python实现scheme解释器部分课程核心笔记，聚焦程序设计的底层逻辑与核心思想，旨在帮助学习者搭建“知其然更知其所以然”的编程认知框架。适合正在学习 CS61A 课程的学习者梳理知识体系，也可作为编程入门者夯实基础、理解程序设计本质的参考资料。&lt;/p&gt;
&lt;h1 id=&#34;使用python实现scheme解释器-interpreters&#34;&gt;使用python实现scheme解释器 (Interpreters)&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://sicp.pascal-lab.net/2025/projects/proj04/index.html&#34;&gt;&lt;strong&gt;Hangout&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;翻译与解释器基础-translation-and-interpreter-basics&#34;&gt;翻译与解释器基础 (Translation and Interpreter Basics)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;计算机只能理解&lt;strong&gt;二进制 (Binary)&lt;/strong&gt; ，而高级编程语言需要被翻译成二进制才能运行。解释器 (Interpreter) 实现了&lt;strong&gt;即时 (on-the-fly)&lt;/strong&gt; 翻译和执行 。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-翻译类型-types-of-translation&#34;&gt;1. 翻译类型 (Types of Translation)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;编译 (Compiled):&lt;/strong&gt; 一次性全部翻译，稍后运行 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解释 (Interpreted):&lt;/strong&gt; 边运行边翻译 。&lt;/p&gt;
&lt;h4 id=&#34;2-解释器语言-interpreter-languages&#34;&gt;2. 解释器语言 (Interpreter Languages)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;实现语言 (Implementation Language):&lt;/strong&gt; 用来编写解释器本身的语言（如 Scheme 解释器可能是用 Python 实现的） 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;被实现语言 (Implemented Language):&lt;/strong&gt; 用户输入的语言（即 Scheme） 。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;被实现语言被翻译成实现语言 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-读-求值-打印循环-read-eval-print-loop-repl&#34;&gt;3. 读-求值-打印循环 (Read-Eval-Print Loop, REPL)&lt;/h4&gt;
&lt;p&gt;解释器核心的三个步骤:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;读 (Read):&lt;/strong&gt; 读取用户输入（字符串）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;求值 (Eval):&lt;/strong&gt; 将输入翻译成计算机可读的形式并求值 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打印 (Print):&lt;/strong&gt; 打印结果给用户 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;读取阶段-the-read-phase&#34;&gt;读取阶段 (The Read Phase)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-1&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;读取阶段将原始输入字符串转换为一种在实现语言（Python）中可操作的&lt;strong&gt;表达式表示 (Expression Representation)&lt;/strong&gt; 。&lt;/p&gt;
&lt;h3 id=&#34;核心概念&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-词法分析提词器lexical-analysis--lexer&#34;&gt;1. 词法分析/提词器(Lexical Analysis / Lexer)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将输入字符串转化为&lt;strong&gt;标记 (Tokens)&lt;/strong&gt; 集合 。&lt;/li&gt;
&lt;li&gt;分割+提取+初步处理(按照规则转化为放在python列表里的python语法的东西)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标记 (Token):&lt;/strong&gt; 输入字符串的单个有意义单元，如字面量(literals)、名称(names)、关键字(keywords)、分隔符(delimiters)等 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;分隔符：用于分割不同语法单元，如括号，分号，引号
关键字：即special form和standard procedures,如define,lambda,if,begin,quote
名称：即标识符，如函数名，变量名
字面量：表示直接值的语法元素，如数字，字符串，字符(&lt;code&gt;#\a&lt;/code&gt;)，符号(&lt;code&gt;&#39;symbol&lt;/code&gt;)，布尔值，列表、向量字面量(&lt;code&gt;&#39;(1 2 3)&lt;/code&gt;、&lt;code&gt;#(a b c)&lt;/code&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;2-语法分析-syntactic-analysis--parser&#34;&gt;2. 语法分析 (Syntactic Analysis / Parser)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将标记转化为实现语言中表达式的&lt;strong&gt;表示形式(Representation)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基本表达式的表示&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自求值表达式 (Self-Evaluating Expressions)&lt;/strong&gt; (&lt;code&gt;#t&lt;/code&gt;, &lt;code&gt;5.2&lt;/code&gt;): 使用 Python 对应的布尔值或数字 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;符号 (Symbols)&lt;/strong&gt; (&lt;code&gt;cons&lt;/code&gt;): 使用 Python 字符串 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注：
scheme 表达式种类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自求值表达式(self-evaluatingexpressions)&lt;/li&gt;
&lt;li&gt;符号(symbols)&lt;/li&gt;
&lt;li&gt;调用表达式(call expressions)&lt;/li&gt;
&lt;li&gt;特殊表达式(special form expressions)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-表示组合-representing-combinations&#34;&gt;3. 表示组合 (Representing Combinations)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Scheme 的组合表达式 &lt;code&gt;(&amp;lt;operator&amp;gt; &amp;lt;operand1&amp;gt; ...)&lt;/code&gt; 在内部被表示为包含操作符和操作数的&lt;strong&gt;Scheme 链表 (Linked Lists)&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;scm&amp;gt; (define expr &amp;#39;(+ 2 3)) ; Create the expression (+ 2 3)
expr
scm&amp;gt; (eval expr) ; Evaluate the expression
5
scm&amp;gt; (car expr) ; Get the operator
+
scm&amp;gt; (cdr expr) ; Get the operands
(2 3)
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;在 Python 中，Scheme 列表通过自定义的 &lt;code&gt;Pair&lt;/code&gt; 类和全局 &lt;code&gt;nil&lt;/code&gt; 实例来精确表示:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Python &lt;code&gt;Pair&lt;/code&gt; 和 &lt;code&gt;nil&lt;/code&gt; 类&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Pair&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, first, second):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; first &lt;span style=&#34;color:#75715e&#34;&gt;# 相当于 Scheme 的 car&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;second &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; second &lt;span style=&#34;color:#75715e&#34;&gt;# 相当于 Scheme 的 cdr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Pair(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{0}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;, &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{1}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;format(self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first, self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;second)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nil&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;nil&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nil &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nil()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 让所有的nil都是同一个nil,防止每次都创建一个instance,出现不同的instance不能进行相等的运算&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;4-特殊情况引用-quote&#34;&gt;4. 特殊情况：引用 (&lt;code&gt;quote&lt;/code&gt;)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;特殊语法 &lt;code&gt;‘&amp;lt;expr&amp;gt;&lt;/code&gt; 在读取时会被转换成一个完整的 &lt;code&gt;quote&lt;/code&gt; 表达式 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;例题&#34;&gt;例题&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;(+ 2 3)&lt;/code&gt; 被表示为:
&lt;code&gt;Pair(&#39;+&#39;, Pair(2, Pair(3, nil)))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(define (f) 3)&lt;/code&gt;表示为
&lt;code&gt;Pair(&#39;define&#39;, (Pair(Pair(&#39;f&#39;, nil), Pair(3, nil))))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4.67&lt;/code&gt; -&amp;gt; &lt;code&gt;4.67&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#t&lt;/code&gt; -&amp;gt; &lt;code&gt;True&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list&lt;/code&gt; -&amp;gt; &lt;code&gt;&#39;list&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(cons 2 3)&lt;/code&gt; -&amp;gt; &lt;code&gt;Pair(&#39;cons&#39;, Pair(2, Pair(3, nil)))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(if (&amp;lt; x 0) 1 (+ x 1))&lt;/code&gt;
-&amp;gt;
&lt;code&gt;Pair(&#39;if&#39;, Pair(Pair(&#39;&amp;lt;&#39;, Pair(&#39;x&#39;, Pair(0, nil))), Pair(1, Pair(Pair(&#39;+&#39;,  Pair(&#39;x&#39;, Pair(1, nil))), nil))))&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;遇到括号套一层pair&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;&lt;code&gt;&#39;hello&lt;/code&gt; -&amp;gt; &lt;code&gt;Pair(&#39;quote&#39;, Pair(&#39;hello&#39;, nil))&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;求值阶段-the-eval-phase&#34;&gt;求值阶段 (The Eval Phase)&lt;/h2&gt;
&lt;h3 id=&#34;复习怎么画环境图来着&#34;&gt;复习：怎么画环境图来着？&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;make-adder&lt;/span&gt; x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;) (+ x y)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;add-three (&lt;span style=&#34;color:#a6e22e&#34;&gt;make-adder&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;add-three&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;add-three&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-8.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;主题概述-2&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;求值阶段 (Eval) 是解释器的核心，它接收表达式的表示形式和一个&lt;strong&gt;环境 (Environment)&lt;/strong&gt; ，并返回求值结果（值）。Eval 和 Apply 是&lt;strong&gt;相互递归 (mutually-recursive)&lt;/strong&gt; 的 。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-1&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-环境与框架-environments-and-frames&#34;&gt;1. 环境与框架 (Environments and Frames)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;环境 (Environment):&lt;/strong&gt; 由当前框架、其父框架及其所有祖先框架直到全局框架组成 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;框架 (Frame):&lt;/strong&gt; 在解释器中由 &lt;code&gt;Frame&lt;/code&gt; 类实例表示 。
Frame有两个实例属性：
&lt;code&gt;bindings&lt;/code&gt;: 字典，将 Scheme 符号 (Python 字符串) 绑定到 Scheme 值 。
&lt;code&gt;parent&lt;/code&gt;: 指向父框架（另一个frame实例）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-求值基本表达式-evaluating-primitive-expressions&#34;&gt;2. 求值基本表达式 (Evaluating Primitive Expressions)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自求值表达式:&lt;/strong&gt; 它们求值结果就是自身 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;符号 (Symbols):&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;从&lt;strong&gt;当前框架&lt;/strong&gt;开始查找符号的绑定值 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果未找到，递归地向&lt;strong&gt;父框架&lt;/strong&gt;查找，直到&lt;strong&gt;全局框架&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果全局框架仍未找到，抛出错误 (&lt;code&gt;SchemeError&lt;/code&gt;) 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;3-求值组合-evaluating-combinations&#34;&gt;3. 求值组合 (Evaluating Combinations)&lt;/h4&gt;
&lt;p&gt;组合表达式分为&lt;strong&gt;特殊形式&lt;/strong&gt;和&lt;strong&gt;调用表达式&lt;/strong&gt;，取决于其运算符 。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特殊形式 (Special Forms):&lt;/strong&gt; 运算符是特殊的符号（如 &lt;code&gt;define&lt;/code&gt;, &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;lambda&lt;/code&gt;），有其自身的求值规则 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;调用表达式 (Call Expressions):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;求值运算符，得到一个&lt;strong&gt;过程 (Procedure)&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从左到右求值所有操作数，得到参数值 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;应用 (Apply)&lt;/strong&gt; 过程到参数值 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;前两步递归的调用eval喵&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;应用阶段-the-apply-phase&#34;&gt;应用阶段 (The Apply Phase)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-3&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;应用阶段 (Apply) 将一个过程 (Procedure) 应用于一组参数 (Arguments)。过程有两种类型：内置过程和用户定义过程 。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-2&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-内置过程-built-in-procedures&#34;&gt;1. 内置过程 (Built-In Procedures)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;例如 &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;modulo&lt;/code&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在解释器中，它们是 &lt;code&gt;BuiltinProcedure&lt;/code&gt; 类的实例 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;应用规则&lt;/strong&gt;: 直接调用对应的实现语言（Python）函数，并将参数值传入 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-用户定义过程-user-defined-procedures&#34;&gt;2. 用户定义过程 (User-Defined Procedures)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过 &lt;code&gt;lambda&lt;/code&gt; 或 &lt;code&gt;define&lt;/code&gt; 定义 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在解释器中，它们是 &lt;code&gt;LambdaProcedure&lt;/code&gt; 类的实例，包含形式参数列表、函数体和&lt;strong&gt;父框架 (Parent Frame)&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;应用规则 (Application Rules):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开一个&lt;strong&gt;新框架 (New Frame)&lt;/strong&gt;，其父框架是该过程的&lt;strong&gt;父框架&lt;/strong&gt;（即创建该过程时的环境）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将形式参数 (Formal Parameters) 绑定到参数值 (Arguments) 上，存储在新框架中 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;strong&gt;新框架&lt;/strong&gt;中求值过程的函数体 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;3-evalapply-计数-counting-evalapply-calls&#34;&gt;3. Eval/Apply 计数 (Counting Eval/Apply Calls)&lt;/h4&gt;
&lt;p&gt;Eval 和 Apply 是相互调用的：
&lt;img src=&#34;https://cloudymount789.github.io/images/image-9.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Eval（求值）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Eval&lt;/code&gt; 的任务是接收一个表达式（代码）和当前环境，并返回它的值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基础情况 (Base Cases):&lt;/strong&gt; 这是递归的终点。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自求值表达式 (Self-evaluating expressions):&lt;/strong&gt; 比如数字（&lt;code&gt;5&lt;/code&gt;）或字符串（&lt;code&gt;&amp;quot;hello&amp;quot;&lt;/code&gt;），它们的值就是它们本身。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;符号查找 (Look up values):&lt;/strong&gt; 比如变量名 &lt;code&gt;x&lt;/code&gt;。求值器会去内存（环境）中查找 &lt;code&gt;x&lt;/code&gt; 对应的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;递归情况 (Recursive Cases):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eval(operator) 和 Eval(o):&lt;/strong&gt; 当遇到一个函数调用时，它先分别求出“函数名”和“所有参数”的具体数值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply(proc, args):&lt;/strong&gt; 一旦参数准备好了，它就会把这些参数交给 &lt;code&gt;Apply&lt;/code&gt; 去实际执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特殊形式 (Special Form):&lt;/strong&gt; 比如 &lt;code&gt;if&lt;/code&gt; 语句或 &lt;code&gt;define&lt;/code&gt;。这些不是普通函数，需要特殊的处理逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Apply（应用）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Apply&lt;/code&gt; 的任务是接收一个“函数”和一组“参数”，并执行这个函数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基础情况 (Base Cases):&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内置过程 (Built-in procedures):&lt;/strong&gt; 比如加法 &lt;code&gt;+&lt;/code&gt; 或减法 &lt;code&gt;-&lt;/code&gt;。这些是由底层硬件或底层语言（如 C 或 Python）直接实现的，不需要再拆解。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;递归情况 (Recursive Cases):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eval(body) of user defined procedures:&lt;/strong&gt; 对于用户自己定义的函数，&lt;code&gt;Apply&lt;/code&gt; 会打开函数体（Body），然后在这一组新参数的环境下，**重新调用 &lt;code&gt;Eval**&lt;/code&gt; 来处理函数体里的代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种&lt;strong&gt;相互递归 (Mutual Recursion)&lt;/strong&gt; 形成了一个闭环。通过这个循环，解释器可以处理极其复杂的嵌套代码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Eval&lt;/code&gt; 负责“拆解”结构。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Apply&lt;/code&gt; 负责“执行”动作。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例题&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-10.png&#34; alt=&#34;alt text&#34;&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-11.png&#34; alt=&#34;alt text&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    
    <item>
      <title>SICP_SQL_笔记</title>
      <link>https://cloudymount789.github.io/blog/sicp_note_sql/</link>
      <pubDate>Sat, 03 Jan 2026 12:48:01 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/sicp_note_sql/</guid>
      <description>&lt;p&gt;摘要&lt;/p&gt;
&lt;p&gt;本文为《计算机程序的构造和解释》（SICP，CS61A 南大引进版）SQL部分课程核心笔记，聚焦程序设计的底层逻辑与核心思想，旨在帮助学习者搭建“知其然更知其所以然”的编程认知框架。适合正在学习 CS61A 课程的学习者梳理知识体系，也可作为编程入门者夯实基础、理解程序设计本质的参考资料。&lt;/p&gt;
&lt;h1 id=&#34;sql-数据库查询structured-query-language&#34;&gt;SQL 数据库查询(Structured Query Language)&lt;/h1&gt;
&lt;h2 id=&#34;注意事项&#34;&gt;注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;句末记得加分号!&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记得所有的字符串都要加&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;!&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL中的&lt;expression&gt;中的取等不用&lt;code&gt;==&lt;/code&gt;!用&lt;code&gt;=&lt;/code&gt;即可!!&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;审清楚题干!!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;主题-1声明式编程与-sql-基础-declarative-programming--sql-basics&#34;&gt;主题 1：声明式编程与 SQL 基础 (Declarative Programming &amp;amp; SQL Basics)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;SQL 是一种&lt;strong&gt;声明式语言 (Declarative Language)&lt;/strong&gt;。与传统的命令式编程（如 Python，需分步指明“怎么做”）不同，声明式编程只需告诉计算机“想要什么”，由解释器决定如何执行。&lt;/p&gt;
&lt;h3 id=&#34;核心概念&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-数据库结构-database-structure&#34;&gt;1. 数据库结构 (Database Structure)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;表 (Table)&lt;/strong&gt;：存储数据的核心单元，由固定数量的&lt;strong&gt;列 (Columns)&lt;/strong&gt; 和多行&lt;strong&gt;数据条目 (Rows/Records)&lt;/strong&gt; 组成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;列 (Column)&lt;/strong&gt;：具有特定的名称和描述。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行 (Row)&lt;/strong&gt;：为每一列提供具体的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-创建表&#34;&gt;2. 创建表&lt;/h4&gt;
&lt;p&gt;在 SQL 中，可以通过组合已有的数据或从头定义来创建表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用 &lt;code&gt;SELECT&lt;/code&gt; 创建的是临时数据行&lt;/strong&gt;,用于展示给用户看而不存储&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;CREATE TABLE &amp;lt;NAME&amp;gt; AS&lt;/code&gt;&lt;strong&gt;存储数据&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;UNION&lt;/code&gt; 将多个 &lt;code&gt;SELECT&lt;/code&gt; 语句连接起来,创建多行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法示例&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; dogs &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;abraham&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; name, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; fur &lt;span style=&#34;color:#66d9ef&#34;&gt;UNION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;barack&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;short&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;UNION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clinton&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;long&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;3-选择数据-the-select-statement&#34;&gt;3. 选择数据 (The SELECT Statement)&lt;/h4&gt;
&lt;p&gt;最基本的查询结构，用于从表中提取特定数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SELECT&lt;/code&gt;会做什么?&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无FROM&lt;/strong&gt;: 可以制造单行,用逗号将同一行内不同列的内容隔开多用于&lt;code&gt;CREATE&lt;/code&gt;中;可以用&lt;code&gt;AS&lt;/code&gt; 取名作为一列的列名称&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有FROM&lt;/strong&gt;: 从FROM的TABLE中用列名称把一列拿出来(即列名称会被evaluate成为多个行的值)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SELECE&lt;/code&gt;始终决定了列规模&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SELECT * FROM&lt;/code&gt;选择全部&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语法顺序&lt;/strong&gt;：&lt;code&gt;SELECT [列名] FROM [表名] WHERE [过滤条件] ORDER BY [排序方式] LIMIT [数量];&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WHERE 关键字&lt;/strong&gt;：用于根据布尔条件过滤行。(输入表的行子集(subset of the rows of the input table))&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ORDER BY 关键字&lt;/strong&gt;：对结果进行排序（&lt;code&gt;ASC&lt;/code&gt; 升序，默认；&lt;code&gt;DESC&lt;/code&gt; 降序）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LIMIT关键字&lt;/strong&gt;: 限制输出行数&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;4-select语句中的算术arithmetic&#34;&gt;4. &lt;code&gt;SELECT&lt;/code&gt;语句中的算术(Arithmetic)&lt;/h4&gt;
&lt;p&gt;-&amp;gt; 直接使用运算符号&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; restaurant &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; single, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; couple &lt;span style=&#34;color:#66d9ef&#34;&gt;UNION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;102&lt;/span&gt; , &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; , &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;UNION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;103&lt;/span&gt; , &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; , &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt;, single &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; couple &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;total &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; restaurant;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;主题-2连接与别名-joins--aliasing&#34;&gt;主题 2：连接与别名 (Joins &amp;amp; Aliasing)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-1&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;连接 (Join)&lt;/strong&gt; 允许我们组合多个表的数据。当我们连接两个表时，结果是一个新表，其中包含原始表行之间的每一种可能组合（笛卡尔积）。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-连接表-joining-tables&#34;&gt;1. 连接表 (Joining Tables)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：在 &lt;code&gt;FROM&lt;/code&gt; 子句中列出多个表名，用逗号分隔。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; parents, dogs &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; child &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-别名-aliasing&#34;&gt;2. 别名 (Aliasing)&lt;/h4&gt;
&lt;p&gt;当连接同一个表两次（Self-join）或多个表有重名列时，必须使用别名。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：使用 &lt;code&gt;AS&lt;/code&gt; 关键字（可省略）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：消除歧义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：寻找所有兄弟姐妹（拥有共同父母的两个孩子）：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; a.child &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;first&lt;/span&gt;, b.child &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;second&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; parents &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; a, parents &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; b
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; a.parent &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; b.parent &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; a.child &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; b.child;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;注意：使用&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;a.child &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; b.child&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;是为了去除重复项并避免自己与自己配对。&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;扩展-显式连接---join-on语句&#34;&gt;扩展: 显式连接 -&amp;gt; JOIN ON语句&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;使用显式语句连接,使表格连接更清晰明了&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;why-join&#34;&gt;&lt;strong&gt;Why JOIN?&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;数据库中的表通常是为了消除冗余而拆分的（例如：一张表存学生信息，一张表存班级信息）。&lt;strong&gt;连接 (Join)&lt;/strong&gt; 的目的就是根据两个表之间的&lt;strong&gt;公共列&lt;/strong&gt;（通常是 ID），将分散的数据重新组合成一行。&lt;/p&gt;
&lt;p&gt;CS61A 风格: &lt;strong&gt;隐式连接 (Implicit Join)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是 PPT 中主要演示的方法。它实际上是先做笛卡尔积（Cross Join），然后用 &lt;code&gt;WHERE&lt;/code&gt; 过滤。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：在 &lt;code&gt;FROM&lt;/code&gt; 子句中用逗号分隔表名，在 &lt;code&gt;WHERE&lt;/code&gt; 子句中指定连接条件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; name, course 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; students, enrollments 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; students.sid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; enrollments.sid;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现代标准风格: &lt;strong&gt;显式连接 (Explicit JOIN)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是更推荐的写法，语义更清晰，将“连接逻辑”和“过滤逻辑”分开了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：使用 &lt;code&gt;JOIN&lt;/code&gt; 关键字，并用 &lt;code&gt;ON&lt;/code&gt; 指定连接条件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; name, course 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; students 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; enrollments 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; students.sid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; enrollments.sid;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;常见的连接类型 (Types of Joins)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了演示，假设我们有两张表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Table A (Students)&lt;/strong&gt;: &lt;code&gt;{1: &#39;Alice&#39;, 2: &#39;Bob&#39;, 3: &#39;Charlie&#39;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Table B (Grades)&lt;/strong&gt;: &lt;code&gt;{1: &#39;A&#39;, 2: &#39;B&#39;, 4: &#39;C&#39;}&lt;/code&gt; (注意：Charlie 没有成绩，ID 4 的成绩属于不存在的学生)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;1-内连接-inner-join&#34;&gt;(1) 内连接 (INNER JOIN)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：只保留两个表中&lt;strong&gt;都存在&lt;/strong&gt;匹配关系的行（交集）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CS61A 写法&lt;/strong&gt;：&lt;code&gt;FROM A, B WHERE A.id = B.id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标准写法&lt;/strong&gt;：&lt;code&gt;FROM A INNER JOIN B ON A.id = B.id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果&lt;/strong&gt;：Alice (A), Bob (B)。(Charlie 和 ID 4 被丢弃)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-左连接-left-outer-join&#34;&gt;(2) 左连接 (LEFT OUTER JOIN)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：保留&lt;strong&gt;左表&lt;/strong&gt;（FROM 后的表）的所有行。如果右表没有匹配，右表的列显示为 &lt;code&gt;NULL&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标准写法&lt;/strong&gt;：&lt;code&gt;FROM A LEFT JOIN B ON A.id = B.id&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;结果&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alice - A&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bob - B&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Charlie - &lt;strong&gt;NULL&lt;/strong&gt; (因为 Charlie 在左表，但右表没成绩)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;注：SQLite 支持 LEFT JOIN，但不支持 RIGHT JOIN。&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-交叉连接-cross-join--cartesian-product&#34;&gt;(3) 交叉连接 (CROSS JOIN / Cartesian Product)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;每一行 A 与每一行 B 配对，产生所有可能的组合。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;在输出中连接string使用&lt;code&gt;||&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题-3聚合与分组-aggregation--grouping&#34;&gt;主题 3：聚合与分组 (Aggregation &amp;amp; Grouping)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-2&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;聚合函数允许我们对一组行执行操作并返回单个值，通常与分组配合使用。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts-1&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-聚合函数-aggregate-functions&#34;&gt;1. 聚合函数 (Aggregate Functions)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;COUNT(*)&lt;/code&gt;：计算行数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SUM(col)&lt;/code&gt;：求某一列的和。(注:求行的值需要使用多个&lt;code&gt;+&lt;/code&gt;运算符)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MIN(col)&lt;/code&gt; / &lt;code&gt;MAX(col)&lt;/code&gt;：某一列中的最小值/最大值。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AVG(col)&lt;/code&gt;：某一列的平均值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-分组查询-group-by&#34;&gt;2. 分组查询 (GROUP BY)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GROUP BY &amp;lt;expression&amp;gt;&lt;/code&gt;后表达式求值结果相同被化为同一组,表达式中可以使用多个列名和运算符&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：将结果集划分为多个组，对每个组分别应用聚合函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HAVING 过滤&lt;/strong&gt;：用于过滤&lt;strong&gt;组&lt;/strong&gt;，类似于 &lt;code&gt;WHERE&lt;/code&gt; 过滤&lt;strong&gt;行&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：统计每种毛发类型的狗的数量，且只显示数量大于 1 的组：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; fur, &lt;span style=&#34;color:#66d9ef&#34;&gt;COUNT&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; dogs &lt;span style=&#34;color:#66d9ef&#34;&gt;GROUP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; fur &lt;span style=&#34;color:#66d9ef&#34;&gt;HAVING&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;COUNT&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;主题-4修改表记录-modifying-records&#34;&gt;主题 4：修改表记录 (Modifying Records)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-3&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;除了查询，SQL 还提供了创建空表及增删改查记录的语句。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts-2&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-表的生命周期&#34;&gt;1. 表的生命周期&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CREATE TABLE&lt;/strong&gt;：创建一个没有初始数据的空表。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CREATE TABLE [name]([column_defs]);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DROP TABLE&lt;/strong&gt;：从数据库中永久删除表。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DROP TABLE [IF EXISTS] [name];&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;例:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; parents(parent, child);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; dogs(name, fur, phrase &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;woof&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; dogs;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;EXISTS&lt;/span&gt; parents;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&#34;2-数据操作-dml&#34;&gt;2. 数据操作 (DML)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INSERT&lt;/strong&gt;：插入新行。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt;]([columns]) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;([&lt;span style=&#34;color:#66d9ef&#34;&gt;values&lt;/span&gt;]), ([&lt;span style=&#34;color:#66d9ef&#34;&gt;values&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;e.&lt;span style=&#34;color:#66d9ef&#34;&gt;g&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dogs(name, fur) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;fillmore&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;curly&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dogs &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;delano&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;long&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hi!&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dogs(fur, phrase) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;curly&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bark&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;：修改现有记录。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;UPDATE&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt;] &lt;span style=&#34;color:#66d9ef&#34;&gt;SET&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;column&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [expression] &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; [condition];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;e.&lt;span style=&#34;color:#66d9ef&#34;&gt;g&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;UPDATE&lt;/span&gt; dogs &lt;span style=&#34;color:#66d9ef&#34;&gt;SET&lt;/span&gt; phrase &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;WOOF&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; fur &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;curly&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DELETE&lt;/strong&gt;：删除现有行。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt;] &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; [condition];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;e.&lt;span style=&#34;color:#66d9ef&#34;&gt;g&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; dogs &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;herbert&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;做题技巧&#34;&gt;做题技巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;确定输入,输出,一列一列join&lt;/li&gt;
&lt;li&gt;有时可创建辅助表来帮助思考(&lt;code&gt;FROM&lt;/code&gt;后面加括号,写一串&lt;code&gt;SELECT&lt;/code&gt;语句)&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>SICP_scheme_笔记</title>
      <link>https://cloudymount789.github.io/blog/sicp_note_scheme/</link>
      <pubDate>Sat, 03 Jan 2026 12:47:38 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/sicp_note_scheme/</guid>
      <description>&lt;p&gt;摘要&lt;/p&gt;
&lt;p&gt;本文为《计算机程序的构造和解释》（SICP，CS61A 南大引进版）scheme部分课程核心笔记，聚焦程序设计的底层逻辑与核心思想，旨在帮助学习者搭建“知其然更知其所以然”的编程认知框架。适合正在学习 CS61A 课程的学习者梳理知识体系，也可作为编程入门者夯实基础、理解程序设计本质的参考资料。&lt;/p&gt;
&lt;h1 id=&#34;sicp-note---scheme&#34;&gt;SICP Note -&amp;gt; Scheme&lt;/h1&gt;
&lt;h2 id=&#34;主题一scheme-基础与求值-scheme-basics-and-evaluation&#34;&gt;主题一：Scheme 基础与求值 (Scheme Basics and Evaluation)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;Scheme 是一种 Lisp 方言，其核心特点是程序由&lt;strong&gt;表达式 (Expressions)&lt;/strong&gt; 构成，并且代码与数据结构高度统一。理解 Scheme 的求值规则，尤其是&lt;strong&gt;调用表达式 (Call Expressions)&lt;/strong&gt; 和&lt;strong&gt;特殊形式 (Special Forms)&lt;/strong&gt; 的区别，是关键。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;核心概念&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-表达式的分类-types-of-expressions&#34;&gt;1. 表达式的分类 (Types of Expressions)&lt;/h4&gt;
&lt;p&gt;Scheme 程序由两种表达式构成 ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原子表达式 (Atomic Expressions / Atoms)&lt;/strong&gt; ：不可再分割的基本值。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自求值 (Self-evaluating):&lt;/strong&gt; 数字 (&lt;code&gt;3&lt;/code&gt;, &lt;code&gt;-10&lt;/code&gt;)、布尔值 (&lt;code&gt;#t&lt;/code&gt;, &lt;code&gt;#f&lt;/code&gt;) 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;符号 (Symbols):&lt;/strong&gt; 绑定到值的名称 (&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;modulo&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;) 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组合 (Combinations)&lt;/strong&gt;  ：形如 &lt;code&gt;(&amp;lt;operator&amp;gt; &amp;lt;operand1&amp;gt; &amp;lt;operand2&amp;gt; ...)&lt;/code&gt;  。它们是&lt;strong&gt;调用表达式&lt;/strong&gt;或&lt;strong&gt;特殊形式表达式&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-调用表达式求值-call-expression-evaluation&#34;&gt;2. 调用表达式求值 (Call Expression Evaluation)&lt;/h4&gt;
&lt;p&gt;调用表达式将一个过程 (Procedure) 应用于一组参数 (Arguments) 。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;求值三步法&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;对 &lt;strong&gt;运算符 (Operator)&lt;/strong&gt; 求值，得到一个过程 。&lt;/li&gt;
&lt;li&gt;从左到右对所有 &lt;strong&gt;操作数 (Operands)&lt;/strong&gt; 求值，得到参数 。&lt;/li&gt;
&lt;li&gt;将过程应用于参数 。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例&lt;/strong&gt;：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (- (+ &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt; (* &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;)) (* &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;; 1. (* 4 6) -&amp;gt; 24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;; 2. (+ 7 24) -&amp;gt; 31&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;; 3. (* 3 5) -&amp;gt; 15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;; 4. (- 31 15) -&amp;gt; 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-特殊形式-special-forms&#34;&gt;3. 特殊形式 (Special Forms)&lt;/h4&gt;
&lt;p&gt;特殊形式的求值规则&lt;strong&gt;不同于&lt;/strong&gt;标准的调用表达式，它们的运算符（如 &lt;code&gt;define&lt;/code&gt;, &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;lambda&lt;/code&gt;）&lt;strong&gt;不一定&lt;/strong&gt;先求值，且操作数&lt;strong&gt;不一定&lt;/strong&gt;全部求值 。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;特殊形式&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;英文标注&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;语法&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;求值规则&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;定义&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;define&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;(define &amp;lt;name&amp;gt; &amp;lt;expr&amp;gt;)&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;1.  求值 &lt;code&gt;&amp;lt;expr&amp;gt;&lt;/code&gt;  。 2. 将结果值绑定到当前框架的 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 上 。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;条件&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;(if &amp;lt;predicate&amp;gt; &amp;lt;if-true&amp;gt; &amp;lt;if-false&amp;gt;)&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;1.  求值 &lt;code&gt;&amp;lt;predicate&amp;gt;&lt;/code&gt;  。 2. &lt;strong&gt;如果结果不是 &lt;code&gt;#f&lt;/code&gt;&lt;/strong&gt; (唯一 Falsy 值)  ，求值并返回 &lt;code&gt;&amp;lt;if-true&amp;gt;&lt;/code&gt;  ；否则求值并返回 &lt;code&gt;&amp;lt;if-false&amp;gt;&lt;/code&gt; 。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;过程&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;lambda&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;(lambda (&amp;lt;params&amp;gt;) &amp;lt;body&amp;gt;)&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;创建并返回一个 lambda 过程 (Procedure)&lt;/strong&gt;  。&lt;strong&gt;不求值&lt;/strong&gt;函数体 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;，函数体在过程被调用时才求值 。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;define&lt;/code&gt; 简化形式 (Function Shorthand)&lt;/strong&gt;:
&lt;code&gt;(define (square x) (* x x))&lt;/code&gt; 等同于 &lt;code&gt;(define square (lambda (x) (* x x)))&lt;/code&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题二数据抽象pairs-与-lists-data-abstraction-pairs-and-lists&#34;&gt;主题二：数据抽象：Pairs 与 Lists (Data Abstraction: Pairs and Lists)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-1&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;Scheme 中唯一的序列类型是&lt;strong&gt;链表 (Linked List)&lt;/strong&gt;  。链表是通过基本的构建块&lt;strong&gt;对 (Pairs)&lt;/strong&gt; 构成的 。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;核心概念-core-concepts&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-对-pairs&#34;&gt;1. 对 (Pairs)&lt;/h4&gt;
&lt;p&gt;对是使用 &lt;code&gt;cons&lt;/code&gt; 表达式创建的基本结构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cons&lt;/code&gt;&lt;/strong&gt;: 构造一个对 。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(cons &amp;lt;first&amp;gt; &amp;lt;second&amp;gt;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;car&lt;/code&gt;&lt;/strong&gt;: 选择对中的&lt;strong&gt;第一个元素&lt;/strong&gt; (Head) 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cdr&lt;/code&gt;&lt;/strong&gt;: 选择对中的&lt;strong&gt;第二个元素&lt;/strong&gt; (Tail) 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-链表-linked-lists&#34;&gt;2. 链表 (Linked Lists)&lt;/h4&gt;
&lt;p&gt;链表是通过递归地使用 &lt;code&gt;cons&lt;/code&gt; 构造对，并以特殊符号 &lt;code&gt;nil&lt;/code&gt; (空列表) 终止而形成的序列结构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;nil&lt;/code&gt;&lt;/strong&gt;: 表示&lt;strong&gt;空列表 (Empty List)&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;链表结构&lt;/strong&gt;：第二个元素 (&lt;code&gt;cdr&lt;/code&gt;) 必须是另一个对或 &lt;code&gt;nil&lt;/code&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例题：链表构造&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (cons &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; (cons &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; nil))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;; 列表的表示形式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;x (cons &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; (cons &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; nil)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (car x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (cdr x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;; 结果仍然是一个列表 (一个对，其 car 是 2，cdr 是 nil)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题三符号编程与引用-symbolic-programming-and-quotation&#34;&gt;主题三：符号编程与引用 (Symbolic Programming and Quotation)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-2&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;在 Scheme 中，符号 (Symbols) 通常求值为其绑定的值。&lt;strong&gt;引用 (Quotation)&lt;/strong&gt; 允许我们直接引用符号本身，而不是它的值 。这对于将 Scheme 代码结构作为数据处理（&lt;strong&gt;符号编程&lt;/strong&gt;）至关重要。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;核心概念-core-concepts-1&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-引用-quote-或-&#34;&gt;1. 引用 (&lt;code&gt;quote&lt;/code&gt; 或 &lt;code&gt;&#39;&lt;/code&gt;)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;: 阻止表达式被求值，而是将表达式本身作为值返回 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用方式&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;长形式: &lt;code&gt;(quote &amp;lt;expr&amp;gt;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;短形式: &lt;code&gt;&#39;&amp;lt;expr&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例题：引用符号&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;a &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (list a &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;; a 被求值为 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;; &amp;#39;a 被引用，求值为符号 a 本身&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-引用组合-quoting-combinations&#34;&gt;2. 引用组合 (Quoting Combinations)&lt;/h4&gt;
&lt;p&gt;引用也可以应用于组合表达式，使其成为一个&lt;strong&gt;列表数据结构&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例题：引用列表&lt;/strong&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(a b c)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; b c) &lt;span style=&#34;color:#75715e&#34;&gt;; 返回列表 (a b c)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (car &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(a b c))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a       &lt;span style=&#34;color:#75715e&#34;&gt;; car 选择列表的第一个元素&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (cdr &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(a b c))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; c)   &lt;span style=&#34;color:#75715e&#34;&gt;; cdr 选择列表的剩余部分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题四尾递归-tail-recursion&#34;&gt;主题四：尾递归 (Tail Recursion)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-3&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;Scheme 语言不内置迭代 (Iteration) 结构，循环通常通过&lt;strong&gt;递归 (Recursion)&lt;/strong&gt; 实现 。&lt;strong&gt;尾递归 (Tail Recursion)&lt;/strong&gt; 是一种特殊的递归形式，支持尾调用优化 (Tail Call Optimization)，能像迭代一样高效运行，使用&lt;strong&gt;常数 (Constant)&lt;/strong&gt; 数量的帧 (Frames) 。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;核心概念-1&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-尾上下文与尾调用-tail-context-and-tail-call&#34;&gt;1. 尾上下文与尾调用 (Tail Context and Tail Call)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;尾上下文 (Tail Context)&lt;/strong&gt;: 表达式在尾上下文中，意味着它是在函数调用中求值的&lt;strong&gt;最后一步&lt;/strong&gt;。在它求值/应用之后，&lt;strong&gt;没有其他操作&lt;/strong&gt;会进行 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尾调用 (Tail Call)&lt;/strong&gt;: 发生在尾上下文中的函数调用 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尾递归 (Tail Recursion)&lt;/strong&gt;: 尾调用调用了&lt;strong&gt;函数自身&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-尾调用优化-tail-call-optimization-tco&#34;&gt;2. 尾调用优化 (Tail Call Optimization, TCO)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;如果 Scheme 语言支持 TCO，一个尾递归函数&lt;strong&gt;只会开启常数数量的帧&lt;/strong&gt;，从而避免栈溢出，效率等同于迭代。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-识别尾上下文-identifying-tail-contexts&#34;&gt;3. 识别尾上下文 (Identifying Tail Contexts)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;是尾上下文 (Tail Contexts)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lambda&lt;/code&gt;（函数）的&lt;strong&gt;最后一个 body 子表达式&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;if&lt;/code&gt; 中的 &lt;code&gt;&amp;lt;if-true&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;if-false&amp;gt;&lt;/code&gt; (前提是 &lt;code&gt;if&lt;/code&gt; 表达式本身在尾上下文中)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;begin&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt; 中的&lt;strong&gt;最后一个子表达式&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不是尾上下文 (Non-Tail Contexts)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt; 等操作符下作为&lt;strong&gt;操作数 (Operand)&lt;/strong&gt; 的递归调用。因为操作数求值后，还需要进行操作符的运算。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例题：非尾递归阶乘 (Non-Tail Recursive Factorial)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;fact&lt;/span&gt; n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(= n &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt; 递归调用 (&lt;span style=&#34;color:#a6e22e&#34;&gt;fact&lt;/span&gt; (- n &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)) 的结果必须和 n 相乘
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt; 因此 (&lt;span style=&#34;color:#a6e22e&#34;&gt;fact&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;) 不在尾上下文&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，&lt;/span&gt;需要保留帧 f1, f2, &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (* n (&lt;span style=&#34;color:#a6e22e&#34;&gt;fact&lt;/span&gt; (- n &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)))))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;4-编写尾递归函数-writing-tail-recursive-functions&#34;&gt;4. 编写尾递归函数 (Writing Tail Recursive Functions)&lt;/h4&gt;
&lt;p&gt;要将非尾递归函数转换为尾递归，通常需要引入一个&lt;strong&gt;辅助函数 (Helper Function)&lt;/strong&gt; 和一个&lt;strong&gt;累加器 (Accumulator)&lt;/strong&gt; 参数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;: 将所有等待的计算（例如上面的 &lt;code&gt;* n&lt;/code&gt;）作为参数，传递给下一次递归调用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;累加器 (Accumulator)&lt;/strong&gt;: 存储到目前为止的计算结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例题：尾递归阶乘 (Tail Recursive Factorial)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;fact&lt;/span&gt; n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt; 引入辅助函数 fact-tail
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;fact-tail&lt;/span&gt; n result) &lt;span style=&#34;color:#75715e&#34;&gt;; result 就是累加器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(&amp;lt;= n &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt; 最后一步操作是 (&lt;span style=&#34;color:#a6e22e&#34;&gt;fact-tail&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt; 这是一个尾调用&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，&lt;/span&gt;无需保留当前帧&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#a6e22e&#34;&gt;fact-tail&lt;/span&gt; (- n &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) (* n result)))) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;fact-tail&lt;/span&gt; n &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)) &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt; 初始调用&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;，&lt;/span&gt;累加器从 &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; 开始
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题五表达式作为数据-expressions-as-data&#34;&gt;主题五：表达式作为数据 (Expressions As Data)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-4&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;Scheme 的核心理念是&lt;strong&gt;代码即数据 (Code as Data)&lt;/strong&gt;。由于 Scheme 表达式（组合）本身就是列表，我们可以将代码结构当作普通数据来操作。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-2&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-表达式的表示与求值-representation-and-evaluation&#34;&gt;1. 表达式的表示与求值 (Representation and Evaluation)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;表达式的类型&lt;/strong&gt;: 在 Scheme 中，表达式要么是&lt;strong&gt;原始表达式 (primitive expressions)&lt;/strong&gt;，要么是&lt;strong&gt;列表 (lists)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引用 (Quoting)&lt;/strong&gt;: &lt;code&gt;‘&amp;lt;expr&amp;gt;&lt;/code&gt; 或 &lt;code&gt;(quote &amp;lt;expr&amp;gt;)&lt;/code&gt; 阻止表达式求值，返回表达式本身（即一个数据结构）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;eval&lt;/code&gt; 函数&lt;/strong&gt;: 接收一个&lt;strong&gt;未求值 (unevaluated)&lt;/strong&gt; 的表达式（数据），并对其进行求值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例题&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(+ &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;; 引用，返回列表数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(+ &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (eval &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(+ &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)) &lt;span style=&#34;color:#75715e&#34;&gt;; 对该列表进行求值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;表达式的操作&lt;/strong&gt;: 我们可以将表达式赋值给变量、作为参数传递给函数、甚至在函数内创建并返回新的表达式。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题六辅助特殊形式-auxiliary-special-forms&#34;&gt;主题六：辅助特殊形式 (Auxiliary Special Forms)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-5&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;begin&lt;/code&gt; 和 &lt;code&gt;let&lt;/code&gt; 是 Scheme 中常用的特殊形式，用于控制求值顺序和局部变量的创建。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-3&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-begin-顺序执行&#34;&gt;1. &lt;code&gt;begin&lt;/code&gt; (顺序执行)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;: &lt;code&gt;begin&lt;/code&gt; 接收任意数量的子表达式。它会按&lt;strong&gt;顺序 (in order)&lt;/strong&gt; 求值这些子表达式，并以&lt;strong&gt;最后一个子表达式&lt;/strong&gt;的值作为整个 &lt;code&gt;begin&lt;/code&gt; 表达式的值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;: 当你需要在一个预期只有一个表达式的位置（如函数体）执行多个带有副作用的操作时，&lt;code&gt;begin&lt;/code&gt; 非常有用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例题&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;begin &lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;x &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) (&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;x (+ x &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)) x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;; 返回最后一个表达式 x 的值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-let-局部绑定&#34;&gt;2. &lt;code&gt;let&lt;/code&gt; (局部绑定)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;: &lt;code&gt;let&lt;/code&gt; 用于创建&lt;strong&gt;临时&lt;/strong&gt;的局部变量绑定，仅在 &lt;code&gt;let&lt;/code&gt; 的主体 (&lt;code&gt;body&lt;/code&gt;) 中有效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;绑定规则&lt;/strong&gt;: 所有的 &lt;code&gt;symbol&lt;/code&gt; 都与其对应的 &lt;code&gt;expr&lt;/code&gt; 的值&lt;strong&gt;并行 (in parallel)&lt;/strong&gt; 绑定。这意味着一个绑定不能引用同一 &lt;code&gt;let&lt;/code&gt; 表达式中定义的其他绑定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;let &lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;symbol1&lt;/span&gt; expr1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;symbol2&lt;/span&gt; expr2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;body&amp;gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;主题七宏原理-macro-principles&#34;&gt;主题七：宏原理 (Macro Principles)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-6&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;宏 (Macros) 是一种&lt;strong&gt;元编程 (Metaprogramming)&lt;/strong&gt; 工具，它允许用户在程序&lt;strong&gt;求值之前&lt;/strong&gt;转换程序的代码结构，从而扩展语言的语法。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-4&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-定义宏-define-macro&#34;&gt;1. 定义宏 (&lt;code&gt;define-macro&lt;/code&gt;)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;: &lt;code&gt;(define-macro (&amp;lt;name&amp;gt; &amp;lt;params&amp;gt;) &amp;lt;body&amp;gt;)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宏与过程的区别&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过程 (Procedure)&lt;/strong&gt;: 接收&lt;strong&gt;值 (values)&lt;/strong&gt; 作为参数，返回&lt;strong&gt;值&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宏 (Macro)&lt;/strong&gt;: 接收&lt;strong&gt;表达式 (expressions)&lt;/strong&gt; 作为参数，返回&lt;strong&gt;表达式&lt;/strong&gt;（代码）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-宏的求值流程-macro-evaluation-核心考点&#34;&gt;2. 宏的求值流程 (Macro Evaluation) &lt;strong&gt;【核心考点】&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;宏调用的求值流程有别于普通函数调用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不求值操作数 (Operands Not Evaluated)&lt;/strong&gt;: 宏的操作数&lt;strong&gt;不会&lt;/strong&gt;像普通函数调用那样被求值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传递表达式&lt;/strong&gt;: 操作数（表达式本身）作为参数传递给宏过程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宏转换&lt;/strong&gt;: 宏过程执行，返回一个新的&lt;strong&gt;表达式 (a new expression)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再次求值&lt;/strong&gt;: 解释器会立即对宏返回的&lt;strong&gt;新表达式&lt;/strong&gt;进行&lt;strong&gt;求值 (evaluated)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;3-宏的用途-writing-macros&#34;&gt;3. 宏的用途 (Writing Macros)&lt;/h4&gt;
&lt;p&gt;编写宏时，关键是思考&lt;strong&gt;具有等效行为的表达式是什么&lt;/strong&gt;。宏的目的是将自定义的语法转换为等效的 Scheme 基本语法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例题：&lt;code&gt;for&lt;/code&gt; 宏&lt;/strong&gt;: 转换 &lt;code&gt;(for x in &#39;(1 2 3 4) do (* x x))&lt;/code&gt; 为 &lt;code&gt;(map (lambda (x) (* x x)) &#39;(1 2 3 4))&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-macro&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt; sym in vals &lt;span style=&#34;color:#66d9ef&#34;&gt;do &lt;/span&gt;expr)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;map&lt;/span&gt; (list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;lambda&lt;/span&gt; (list sym) expr) vals))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;主题八准引用-quasi-quotation&#34;&gt;主题八：准引用 (Quasi-Quotation)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-7&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;在宏中，我们经常需要构造新的列表（表达式）。&lt;strong&gt;准引用 (Quasi-Quotation)&lt;/strong&gt; 允许在引用 (Quoting) 表达式的同时，有选择地对其中的部分子表达式进行求值，大大简化了代码生成。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-5&#34;&gt;核心概念&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;符号&lt;/th&gt;
          &lt;th&gt;英文标注&lt;/th&gt;
          &lt;th&gt;名称&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;```&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Quasiquote&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;准引用&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;允许列表中的大部分内容被视为字面值（像 &lt;code&gt;quote&lt;/code&gt; 一样）。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;,&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Unquote&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;取消引用&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;必须出现在准引用 ```` 内部。紧跟其后的表达式会被&lt;strong&gt;求值&lt;/strong&gt;，然后将其值插入到构造的列表中。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例题：使用准引用重写 &lt;code&gt;for&lt;/code&gt; 宏&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;define-macro&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt; sym vals expr)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;; 整个结构是准引用的 (`)，大部分是字面值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;; ,sym, ,expr, ,vals 在宏应用时会被求值并替换到相应位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(map (&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda &lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;sym) &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;expr) &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;vals)) 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;(&lt;/code&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;code&gt;map&lt;/code&gt;&lt;/strong&gt; 是字面符号。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;,sym&lt;/code&gt;&lt;/strong&gt; 求值结果是符号 &lt;code&gt;x&lt;/code&gt;，被插入到 &lt;code&gt;lambda&lt;/code&gt; 的参数列表中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;,expr&lt;/code&gt;&lt;/strong&gt; 求值结果是表达式 &lt;code&gt;(* x x)&lt;/code&gt;，被插入到 &lt;code&gt;lambda&lt;/code&gt; 的函数体中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;,vals&lt;/code&gt;&lt;/strong&gt; 求值结果是表达式 &lt;code&gt;&#39;(1 2 3 4)&lt;/code&gt;，被插入到 &lt;code&gt;map&lt;/code&gt; 的第二个参数位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;函数1:twice
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;方式1:正常函数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;twice&lt;/span&gt; exp) (list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;begin&lt;/span&gt; exp exp))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;twice
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (eval (&lt;span style=&#34;color:#a6e22e&#34;&gt;twice&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;(print &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;方式2:macro
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;define-macro&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;twice&lt;/span&gt; exp) (list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;begin&lt;/span&gt; exp exp))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;twice
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;twice&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;即macro只是相当于省略了调用时需要的eval 和&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;方式3:准引用(&lt;span style=&#34;color:#a6e22e&#34;&gt;suger&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;define-macro&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;twice&lt;/span&gt; exp) &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;begin &lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;exp &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;exp))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;twice
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;twice&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;函数2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;define-macro&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;add-to&lt;/span&gt; sym exp) (list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;define&lt;/span&gt; sym (list &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;+&lt;/span&gt; sym exp)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add-to
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;add-to&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;x&lt;/span&gt; (+ x &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;define-macro&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;add-to&lt;/span&gt; sym exp) &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;sym (+ &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;sym &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;exp)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;add-to
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;add-to&lt;/span&gt; x (+ x &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;62&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;函数3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;define-macro&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt; sym in val &lt;span style=&#34;color:#66d9ef&#34;&gt;do &lt;/span&gt;exp) &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;(map (&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda &lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;sym) &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;exp) &lt;span style=&#34;color:#f92672&#34;&gt;,&lt;/span&gt;val))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;for
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt; i in (list &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;do &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;print&lt;/span&gt; i))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;undefined&lt;/span&gt; undefined undefined)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;上面这行是map的返回值,即None,None,None&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;主题九惰性求值与流基础-lazy-evaluation--stream-basics&#34;&gt;主题九：惰性求值与流基础 (Lazy Evaluation &amp;amp; Stream Basics)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-8&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;流 (Streams)&lt;/strong&gt; 是 Scheme 中处理序列的一种方式。它与链表（List）非常相似，但核心区别在于：流的“剩余部分”（tail）只有在被显式要求时才会进行计算。这种机制被称为&lt;strong&gt;惰性求值 (Lazy Evaluation)&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-6&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-为什么需要流&#34;&gt;1. 为什么需要流？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python 对比&lt;/strong&gt;: Python 使用迭代器（Iterators）和生成器（Generators）来实现惰性求值，可以表示无限序列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scheme 链表的局限&lt;/strong&gt;: 在标准链表中，&lt;code&gt;cons&lt;/code&gt; 的第二个参数总是会被立即求值。如果尝试递归定义无限链表，会导致 &lt;code&gt;maximum recursion depth exceeded&lt;/code&gt;（达到最大递归深度）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流的优势&lt;/strong&gt;: 流允许我们表示巨大的甚至&lt;strong&gt;无限长 (infinitely long)&lt;/strong&gt; 的列表，因为它只在需要时计算下一个元素。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-流的构造与基本操作&#34;&gt;2. 流的构造与基本操作&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cons-stream&lt;/code&gt;&lt;/strong&gt;: 构造一个流。其第二个参数是一个&lt;strong&gt;承诺 (Promise)&lt;/strong&gt;，不会立即求值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;car&lt;/code&gt;&lt;/strong&gt;: 获取流的第一个元素（与 List 相同）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cdr-stream&lt;/code&gt;&lt;/strong&gt;: 获取流的剩余部分。这是关键操作：它会&lt;strong&gt;强制 (Force)&lt;/strong&gt; 履行承诺，计算并返回流的下一个部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例题：流的表示&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;s (&lt;span style=&#34;color:#a6e22e&#34;&gt;cons-stream&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;cons-stream&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; nil)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;[promise (not forced)])  &lt;span style=&#34;color:#75715e&#34;&gt;; 第二部分显示为尚未强制的承诺&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (car s)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;cdr-stream&lt;/span&gt; s)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;#&lt;/span&gt;[promise (not forced)])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;主题十一无限流-infinite-streams&#34;&gt;主题十一：无限流 (Infinite Streams)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-9&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;由于流是惰性求值的，我们可以定义一个在逻辑上永远不会结束的序列。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-7&#34;&gt;核心概念&lt;/h3&gt;
&lt;h4 id=&#34;1-定义无限流&#34;&gt;1. 定义无限流&lt;/h4&gt;
&lt;p&gt;通过在 &lt;code&gt;cons-stream&lt;/code&gt; 的第二个参数中进行递归调用，可以创建一个无限序列。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例题：整数流 (Integer Stream)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ints&lt;/span&gt; first)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;cons-stream&lt;/span&gt; first (&lt;span style=&#34;color:#a6e22e&#34;&gt;ints&lt;/span&gt; (+ first &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;s (&lt;span style=&#34;color:#a6e22e&#34;&gt;ints&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (car s)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scm&amp;gt; (car (&lt;span style=&#34;color:#a6e22e&#34;&gt;cdr-stream&lt;/span&gt; s))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-使用高阶函数操作流&#34;&gt;2. 使用高阶函数操作流&lt;/h4&gt;
&lt;p&gt;我们可以像操作 List 一样编写流的操作函数，只需将 &lt;code&gt;cons&lt;/code&gt; 替换为 &lt;code&gt;cons-stream&lt;/code&gt;，将 &lt;code&gt;cdr&lt;/code&gt; 替换为 &lt;code&gt;cdr-stream&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;map-stream&lt;/code&gt; (流映射)&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;map-stream&lt;/span&gt; fn s)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(null? s)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      nil
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;cons-stream&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;fn&lt;/span&gt; (car s))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   (&lt;span style=&#34;color:#a6e22e&#34;&gt;map-stream&lt;/span&gt; fn (&lt;span style=&#34;color:#a6e22e&#34;&gt;cdr-stream&lt;/span&gt; s)))))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;filter-stream&lt;/code&gt; (流过滤)&lt;/strong&gt;:
只有当满足条件的元素被找到时，才会构造流的下一个 &lt;code&gt;car&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题十二流的高级应用-advanced-stream-applications&#34;&gt;主题十二：流的高级应用 (Advanced Stream Applications)&lt;/h2&gt;
&lt;h3 id=&#34;核心概念-core-concepts-2&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-递归定义的流-self-referencing-streams&#34;&gt;1. 递归定义的流 (Self-referencing Streams)&lt;/h4&gt;
&lt;p&gt;流可以引用自身来定义复杂的序列。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全 1 流 (Ones)&lt;/strong&gt;: &lt;code&gt;(define ones (cons-stream 1 ones))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;整数流 (Integers)&lt;/strong&gt;:
通过将“全 1 流”与“当前整数流”相加得到下一个整数。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;ones (&lt;span style=&#34;color:#a6e22e&#34;&gt;cons-stream&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ones))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;define &lt;/span&gt;ints (&lt;span style=&#34;color:#a6e22e&#34;&gt;cons-stream&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;add-stream&lt;/span&gt; ones ints)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-流与列表的转换&#34;&gt;2. 流与列表的转换&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;stream-to-list&lt;/code&gt;&lt;/strong&gt;: 为了查看流的内容，通常需要将其转换为列表，并指定获取元素的数量（避免死循环）。&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>SICP_python_期中后笔记</title>
      <link>https://cloudymount789.github.io/blog/sicp_note_after_mid/</link>
      <pubDate>Sat, 03 Jan 2026 12:47:27 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/sicp_note_after_mid/</guid>
      <description>&lt;p&gt;摘要&lt;/p&gt;
&lt;p&gt;本文为《计算机程序的构造和解释》（SICP，CS61A 南大引进版）python部分期中后课程核心笔记，聚焦程序设计的底层逻辑与核心思想，旨在帮助学习者搭建“知其然更知其所以然”的编程认知框架。适合正在学习 CS61A 课程的学习者梳理知识体系，也可作为编程入门者夯实基础、理解程序设计本质的参考资料。&lt;/p&gt;
&lt;h1 id=&#34;sicp_python_期中后笔记&#34;&gt;SICP_python_期中后笔记&lt;/h1&gt;
&lt;hr&gt;
&lt;h2 id=&#34;拓展&#34;&gt;拓展&lt;/h2&gt;
&lt;h3 id=&#34;1-imperative-programming命令式编程&#34;&gt;1. Imperative Programming（命令式编程）&lt;/h3&gt;
&lt;h4 id=&#34;核心思想&#34;&gt;核心思想&lt;/h4&gt;
&lt;p&gt;通过一系列指令（statements）改变程序的状态（state）来完成计算。
关注 HOW（具体步骤）。&lt;/p&gt;
&lt;h4 id=&#34;特征&#34;&gt;特征&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;有可变变量（variables）&lt;/li&gt;
&lt;li&gt;通过赋值（assignment）改变状态&lt;/li&gt;
&lt;li&gt;使用控制结构（control flow）：if / for / while&lt;/li&gt;
&lt;li&gt;程序表现为逐步执行的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;常见语言&#34;&gt;常见语言&lt;/h4&gt;
&lt;p&gt;C、C++、Java、Python、JavaScript、Go、Rust&lt;/p&gt;
&lt;h4 id=&#34;适用场景&#34;&gt;适用场景&lt;/h4&gt;
&lt;p&gt;操作系统、游戏开发、需要精确流程控制或高性能的系统&lt;/p&gt;
&lt;h3 id=&#34;2-functional-programming函数式编程&#34;&gt;2. Functional Programming（函数式编程）&lt;/h3&gt;
&lt;h4 id=&#34;核心思想-1&#34;&gt;核心思想&lt;/h4&gt;
&lt;p&gt;以数学函数为基础，不依赖可变状态，通过函数组合完成计算。
关注 WHAT（要做什么）。&lt;/p&gt;
&lt;h4 id=&#34;特征-1&#34;&gt;特征&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;不可变性（immutability）&lt;/li&gt;
&lt;li&gt;纯函数（pure functions），无副作用（side effects）&lt;/li&gt;
&lt;li&gt;函数是一等公民（first-class functions）&lt;/li&gt;
&lt;li&gt;常用递归（recursion）&lt;/li&gt;
&lt;li&gt;map / filter / reduce 是典型操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;常见语言-1&#34;&gt;常见语言&lt;/h4&gt;
&lt;p&gt;Haskell、Lisp、OCaml、F#；Python/JavaScript 可写函数式风格&lt;/p&gt;
&lt;h4 id=&#34;示例python&#34;&gt;示例（Python）&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;numbers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; list(map(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; x: x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, numbers))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;适用场景-1&#34;&gt;适用场景&lt;/h4&gt;
&lt;p&gt;数学计算、并行计算、金融系统、需要高可预测性的程序&lt;/p&gt;
&lt;h3 id=&#34;3-logic-programming逻辑式编程&#34;&gt;3. Logic Programming（逻辑式编程）&lt;/h3&gt;
&lt;h4 id=&#34;核心思想-2&#34;&gt;核心思想&lt;/h4&gt;
&lt;p&gt;使用事实（facts）和规则（rules）描述问题，由系统进行自动推理（inference）。
关注 WHAT（描述规则），系统决定 HOW（如何推导）。&lt;/p&gt;
&lt;h4 id=&#34;特征-2&#34;&gt;特征&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;程序由 facts + rules + queries 组成&lt;/li&gt;
&lt;li&gt;基于一阶逻辑（first-order logic）&lt;/li&gt;
&lt;li&gt;使用分辨率（resolution）进行推理&lt;/li&gt;
&lt;li&gt;强调声明式描述&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;常见语言-2&#34;&gt;常见语言&lt;/h4&gt;
&lt;p&gt;Prolog（代表性语言）&lt;/p&gt;
&lt;h4 id=&#34;示例prolog&#34;&gt;示例（Prolog）&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-prolog&#34; data-lang=&#34;prolog&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;tom&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;bob&lt;/span&gt;).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;bob&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;ann&lt;/span&gt;).
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;grandparent&lt;/span&gt;(X, Y) :- &lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;(X, Z), &lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;(Z, Y).
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;适用场景-2&#34;&gt;适用场景&lt;/h4&gt;
&lt;p&gt;人工智能、知识库、规则引擎、专家系统&lt;/p&gt;
&lt;h3 id=&#34;4-三种范式对比总结&#34;&gt;4. 三种范式对比总结&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;范式&lt;/th&gt;
          &lt;th&gt;核心思想&lt;/th&gt;
          &lt;th&gt;状态 State&lt;/th&gt;
          &lt;th&gt;特征关键词&lt;/th&gt;
          &lt;th&gt;示例语言&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;命令式 Imperative&lt;/td&gt;
          &lt;td&gt;通过指令改变状态（HOW）&lt;/td&gt;
          &lt;td&gt;可变&lt;/td&gt;
          &lt;td&gt;assignment, loops, control flow&lt;/td&gt;
          &lt;td&gt;C, Java, Python&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;函数式 Functional&lt;/td&gt;
          &lt;td&gt;用函数组合描述计算（WHAT）&lt;/td&gt;
          &lt;td&gt;不可变&lt;/td&gt;
          &lt;td&gt;pure functions, immutability, recursion&lt;/td&gt;
          &lt;td&gt;Haskell, Lisp&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;逻辑式 Logic&lt;/td&gt;
          &lt;td&gt;用规则推理得到结果（WHAT）&lt;/td&gt;
          &lt;td&gt;无显式状态&lt;/td&gt;
          &lt;td&gt;facts, rules, queries, inference&lt;/td&gt;
          &lt;td&gt;Prolog&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&#34;编译器理解-词法---语法---语义&#34;&gt;编译器理解: 词法 -&amp;gt; 语法 -&amp;gt; 语义&lt;/h3&gt;
&lt;h4 id=&#34;lexical词法&#34;&gt;Lexical（词法）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;把字符拆成最小有意义单位（token）。&lt;/strong&gt;
识别：变量名、关键字、数字、字符串、运算符、符号等。
作用：告诉编译器“这串字符是什么词”。&lt;/p&gt;
&lt;h4 id=&#34;syntax语法&#34;&gt;Syntax（语法）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;检查 token 是否能组成合法的结构。&lt;/strong&gt;
作用：决定一句代码的结构是否符合语言规则（是否“通顺”）。&lt;/p&gt;
&lt;h4 id=&#34;semantics语义&#34;&gt;Semantics（语义）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;代码表达的实际含义与执行效果。&lt;/strong&gt;
作用：定义语句运行后会做什么、得到什么结果。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;代码风格类型提示type-hint&#34;&gt;代码风格:类型提示(type hint)&lt;/h2&gt;
&lt;p&gt;检查 Python 版本：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import platform
print(platform.python_version())
3.12.7
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装 MyPy ：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ python -m pip install mypy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 MyPy 进行类型检查：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ mypy program.py
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;1-变量-variables&#34;&gt;1. 变量 (Variables)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;声明变量类型&lt;/strong&gt;
使用冒号 &lt;code&gt;:&lt;/code&gt; 来声明变量类型。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;age: int &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;未初始化的变量注解&lt;/strong&gt;
不需要立即给变量赋值即可添加注解。这在条件分支赋值中非常有用（运行时直到赋值前没有具体值）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a: int  &lt;span style=&#34;color:#75715e&#34;&gt;# 合法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 示例：在条件分支中使用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;child: bool
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; age &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;18&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    child &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    child &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;2-常用的内置类型-useful-built-in-types&#34;&gt;2. 常用的内置类型 (Useful Built-In Types)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;基本类型&lt;/strong&gt;
大多数情况下，直接使用类型名称即可。
&lt;em&gt;注意：mypy 通常能推断出变量类型，因此显式注解在技术上是冗余的，但有助于代码清晰。&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: int &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: float &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: bool &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: bytes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;集合类型 (Collections) - Python 3.9+&lt;/strong&gt;
集合内元素的类型放在方括号 &lt;code&gt;[]&lt;/code&gt; 中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;列表 (List):&lt;/strong&gt; &lt;code&gt;x: list[int] = [1]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集合 (Set):&lt;/strong&gt; &lt;code&gt;x: set[int] = {6, 7}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;映射类型 (Mappings)&lt;/strong&gt;
需要同时指定键 (Key) 和值 (Value) 的类型。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;字典 (Dict):&lt;/strong&gt; &lt;code&gt;x: dict[str, float] = {&amp;quot;field&amp;quot;: 2.0}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;元组 (Tuples)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;固定大小:&lt;/strong&gt; 需要指定所有元素的类型。
&lt;code&gt;x: tuple[int, str, float] = (3, &amp;quot;yes&amp;quot;, 7.5)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可变大小:&lt;/strong&gt; 使用一种类型加上省略号 &lt;code&gt;...&lt;/code&gt;。
&lt;code&gt;x: tuple[int, ...] = (1, 2, 3)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;联合类型 (Union Types) - Python 3.10+&lt;/strong&gt;
当值可能是多种类型之一时，使用 &lt;code&gt;|&lt;/code&gt; 运算符。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: list[int &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; str] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fun&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;可选类型 (Optional Types)&lt;/strong&gt;
对于可能为 &lt;code&gt;None&lt;/code&gt; 的值，使用 &lt;code&gt;X | None&lt;/code&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: str &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;something&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; some_condition() &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 类型缩窄 (Type Narrowing)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;upper())  &lt;span style=&#34;color:#75715e&#34;&gt;# Mypy 知道此处 x 不为 None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 如果逻辑上确定不为 None 但 mypy 无法推断，可使用 assert&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;assert&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;upper())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;3-函数-functions&#34;&gt;3. 函数 (Functions)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;函数定义注解&lt;/strong&gt;
使用 &lt;code&gt;-&amp;gt;&lt;/code&gt; 指定返回类型。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;stringify&lt;/span&gt;(num: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; str:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; str(num)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;多个参数&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plus&lt;/span&gt;(num1: int, num2: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; num1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; num2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;无返回值&lt;/strong&gt;
如果函数不返回值，返回类型使用 &lt;code&gt;None&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;默认值:&lt;/strong&gt; 参数的默认值写在类型注解之后。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;(value: str, excitement: int &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(value &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;!&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; excitement)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;动态类型 (Dynamic Typing)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;未指定类型的参数会被视为 &lt;code&gt;Any&lt;/code&gt;（动态类型）。&lt;/li&gt;
&lt;li&gt;没有任何注解的函数不会被类型检查器检查。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;untyped&lt;/span&gt;(x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;anything() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 不会报错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;可调用对象 (Callables)&lt;/strong&gt;
用于注解函数作为参数传递的情况（需要从 &lt;code&gt;collections.abc&lt;/code&gt; 导入）。
格式：&lt;code&gt;Callable[[参数类型列表], 返回类型]&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; collections.abc &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Callable
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;(x: int, y: float) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; float:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x: Callable[[int, float], float] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;生成器 (Generators)&lt;/strong&gt;
生成器函数实际上是返回一个迭代器，因此使用 &lt;code&gt;Iterator&lt;/code&gt; 进行注解。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; collections.abc &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Iterator
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gen&lt;/span&gt;(n: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; Iterator[int]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; n:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt; i
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        i &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;多行函数注解&lt;/strong&gt;
当参数较多时，可以将注解拆分为多行。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;send_email&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    address: str &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; list[str],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sender: str,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cc: list[str] &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bcc: list[str] &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subject: str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    body: list[str] &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; bool:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;主题-1面向对象编程基础-object-oriented-programming-oop&#34;&gt;主题 1：面向对象编程基础 (Object-Oriented Programming, OOP)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述&#34;&gt;主题概述&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OOP 是一种组织程序的方法，将数据（&lt;strong&gt;属性 Attributes&lt;/strong&gt;）和行为（&lt;strong&gt;方法 Methods&lt;/strong&gt;）捆绑在一起。每个对象拥有自己的&lt;strong&gt;局部状态 (Local State)&lt;/strong&gt;，不同对象之间通过方法调用进行交互。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这是一种以“对象（objects）”为中心的程序设计方法。对象把数据（属性 attributes）和操作这些数据的行为（方法 methods）封装在一起，通过对象之间的交互来完成程序的功能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个对象都有两个特点：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;它有什么（属性 / 数据）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;它能做什么（行为 / 方法）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;OOP 的三要素（经典版本）&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;封装（Encapsulation）：把数据与操作封在对象内部，对外提供有限接口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;继承（Inheritance）：子类可以继承父类的属性和方法，实现代码复用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多态（Polymorphism）：同一方法名在不同对象上有不同实现，运行时动态决定调用哪个版本。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一句话总结&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;正经版：&lt;em&gt;&lt;strong&gt;OOP = 用对象来组织程序，数据 + 行为一起封装，通过继承复用，通过多态扩展。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;形象版：&lt;em&gt;&lt;strong&gt;OOP = 把程序写成一堆“现实世界中的小东西”，每个东西都有属性、有行为，它们互相合作，程序就跑起来了。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;创建对象，让对象自己按照规则做事&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-类与实例-classes-and-instances&#34;&gt;1. 类与实例 (Classes and Instances)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;类 (Class)&lt;/strong&gt;: 对象的模板。定义了所有实例共享的属性和行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实例 (Instance)&lt;/strong&gt;: 类的具体实现。例如，&lt;code&gt;Account&lt;/code&gt; 是类，&lt;code&gt;tom_account&lt;/code&gt; 是一个实例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构造函数 (&lt;code&gt;__init__&lt;/code&gt;)&lt;/strong&gt;: 当创建一个新实例时自动调用的方法，用于初始化实例属性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;self&lt;/code&gt;&lt;/strong&gt;: 指向&lt;strong&gt;当前正在被操作的实例&lt;/strong&gt;。在类内部定义方法时，第一个参数通常是 &lt;code&gt;self&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-属性查找机制-attribute-lookup&#34;&gt;2. 属性查找机制 (Attribute Lookup)&lt;/h4&gt;
&lt;p&gt;当我们求值 &lt;code&gt;&amp;lt;expression&amp;gt;.&amp;lt;name&amp;gt;&lt;/code&gt; 时，解释器遵循以下顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;求值&lt;/strong&gt;点号左边的 &lt;code&gt;&amp;lt;expression&amp;gt;&lt;/code&gt;，得到一个对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查找实例属性&lt;/strong&gt;: 在该对象的实例属性中查找 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt;。如果找到，返回其值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查找类属性&lt;/strong&gt;: 如果实例中没找到，去创建该对象的&lt;strong&gt;类&lt;/strong&gt;中查找。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查找父类&lt;/strong&gt;: 如果类中没找到，沿着继承链向上查找。&lt;/li&gt;
&lt;li&gt;如果找到的是一个函数，则返回一个&lt;strong&gt;绑定方法 (Bound Method)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; &lt;strong&gt;赋值操作&lt;/strong&gt; (&lt;code&gt;obj.x = 1&lt;/code&gt;) 总是会在&lt;strong&gt;实例&lt;/strong&gt;上创建或修改属性，而不会修改类属性。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;3-点表达式的评估evaluation-of-dot-expression&#34;&gt;3. 点表达式的评估（Evaluation of Dot Expression）&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;expression&amp;gt;.&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;求值点号左侧expression，返回对象&lt;/li&gt;
&lt;li&gt;将 &lt;name&gt; 与该对象的实例属性进行匹配；如果存在具有该名称的属性，则返回其值。&lt;/li&gt;
&lt;li&gt;否则，在类中一层一层向上查找 &lt;name&gt; ，这将产生一个类属性值（如果不存在这样的类属性，则会报告 AttributeError）。&lt;/li&gt;
&lt;li&gt;不是函数 -&amp;gt; 返回该值；&lt;/li&gt;
&lt;li&gt;是函数 -&amp;gt; 返回绑定方法，且将self传入第一个参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;例题&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;例1: &lt;strong&gt;封装（Encapsulation）&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why we need Encapsulation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protect data security&lt;/li&gt;
&lt;li&gt;Reduce coupling&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;例1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# class attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    interest &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.02&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# constructor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, account_holder): 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;balance &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# instance attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;holder &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; account_holder
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# methods&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;deposit&lt;/span&gt;(self, amount): 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;balance &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; amount
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;balance
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;withdraw&lt;/span&gt;(self, amount):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; amount &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;balance:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Insufficient funds&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;balance &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; amount
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;balance
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jacy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Account(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Jacy&amp;#39;&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;&amp;gt;&amp;gt; jacy.balance
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;&amp;gt;&amp;gt; jacy.deposit(10)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;&amp;gt;&amp;gt; jacy.withdraw(5)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;例2：&lt;strong&gt;类属性查找（Class attribute lookup）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;If it names an attribute in the class, return the attribute value.
如果它指定了类中的一个属性，则返回该属性的值。&lt;/li&gt;
&lt;li&gt;Otherwise, look up the name in the base class, if there is one.
否则，在基类中查找该名称（如果有的话）。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;例2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;A&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    z &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; B(x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;A()&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;B&lt;/span&gt;(A):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt; (self, y):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; y:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;f(y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; C(y &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;B(z=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;C&lt;/span&gt;(B):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;C(z=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; A()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; B(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; C(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; C&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B(z&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;B(z&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;C(z&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#为什么C的z是1呢？&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#B中的z是一个instance attribute，理论上C在B中找不到不应该去A中找然后得到z=-1吗？&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#因为C没有init！！！所以C在创建instance 的时候就会调用一次B的init，&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#从而在执行init的时候获得一个z！&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#C 继承 B 的 init ，所以走 B.init：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# y = 1   非零&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# self.z = self.f(1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 但这次 self 是 C 的实例，所以调用的是 C.f：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# C.f(self, 1) → return 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 因此：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# C(1).z = 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B(z&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;C(z&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;C(z&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback (most recent call last):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;&lt;/span&gt;, line &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;module&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;AttributeError&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;int&amp;#39;&lt;/span&gt; object has no attribute &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;z&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;拓展lsp-里氏替换原则&#34;&gt;&lt;strong&gt;拓展:LSP: 里氏替换原则：&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;凡是出现基类的地方，都可以用子类替换它，而不会影响程序的功能。&lt;/li&gt;
&lt;li&gt;这意味着子类可以使用基类的所有操作而不出现问题&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;class T:
...    pass
...class S(T): # inheritance creats subtypes
...    pass
&amp;gt;&amp;gt;&amp;gt;t = T()
&amp;gt;&amp;gt;&amp;gt;s = S()	
&amp;gt;&amp;gt;&amp;gt;isinstance(t, T)	
True	
&amp;gt;&amp;gt;&amp;gt;isinstance(s, S)	
True
&amp;gt;&amp;gt;&amp;gt;isinstance(s, T)	
True
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;3-方法-methods&#34;&gt;3. 方法 (Methods)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;函数 (Function)&lt;/strong&gt;: 也就是普通的 Python 函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;绑定方法 (Bound Method)&lt;/strong&gt;: 将函数与特定对象（实例）“绑定”在一起。调用时，Python 会自动将该对象作为第一个参数 (&lt;code&gt;self&lt;/code&gt;) 传入。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Account.deposit&lt;/code&gt; 是函数 (Function)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tom.deposit&lt;/code&gt; 是方法 (Method)。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题-2继承与组合-inheritance--composition&#34;&gt;主题 2：继承与组合 (Inheritance &amp;amp; Composition)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-1&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;继承允许我们基于已有的类创建新类，实现代码复用和特化。组合则是通过将其他对象作为属性来实现复杂功能。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts-1&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-继承-inheritance&#34;&gt;1. 继承 (Inheritance)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;子类 (Subclass)&lt;/strong&gt; 继承 &lt;strong&gt;基类 (Base Class)&lt;/strong&gt; 的所有属性和方法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重写 (Overriding)&lt;/strong&gt;: 子类可以重新定义与父类同名的方法，从而改变行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;super()&lt;/code&gt;&lt;/strong&gt;: 用于在子类中调用父类的方法，常用于扩展 &lt;code&gt;__init__&lt;/code&gt; 或复用父类逻辑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码示例&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CheckingAccount&lt;/span&gt;(Account): &lt;span style=&#34;color:#75715e&#34;&gt;# 继承 Account&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    withdraw_fee &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    interest &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.01&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;withdraw&lt;/span&gt;(self, amount):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 复用父类的 withdraw 方法，加上手续费&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Account&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;withdraw(self, amount &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;withdraw_fee)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-多重继承-multiple-inheritance&#34;&gt;2. 多重继承 (Multiple Inheritance)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;一个类可以继承自多个父类。&lt;/li&gt;
&lt;li&gt;拓展：&lt;strong&gt;菱形问题 (Diamond Problem)&lt;/strong&gt;: 当多个父类继承自同一个祖先时，Python 使用 &lt;strong&gt;C3 线性化算法&lt;/strong&gt; 确定 &lt;strong&gt;方法解析顺序 (MRO)&lt;/strong&gt;，确保每个类只被访问一次。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-继承-vs-组合-inheritance-vs-composition&#34;&gt;3. 继承 vs. 组合 (Inheritance vs. Composition)&lt;/h4&gt;
&lt;p&gt;这是面向对象设计的核心权衡：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;继承 (&amp;ldquo;Is-a&amp;rdquo; 关系)&lt;/strong&gt;: &lt;code&gt;CheckingAccount&lt;/code&gt; &lt;strong&gt;是一个&lt;/strong&gt; &lt;code&gt;Account&lt;/code&gt;。用于特化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组合 (&amp;ldquo;Has-a&amp;rdquo; 关系)&lt;/strong&gt;: &lt;code&gt;Bank&lt;/code&gt; &lt;strong&gt;有一个&lt;/strong&gt; &lt;code&gt;Account&lt;/code&gt; 列表。用于通过聚合现有组件来构建复杂对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题-3多态ploymorphism&#34;&gt;主题 3：多态(Ploymorphism)&lt;/h2&gt;
&lt;h3 id=&#34;分类&#34;&gt;分类&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;特设多态（Ad Hoc Ploymorphism）：同名methon但是不同实现规则
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;操作符重载（operator overloading）: 同样运算符，不同操作方式&lt;/p&gt;
&lt;p&gt;e.g.
&lt;code&gt;x + y&lt;/code&gt; 本质上是 &lt;code&gt;x.__add__(y)&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;x == y&lt;/code&gt; 本质上是 &lt;code&gt;x.__eq__(y)&lt;/code&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多态函数（polymorphism）: 函数根据输入类型改变行为&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;参数多态（parametric polymorphism）: 泛型多态（拓展）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; typing &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; TypeVar, List
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;T &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; TypeVar(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;T&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;(lst: List[T]) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; T:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; lst[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;包含多态（inclusion polymorphism）: 继承多态，子类代替父类使用&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题-4特殊方法-special-methods&#34;&gt;主题 4：特殊方法 (Special Methods)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-2&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;特殊方法（也称魔术方法，以双下划线开头和结尾）允许自定义对象表现得像 Python 的内置类型。这是实现 &lt;strong&gt;多态 (Polymorphism)&lt;/strong&gt; 的关键。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts-2&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-字符串表示repr--str&#34;&gt;1. 字符串表示(repr &amp;amp; str)&lt;/h4&gt;
&lt;h5 id=&#34;区别&#34;&gt;区别&lt;/h5&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方法&lt;/th&gt;
          &lt;th&gt;英文&lt;/th&gt;
          &lt;th&gt;目标受众&lt;/th&gt;
          &lt;th&gt;触发方式&lt;/th&gt;
          &lt;th&gt;默认行为&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;__str__&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;String&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;人类 (Human)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;print()&lt;/code&gt;, &lt;code&gt;str()&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;如果没定义，会调用 &lt;code&gt;__repr__&lt;/code&gt;。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;__repr__&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Representation&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;解释器 (Interpreter)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;交互式环境, &lt;code&gt;repr()&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;返回对象的规范字符串表示，理想情况下 &lt;code&gt;eval(repr(obj)) == obj&lt;/code&gt;。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h5 id=&#34;例题&#34;&gt;&lt;strong&gt;例题&lt;/strong&gt;：&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, n, d): self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;n, self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;d &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n, d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fraction(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;n&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;, &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;d&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__str__&lt;/span&gt;(self): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;n&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;d&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Fraction(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(f)       &lt;span style=&#34;color:#75715e&#34;&gt;# 输出: 1/2 (调用 __str__)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f              &lt;span style=&#34;color:#75715e&#34;&gt;# 输出: Fraction(1, 2) (调用 __repr__)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;易错关于引号&#34;&gt;[易错]关于引号&amp;hellip;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;str&lt;/code&gt;和&lt;code&gt;repr&lt;/code&gt;的区别&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;函数&lt;/th&gt;
          &lt;th&gt;目的&lt;/th&gt;
          &lt;th&gt;面向对象&lt;/th&gt;
          &lt;th&gt;输出特点&lt;/th&gt;
          &lt;th&gt;是否显示引号&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;str(obj)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;面向用户（友好展示）&lt;/td&gt;
          &lt;td&gt;用户&lt;/td&gt;
          &lt;td&gt;可读性强、简洁&lt;/td&gt;
          &lt;td&gt;❌ 不显示引号&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;repr(obj)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;面向开发、调试&lt;/td&gt;
          &lt;td&gt;程序员&lt;/td&gt;
          &lt;td&gt;尽可能准确、可复现&lt;/td&gt;
          &lt;td&gt;✅ 显示引号（字符串时）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;示例&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(str(s))   &lt;span style=&#34;color:#75715e&#34;&gt;# hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(repr(s))  &lt;span style=&#34;color:#75715e&#34;&gt;# &amp;#39;hello&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;repr&lt;/code&gt; 的目标是 &lt;strong&gt;让结果能用于重新构造对象&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;eval(repr(s)) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; s  &lt;span style=&#34;color:#75715e&#34;&gt;# True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;code&gt;print()&lt;/code&gt;和交互式解释器输出的区别&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方式&lt;/th&gt;
          &lt;th&gt;内部调用&lt;/th&gt;
          &lt;th&gt;引号是否显示&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;print(obj)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;str(obj)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;❌ 不显示引号&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;在交互式解释器直接输入表达式&lt;/td&gt;
          &lt;td&gt;显示 &lt;code&gt;repr(obj)&lt;/code&gt; 的结果&lt;/td&gt;
          &lt;td&gt;✅ 显示引号（字符串时）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;示例：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 REPL 中：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hello
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;自定义类的 &lt;code&gt;__str__&lt;/code&gt; 和 &lt;code&gt;__repr__&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果类同时定义了 &lt;code&gt;__str__&lt;/code&gt; 和 &lt;code&gt;__repr__&lt;/code&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;调用者&lt;/th&gt;
          &lt;th&gt;优先使用的方法&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;print(obj)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;__str__&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;解释器直接显示&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;__repr__&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;eval() 是 Python 内置函数，用来 将字符串当作 Python 表达式求值，然后返回表达式的结果。&lt;/strong&gt;
示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;A&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__str__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;str display&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;repr display&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; A()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(a)   &lt;span style=&#34;color:#75715e&#34;&gt;# str display&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a          &lt;span style=&#34;color:#75715e&#34;&gt;# repr display&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#没有引号!!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;repr函数会将接收到的参数变成一个字符串交给交互式解释器,然后交互式解释器去掉最外一层引号的内容把字符串里的内容显示出来&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; repr(a)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; repr(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#39;1&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; eval(repr(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; eval(repr(a))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; eval(a)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback (most recent call last):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;&lt;/span&gt;, line &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;module&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    eval(a)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;~~~~^^^&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;TypeError&lt;/span&gt;: eval() arg &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; must be a string, bytes &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; code object
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;检验理解!&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;A&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;     &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;     &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;     &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__str__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;B&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;     &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;boo!&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;     &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;add_a&lt;/span&gt;(self, a):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(a)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;     &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         print(len(self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;a))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;a:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;              ret &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; str(a)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ret
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; A(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;one&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;?&lt;/span&gt; one
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; print(A(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;one&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;?&lt;/span&gt; oneone
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; repr(A(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;two&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;two&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; B()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;?&lt;/span&gt; boo&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_a(A(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_a(A(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;b&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; b
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(line &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(line &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;?&lt;/span&gt; aabb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;repr()&lt;/code&gt; 的用途总结&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;用途&lt;/th&gt;
          &lt;th&gt;示例&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;调试&lt;/td&gt;
          &lt;td&gt;显示数据结构的真实内容&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;可复现性&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;eval(repr(obj)) == obj&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;字符串包含特殊字符时的转义展示&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;&#39;hello\n&#39;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&#34;2-运算符重载-operator-overloading&#34;&gt;2. 运算符重载 (Operator Overloading)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;__add__&lt;/code&gt;&lt;/strong&gt;: 定义 &lt;code&gt;+&lt;/code&gt; 操作符的行为。例如 &lt;code&gt;obj1 + obj2&lt;/code&gt; 会变成 &lt;code&gt;obj1.__add__(obj2)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多态 (Polymorphism)&lt;/strong&gt;: 同一个操作符（如 &lt;code&gt;+&lt;/code&gt;）可以根据操作数类型的不同（如整数相加 vs. 字符串拼接）表现出不同的行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;主题-4递归数据结构-linked-lists--trees&#34;&gt;主题 4：递归数据结构 (Linked Lists &amp;amp; Trees)&lt;/h2&gt;
&lt;h3 id=&#34;主题概述-3&#34;&gt;主题概述&lt;/h3&gt;
&lt;p&gt;链表和树是基于&lt;strong&gt;递归 (Recursion)&lt;/strong&gt; 定义的数据结构。它们是 CS61A 中处理复杂数据的基石。&lt;/p&gt;
&lt;h3 id=&#34;核心概念-core-concepts-3&#34;&gt;核心概念 (Core Concepts)&lt;/h3&gt;
&lt;h4 id=&#34;1-链表-linked-lists&#34;&gt;1. 链表 (Linked Lists)&lt;/h4&gt;
&lt;p&gt;链表要么是空的，要么由一个元素 (&lt;code&gt;first&lt;/code&gt;) 和剩余链表 (&lt;code&gt;rest&lt;/code&gt;) 组成。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;处理技巧&lt;/strong&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;递归处理&lt;/strong&gt;: Base case 通常是 &lt;code&gt;lnk is Link.empty&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;迭代处理&lt;/strong&gt;: &lt;code&gt;while lnk is not Link.empty: ... lnk = lnk.rest&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;常用操作&lt;/strong&gt;: &lt;code&gt;map&lt;/code&gt; (映射), &lt;code&gt;filter&lt;/code&gt; (过滤) 在链表上的实现。注意链表通常是&lt;strong&gt;可变 (Mutable)&lt;/strong&gt; 的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#链表结构实现&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Link&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    empty &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, first, rest&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;empty):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;assert&lt;/span&gt; rest &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; Link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;empty &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; isinstance(rest, Link)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; first
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rest &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__repr__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;返回链表的可读字符串（如 &amp;lt;1 2 3&amp;gt;）&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;helper&lt;/span&gt;(lnk):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; lnk &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; Link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;empty:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            first_str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; helper(lnk&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first) &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; isinstance(lnk&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first, Link) &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; [str(lnk&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            rest_str &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; helper(lnk&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rest)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; first_str &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; rest_str
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elements &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; helper(self)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(elements)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#链表操作方式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#求和&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum_links&lt;/span&gt;(lnk):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; self &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; Link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;empty:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        current &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sum_links() &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; isinstance(self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first, Link) &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        rest_sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rest&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sum_links() &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; isinstance(self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rest, Link) &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; current &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; rest_sum
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#表示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;display_link&lt;/span&gt;(link):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    str_num &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; link &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; Link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;empty:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; isinstance(link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first, Link):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            elem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; display_link(link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;elif&lt;/span&gt; isinstance(link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first, int):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            elem &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; str(link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        str_num &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; elem
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        link &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(str_sum)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#映射&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(f, lnk):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; lnk &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; Link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;empty:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Link&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;empty
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Link(f(lnk&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first), map(f, lnk&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rest))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-树-trees&#34;&gt;2. 树 (Trees)&lt;/h4&gt;
&lt;p&gt;树由一个&lt;strong&gt;根标签 (Root Label)&lt;/strong&gt; 和一组&lt;strong&gt;分支 (Branches)&lt;/strong&gt; 组成。每个分支本身也是一棵树。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tree 类定义&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tree&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, label, branches&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;label &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; label
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 确保每个分支都是 Tree 的实例，并复制列表以防副作用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; branches:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;assert&lt;/span&gt; isinstance(b, Tree)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;branches &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; list(branches)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_leaf&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;branches
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心术语&lt;/strong&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Node (节点)&lt;/strong&gt;: 树中的任何位置。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Leaf (叶子)&lt;/strong&gt;: 没有分支的节点 (&lt;code&gt;branches&lt;/code&gt; 为空)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;递归处理模式&lt;/strong&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;处理当前节点的 &lt;code&gt;label&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;for b in t.branches:&lt;/code&gt; 循环递归处理每个分支。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>30min用Hugo创建个人博客网站</title>
      <link>https://cloudymount789.github.io/blog/blog_site_with_hugo/</link>
      <pubDate>Sat, 27 Dec 2025 21:45:10 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/blog_site_with_hugo/</guid>
      <description>&lt;p&gt;本文是一篇从零开始的无比详细的Hugo 建站实战保姆级教程。通过对 Ladder 主题的配置，你将收获一个具备极简美学且功能大满贯的个人站： 它不仅支持 &lt;strong&gt;Giscus 异步评论、留言板、社交媒体账号跳转、多维标签云与自动归档&lt;/strong&gt;，还免费集成了一套完全自主掌控的&lt;strong&gt;Umami 私有化流量分析看板&lt;/strong&gt;，并能学会无需服务器将整个静态网站&lt;strong&gt;免费部署到github page上&lt;/strong&gt;的方法。github page配置失败，遭遇 Vercel 风控、Netlify 数据库连接及 IPv6 不兼容等一系列的硬核报错, 尝试Netlify + Supabase，作者建站的过程历经千辛万苦，主要都是在解决各式各样的报错，而现在将踩出来的坑为后人一一铺平。&lt;/p&gt;
&lt;h1 id=&#34;hugo-搭建个人博客&#34;&gt;Hugo 搭建个人博客&lt;/h1&gt;
&lt;p&gt;情况概述：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;大一上完成了基础的网站搭建，其实就是跟着教程一步一步做，再在遇到文中没有提到的问题的时候通过开源社区/阅读配置文件/问ai解决问题，由于当时并没有做出记录，现在很多东西也不记得了（），但是记得似乎是困难重重&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;看的&lt;a href=&#34;https://blog.csdn.net/weixin_35891787/article/details/145103961&#34;&gt;教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cloudymount789.github.io/blog/blog_site_with_hugo/#hugo-%e4%bb%8b%e7%bb%8d&#34;&gt;文后&lt;/a&gt;附转载&lt;/p&gt;
&lt;p&gt;请先跟着贴出的教程链接或者我在文后的转载完成初步的建站，然后再阅读我的配置教程进行进一步的配置。&lt;/p&gt;
&lt;p&gt;在看后面的教程的时候，如果遇到问题，可以在我前面的配置文档里寻找答案，找不到的话可以ATFAI()/去技术社区搜索关键词/去B站搜教程/或者在下方评论区留言&lt;/p&gt;
&lt;h2 id=&#34;配置&#34;&gt;配置&lt;/h2&gt;
&lt;p&gt;研究怎么配置使用到的tools：&lt;a href=&#34;https://guangzhengli.com/blog/en/how-to-create-your-blog-for-free-by-hugo-ladder-in-30min&#34;&gt;配置说明&lt;/a&gt; + &lt;a href=&#34;https://gemini.google.com/app&#34;&gt;gemini&lt;/a&gt;(问每个配置有啥用)&lt;/p&gt;
&lt;p&gt;修改&lt;code&gt;hugo.toml&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;（官方文档中使用的是yml，我把它转成了toml）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://hugo-ladder.pages.dev&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#网站发布后的网址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LADDER&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#浏览器标签页上显示的网站名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;theme&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hugo-theme-ladder&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;license&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MIT&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;licenselink&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/guangzhengli/hugo-theme-ladder/blob/master/LICENSE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;description&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;A fast, clean Hugo theme&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#网站的简短描述,SEO（搜索引擎优化）的关键&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;homepage&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://hugo-ladder.pages.dev&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultContentLanguage&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;googleAnalytics&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;G-xxx&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#Google 统计（GA4）的衡量 ID,有谷歌analyticas账号可以用这个抓取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;pagination&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;pagerSize&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;#控制首页或列表页每页显示的文章数量，超过 10 篇将自动分页&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;补充：解决html报错&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;markup&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#a6e22e&#34;&gt;markup&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;goldmark&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#a6e22e&#34;&gt;markup&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;goldmark&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;renderer&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;unsafe&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;1-基础资料与全局样式-params&#34;&gt;1. 基础资料与全局样式 (&lt;code&gt;[params]&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;这一部分控制网站侧边栏或页脚展示的个人名片信息。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;brand&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HOME&amp;#34;&lt;/span&gt;                      &lt;span style=&#34;color:#75715e&#34;&gt;# 网站左上角的文字 Logo/品牌名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;avatarURL&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/images/avatar.png&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 头像图片路径（存放在 static/images/ 目录下）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;author&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hugo Ladder&amp;#34;&lt;/span&gt;              &lt;span style=&#34;color:#75715e&#34;&gt;# 作者姓名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;authorDescription&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;...&amp;#34;&lt;/span&gt;           &lt;span style=&#34;color:#75715e&#34;&gt;# 作者简短描述（通常显示在头像下方）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;info&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;...&amp;#34;&lt;/span&gt;                        &lt;span style=&#34;color:#75715e&#34;&gt;# 网站或个人的详细介绍信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;favicon&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/images/avatar.png&amp;#34;&lt;/span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# 浏览器标签页的小图标&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;darkModeTheme&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data-dark-mode&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 夜间模式的主题属性名称，该主题内有两个，一个是默认的 data-dark-mode 主题，另一个是 icy-dark-mode 深色主题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;options&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;showDarkMode&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;               &lt;span style=&#34;color:#75715e&#34;&gt;# 是否在页面上显示“昼夜模式”切换按钮&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;enableImgZooming&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;           &lt;span style=&#34;color:#75715e&#34;&gt;# 是否开启文章内图片的点击放大功能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;enableMultiLang&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;# 是否开启多语言支持功能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;2-评论系统配置-paramscomments&#34;&gt;2. 评论系统配置 (&lt;code&gt;[params.comments]&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;主题支持多种评论插件，这里主要配置了 &lt;strong&gt;Giscus&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Giscus 是将评论存储在 GitHub 仓库的 &lt;strong&gt;Discussions&lt;/strong&gt; 中。&lt;/p&gt;
&lt;h4 id=&#34;1-外部准备工作&#34;&gt;1. 外部准备工作&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;准备仓库&lt;/strong&gt;：创建一个公开（Public）的 GitHub 仓库（或者使用你存放博客代码的仓库）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开启 Discussions&lt;/strong&gt;：进入该仓库的 &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; 勾选 &lt;code&gt;Discussions&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装 Giscus App&lt;/strong&gt;：访问 &lt;a href=&#34;https://giscus.app/zh-CN&#34;&gt;giscus.app&lt;/a&gt;，安装并授权它访问你的这个仓库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取参数&lt;/strong&gt;：在 &lt;a href=&#34;https://giscus.app/zh-CN&#34;&gt;giscus.app&lt;/a&gt; 页面向下滚动，输入 &lt;code&gt;所有者/仓库名&lt;/code&gt;，页面会自动生成以下关键值：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;repo-id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category&lt;/code&gt; (建议选 Announcements)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category-id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;2-修改-hugotoml-配置&#34;&gt;2. 修改 &lt;code&gt;hugo.toml&lt;/code&gt; 配置&lt;/h4&gt;
&lt;p&gt;将获取的值填入hugo.toml的以下对应位置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;giscus&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;                       &lt;span style=&#34;color:#75715e&#34;&gt;# 是否启用 Giscus 评论（基于 GitHub Discussions）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;repo&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;username/repo&amp;#34;&lt;/span&gt;              &lt;span style=&#34;color:#75715e&#34;&gt;# 存放评论的 GitHub 仓库名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;repo_id&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;                     &lt;span style=&#34;color:#75715e&#34;&gt;# 仓库的唯一 ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;category&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Announcements&amp;#34;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;# 评论存放的讨论区分类&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;category_id&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;                 &lt;span style=&#34;color:#75715e&#34;&gt;# 讨论区分类的 ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mapping&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# 评论与文章的对应关系（按页面路径匹配）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;position&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;                    &lt;span style=&#34;color:#75715e&#34;&gt;# 评论输入框相对于评论列表的位置（顶部）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;lang&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;                         &lt;span style=&#34;color:#75715e&#34;&gt;# 评论区的界面语言&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;补充&#34;&gt;补充&lt;/h4&gt;
&lt;p&gt;如果你坚持要用基于 Issues 的 &lt;strong&gt;Utterances&lt;/strong&gt;，配置方式类似：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 GitHub 仓库中开启 Issues 功能。&lt;/li&gt;
&lt;li&gt;在 &lt;a href=&#34;https://utteranc.es/&#34;&gt;utteranc.es&lt;/a&gt; 获取 &lt;code&gt;repo&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;hugo.toml&lt;/code&gt; 中将 &lt;code&gt;params.comments.giscus.enable&lt;/code&gt; 设为 &lt;code&gt;false&lt;/code&gt;，将 &lt;code&gt;params.comments.utteranc.enable&lt;/code&gt; 设为 &lt;code&gt;true&lt;/code&gt; 并填入仓库名。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;utteranc&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;                      &lt;span style=&#34;color:#75715e&#34;&gt;# 是否启用 Utterances 评论（目前设为关闭）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;repo&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;username/xxx&amp;#34;&lt;/span&gt;               &lt;span style=&#34;color:#75715e&#34;&gt;# 存放评论的 GitHub 仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;issueTerm&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;              &lt;span style=&#34;color:#75715e&#34;&gt;# 评论映射方式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;原理解释&#34;&gt;原理解释&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;关于映射方式，对于 Hugo 博客，&lt;strong&gt;建议保持 &lt;code&gt;pathname&lt;/code&gt;&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;它会把每一篇文章的路径（如 &lt;code&gt;/blog/first-post/&lt;/code&gt;）作为 ID。这样每篇文章下面都会有自己独立的评论区，互不干扰。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;strong&gt;&amp;ldquo;Discussion 分类&amp;rdquo;&lt;/strong&gt; 这一栏，下拉选择 &lt;strong&gt;Announcements&lt;/strong&gt;（推荐）。
选择后，下方的 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 代码会自动更新。
将新生成的 &lt;code&gt;data-category-id&lt;/code&gt;（一串长字符）复制出来，填到 &lt;code&gt;hugo.toml&lt;/code&gt; 的 &lt;code&gt;category_id&lt;/code&gt; 中。&lt;/p&gt;
&lt;p&gt;建议选这个是因为在 GitHub 上，只有仓库管理员能在这个分类发主帖。这样可以防止乱发无关的讨论，保证只有通过你的博客页面才能创建新的评论区。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;repo_id 和 category_id&lt;/strong&gt;：是 GitHub 内部的唯一标识符。即使你以后改了仓库名字，只要 ID 对，评论就不会丢。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;3-数据统计与分析-paramsanalytics&#34;&gt;3. 数据统计与分析 (&lt;code&gt;[params.analytics]&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;见&lt;a href=&#34;https://cloudymount789.github.io/blog/blog_site_with_hugo/#umami-%e5%85%8d%e8%b4%b9%e9%83%a8%e7%bd%b2&#34;&gt;ummami免费使用&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;analytics&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;google&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;SiteVerificationTag&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;         &lt;span style=&#34;color:#75715e&#34;&gt;# Google 搜索控制台（Search Console）的验证代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;analytics&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;umami&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;                       &lt;span style=&#34;color:#75715e&#34;&gt;# 是否启用 Umami 网站统计分析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;website_id&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;                  &lt;span style=&#34;color:#75715e&#34;&gt;# Umami 提供的网站唯一识别 ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://xxx&amp;#34;&lt;/span&gt;                 &lt;span style=&#34;color:#75715e&#34;&gt;# 部署好的 Umami 服务地址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;获取-umami-访问地址&#34;&gt;获取 Umami 访问地址&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;等待大约 1-2 分钟，直到 Umami 的状态变为“运行中”。&lt;/li&gt;
&lt;li&gt;点击进入 Umami 服务页面。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;“域名” (Domain)&lt;/strong&gt; 栏目下，点击 &lt;strong&gt;“生成域名” (Generate Domain)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;你可以输入一个你喜欢的二级域名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;访问该域名&lt;/strong&gt;，使用默认账号密码登录：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户名&lt;/strong&gt;：&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码&lt;/strong&gt;：&lt;code&gt;umami&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;登录后记得第一时间在设置里修改密码！&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id=&#34;接入你的-hugo-博客&#34;&gt;接入你的 Hugo 博客&lt;/h4&gt;
&lt;p&gt;这步和你之前看的教程一致：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 Umami 后台点击 &lt;strong&gt;“添加网站” (Add Website)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;输入你的博客名称和域名，获取 &lt;code&gt;data-website-id&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;回到你的 Hugo 项目，打开 &lt;code&gt;hugo.toml&lt;/code&gt;，填入信息：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;analytics&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;umami&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;website_id&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;你在 Zeabur 获取的 ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://你在 Zeabur 生成的域名.zeabur.app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于我的手机号通不过vercel,最终的部署我选择了netlify,步骤供参考&lt;/p&gt;
&lt;h5 id=&#34;1-创建数据库&#34;&gt;1. 创建数据库&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;https://cloudymount789.github.io/blog/blog_site_with_hugo/#%e5%88%9b%e5%bb%ba%e6%95%b0%e6%8d%ae%e5%ba%93&#34;&gt;见后&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Umami 自身不存储数据，它需要一个 PostgreSQL 数据库。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&#34;https://supabase.com/&#34;&gt;Supabase 官网&lt;/a&gt;，使用 GitHub 登录。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;New Project&lt;/strong&gt;，填入项目名称和数据库密码（&lt;strong&gt;务必记下密码&lt;/strong&gt;）。&lt;/li&gt;
&lt;li&gt;等待几分钟数据库创建完成。&lt;/li&gt;
&lt;li&gt;进入左侧菜单的 &lt;strong&gt;Project Settings&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Database&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;Connection string&lt;/strong&gt;，选择 &lt;strong&gt;URI&lt;/strong&gt; 模式。&lt;/li&gt;
&lt;li&gt;复制那串以 &lt;code&gt;postgres://&lt;/code&gt; 开头的地址。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：将其中的 &lt;code&gt;[YOUR-PASSWORD]&lt;/code&gt; 替换为你刚才设置的真实密码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果你的密码里含有特殊的标点符号（比如 !、@、: 等），直接放在 URL 里会破坏格式，导致 Netlify 部署时报错“Invalid URL”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h5 id=&#34;2-在-netlify-部署-umami&#34;&gt;2. 在 Netlify 部署 Umami&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fork 项目&lt;/strong&gt;：在 GitHub 上访问 &lt;a href=&#34;https://github.com/umami-software/umami&#34;&gt;umami-software/umami&lt;/a&gt;，点击右上角的 &lt;strong&gt;Fork&lt;/strong&gt;，将其克隆到你的账号下。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;登录 Netlify&lt;/strong&gt;：访问 &lt;a href=&#34;https://app.netlify.com/&#34;&gt;Netlify&lt;/a&gt;，使用 GitHub 登录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新建站点&lt;/strong&gt;：点击 &lt;strong&gt;Add new site&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Import an existing project&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接 GitHub&lt;/strong&gt;：选择 GitHub，找到并选中你刚才 Fork 的 &lt;code&gt;umami&lt;/code&gt; 仓库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置构建参数&lt;/strong&gt;（非常重要）：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build command&lt;/strong&gt;: &lt;code&gt;yarn build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publish directory&lt;/strong&gt;: &lt;code&gt;.next&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置环境变量 (Environment variables)&lt;/strong&gt;：点击 &lt;strong&gt;Add variable&lt;/strong&gt;，依次添加以下四项：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;DATABASE_URL&lt;/code&gt;&lt;/strong&gt;: 填入你在第一阶段获取并修改好的 Supabase 连接字符串。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;APP_SECRET&lt;/code&gt;&lt;/strong&gt;: 随便输入一串长随机字符串（用于加密，例如 &lt;code&gt;yunsanwu789_secret_key&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;DATABASE_TYPE&lt;/code&gt;&lt;/strong&gt;: 填入 &lt;code&gt;postgresql&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SKIP_DB_CHECK&lt;/code&gt;&lt;/strong&gt;：填入 &lt;code&gt;true&lt;/code&gt; // 绕过检查，IPv4和IPv6协会不兼容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开始部署&lt;/strong&gt;：点击 &lt;strong&gt;Deploy site&lt;/strong&gt;。
// 中间遇到了很多困难，比如我建站之后想登录老是报Unexpected end of JSON input，最后放弃了（）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h5 id=&#34;3初始化-umami&#34;&gt;3.初始化 Umami&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;部署完成后，Netlify 会给你一个 &lt;code&gt;xxx.netlify.app&lt;/code&gt; 的域名。点击访问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认登录信息&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户名&lt;/strong&gt;: &lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码&lt;/strong&gt;: &lt;code&gt;umami&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改密码&lt;/strong&gt;：登录后第一时间点击右上角头像 -&amp;gt; &lt;strong&gt;Settings&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Profile&lt;/strong&gt; 修改密码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加网站&lt;/strong&gt;：在 &lt;strong&gt;Settings&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Websites&lt;/strong&gt; 中点击 &lt;strong&gt;Add website&lt;/strong&gt;，填入你的 Hugo 博客信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取代码&lt;/strong&gt;：点击该网站条目旁的 &lt;strong&gt;Edit&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Tracking code&lt;/strong&gt;，复制那一串 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 代码。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h5 id=&#34;4回到-hugo-配置&#34;&gt;4.回到 Hugo 配置&lt;/h5&gt;
&lt;p&gt;打开你的 &lt;code&gt;hugo.toml&lt;/code&gt;，将获取到的信息填入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;analytics&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;umami&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;website_id&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;从 Umami 拿到的 UUID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://你的名字.netlify.app&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 填入你的 Netlify 访问地址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;4-留言板与社交链接配置&#34;&gt;4. 留言板与社交链接配置&lt;/h3&gt;
&lt;p&gt;在 Ladder 主题中，留言板实际上是一个&lt;strong&gt;开启了评论功能的特殊页面&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id=&#34;1-创建留言板页面&#34;&gt;1. 创建留言板页面&lt;/h4&gt;
&lt;p&gt;在你的博客根目录下运行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new guestbook/_index.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-编辑页面内容&#34;&gt;2， 编辑页面内容&lt;/h4&gt;
&lt;p&gt;打开 &lt;code&gt;content/guestbook/_index.md&lt;/code&gt;，确保其 Front Matter（开头）如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;title: &amp;#34;留言板&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;layout: &amp;#34;guestbook&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;注意：&lt;code&gt;layout: &amp;quot;guestbook&amp;quot;&lt;/code&gt; 会告诉主题这个页面不需要显示文章正文，而是直接加载评论插件。&lt;/em&gt;&lt;/p&gt;
&lt;h4 id=&#34;3-关联菜单与配置&#34;&gt;3. 关联菜单与配置&lt;/h4&gt;
&lt;p&gt;确保你的 &lt;code&gt;hugo.toml&lt;/code&gt; 中有以下设置，以便用户能找到它：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;guestbook&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;留言板&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;description&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;欢迎在这里留下你的足迹。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;languages&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;en&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]] &lt;span style=&#34;color:#75715e&#34;&gt;# 或者 [[menu.main]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;留言板&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/guestbook&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;社交媒体配置&#34;&gt;社交媒体配置&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;social&lt;/span&gt;]]                 &lt;span style=&#34;color:#75715e&#34;&gt;# 社交媒体配置（GitHub）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GitHub&amp;#34;&lt;/span&gt;                   &lt;span style=&#34;color:#75715e&#34;&gt;# 链接名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;svg ...&amp;gt;...&amp;lt;/svg&amp;gt;&amp;#39;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 显示在名称前的图标代码（SVG 格式）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/...&amp;#34;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 社交账号的跳转链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;social&lt;/span&gt;]]                 &lt;span style=&#34;color:#75715e&#34;&gt;# 其他链接（如数据仪表盘）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dashboard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;pre&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;svg ...&amp;gt;...&amp;lt;/svg&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://xxx&amp;#34;&lt;/span&gt;               &lt;span style=&#34;color:#75715e&#34;&gt;# 对应页面的跳转链接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;图标可以在 feathericons.com 这个网站上找到&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;5-语言与导航菜单-languagesen&#34;&gt;5. 语言与导航菜单 (&lt;code&gt;[languages.en]&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;如果开启了多语言，菜单需要在对应的语言块下进行配置。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;languages&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;en&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;languageName&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;EN&amp;#34;&lt;/span&gt;                  &lt;span style=&#34;color:#75715e&#34;&gt;# 该语言在切换菜单中显示的名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;languages&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;en&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]           &lt;span style=&#34;color:#75715e&#34;&gt;# 顶部导航栏：文章/博客&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Blog&amp;#34;&lt;/span&gt;                        &lt;span style=&#34;color:#75715e&#34;&gt;# 菜单显示的文字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/blog&amp;#34;&lt;/span&gt;                       &lt;span style=&#34;color:#75715e&#34;&gt;# 点击后跳转的路径（对应 content/blog 目录）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;                          &lt;span style=&#34;color:#75715e&#34;&gt;# 排序权重，数字越小越靠前（左）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;languages&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;en&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]           &lt;span style=&#34;color:#75715e&#34;&gt;# 顶部导航栏：标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tags&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tags&amp;#34;&lt;/span&gt;                       &lt;span style=&#34;color:#75715e&#34;&gt;# 跳转到标签聚合页&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;languages&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;en&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]           &lt;span style=&#34;color:#75715e&#34;&gt;# 顶部导航栏：归档&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Archive&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/archives&amp;#34;&lt;/span&gt;                   &lt;span style=&#34;color:#75715e&#34;&gt;# 跳转到文章归档页&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;languages&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;en&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]           &lt;span style=&#34;color:#75715e&#34;&gt;# 顶部导航栏：留言板&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Guestbook&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/guestbook&amp;#34;&lt;/span&gt;                  &lt;span style=&#34;color:#75715e&#34;&gt;# 跳转到留言页面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;6-分类法配置-taxonomies&#34;&gt;6. 分类法配置 (&lt;code&gt;[taxonomies]&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;定义 Hugo 如何对你的文章内容进行逻辑归类。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;taxonomies&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;series&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;series&amp;#34;&lt;/span&gt;                   &lt;span style=&#34;color:#75715e&#34;&gt;# 开启“系列文章”分类功能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;tag&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tags&amp;#34;&lt;/span&gt;                         &lt;span style=&#34;color:#75715e&#34;&gt;# 开启“标签”分类功能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;其他导航栏&#34;&gt;其他：导航栏&lt;/h3&gt;
&lt;p&gt;目前该博客支持 4 个默认页面、博客列表、标签、历史记录和留言簿。
可以通过修改 menu.main 来调整 name ；如果想在导航栏中添加新页面，请记住在根目录的 content 下添加相应的 markdown 文件。&lt;/p&gt;
&lt;h3 id=&#34;其他写帖子&#34;&gt;其他：写帖子&lt;/h3&gt;
&lt;p&gt;如果要创建新帖子，建议填写配置信息，具体如下：&lt;/p&gt;
&lt;p&gt;命令如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new blog/&amp;lt;name&amp;gt;.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;title: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;date: {{ .Date }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tags: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;series: [] # 文章将在内容下方显示相关帖子
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;featured: true # 是否在首页精选文章中 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;补充：series填写文章名即可，用双引号包含，不同文章用逗号分隔,tags同理
date格式如&lt;code&gt;2025-03-31T20:00:00+08:00&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;其他seo&#34;&gt;其他：SEO&lt;/h3&gt;
&lt;p&gt;前提是使用了geogle analytica来分析网站，配置这个可以使你的网站在geogle可以被搜索到。
该主题已针对搜索引擎优化 SEO 进行了优化，包括完善的 meta 标签信息等。此外，默认支持 Google Search Console ，可以根据文档生成 google-site-verification 到 params. analytics.google.SiteVerificationTag 。&lt;/p&gt;
&lt;h3 id=&#34;使用github-page免费部署站点&#34;&gt;使用Github Page免费部署站点&lt;/h3&gt;
&lt;p&gt;在这一步配置的时候我遇到了很多问题，在技术论坛和教程，ai间反复辗转之后，最后摸索出了自己的方式&lt;/p&gt;
&lt;p&gt;我会先贴出官方配置的教程，看不懂的也可以去搜b站的教学，然后在后面给出我自己的解决方案hhh，事实证明前者在我这里可以跑不通但是后者可以（感觉到自己解决问题的能力有所提升！）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在gitbub创建以&lt;code&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt;为名称的仓库&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在本地成功建站（终端运行&lt;code&gt;hugo server&lt;/code&gt;）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 GitHub Pages 部署博客有两种方法，一种是直接推送到 GitHub Pages ，另一种是在 gh-pages 分支上生成静态页面代码。代码可在 &lt;a href=&#34;https://github.com/guangzhengli/hugo-ladder-exampleSite/tree/master/.github/workflows&#34;&gt;https://github.com/guangzhengli/hugo-ladder-exampleSite/tree/master/.github/workflows&lt;/a&gt; 获取。&lt;/p&gt;
&lt;p&gt;如果您没有克隆已配置的仓库： &lt;a href=&#34;https://github.com/guangzhengli/hugo-ladder-exampleSite&#34;&gt;https://github.com/guangzhengli/hugo-ladder-exampleSite&lt;/a&gt; ，则需要创建一个新的文件夹 .github/workflows 并添加新的文件 gh-pages.yml 。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;generate github pages to gh-pages branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;branches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;## Set a branch name to trigger deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;runs-on&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ubuntu-20.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;actions/checkout@v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;submodules&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# Fetch Hugo themes (true OR recursive)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;fetch-depth&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Fetch all history for .GitInfo and .Lastmod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Setup Hugo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;peaceiris/actions-hugo@v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;hugo-version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;extended&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;run&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;hugo --minify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Deploy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;uses&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;peaceiris/actions-gh-pages@v3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# If you&amp;#39;re changing the branch from main, &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# also change the `main` in `refs/heads/main` &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# below accordingly.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;if&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;github.ref == &amp;#39;refs/heads/main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;github_token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;publish_dir&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;./public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在项目根目录下输入以下命令。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote add origin https://github.com/username/username.github.io.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;feat: init blog site&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一旦我们确认推送成功，它会自动将代码构建到 GitHub Pages in Actions 所需的文件中，因此您可以访问此地址检查 workflow 是否成功运行。请务必将地址中的 username 替换为您的帐户名。 &lt;a href=&#34;https://github.com/username/username.github.io/actions&#34;&gt;https://github.com/username/username.github.io/actions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果 Actions 工作流成功，我们将创建一个名为 gh-pages 新分支。然后，前往仓库的设置中心，选择 Settings ”，然后选择 Pages ，再选择 Build and deployment -&amp;gt; Source ，并选择 Deploy from a branch 。之后，选择 gh-pages Branch 即可完成配置。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我当时应该是怎么试怎么问ai都找不到gh-pages分支hhh(好像是因为我的action实际没有构建成功)，当时还懂的比较少，问ai问了很久，最后还是没能解决这个问题&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;所以最后，我研究出来并采用了另一种方式
&lt;strong&gt;3. 将public文件夹中的内容上传到这个仓库&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 关注github上的actions，问ai解决里面的报错&lt;/strong&gt;
由于当时没有记录，我现在已经不记得自己当时做了什么了，大家可以自行解决（）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. actions显示成功后，可以输入地址并浏览自己的网页啦！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;至此，大获成功！！&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;部署过程中有什么疑问可以在评论区留言&lt;/p&gt;
&lt;h2 id=&#34;初步建站教程&#34;&gt;初步建站教程&lt;/h2&gt;
&lt;p&gt;回到&lt;a href=&#34;https://cloudymount789.github.io/blog/blog_site_with_hugo/#%e9%85%8d%e7%bd%ae&#34;&gt;文初&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以下为引用和转载的教程，未作修改&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;hugo-介绍&#34;&gt;hugo 介绍&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; 是一个快速且灵活的静态网站生成器，使用 Go 语言编写，&lt;a href=&#34;https://github.com/gohugoio/hugo&#34;&gt;代码仓库&lt;/a&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;极快的构建速度&lt;/strong&gt;：Hugo 是同类产品中最快的工具，平均每个页面构建时间小于1毫秒，即使是大型网站也能在几秒钟内完成构建。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强大的模板系统&lt;/strong&gt;：内置预制模板，可快速完成SEO、评论、统计等功能，一行配置即可实现。同时，其基于Go的模板提供了足够的逻辑支持，能够构建从简单到复杂的各种网站。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多语言支持&lt;/strong&gt;：原生支持多语言，为多语言站点提供了完整的i18n支持，与单语言站点具有相同的开发体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;丰富的主题库&lt;/strong&gt;：拥有300多个主题，涵盖多种风格和功能，用户可以根据自己的需求选择合适的主题，快速搭建出美观且功能强大的网站。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/f01d6cc66bce423d0fe4d9818bc65d02.png&#34; alt=&#34;image-20250112194857051&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://gohugo.io/installation/&#34;&gt;参考文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;查看版本/验证安装成功：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装 &lt;a href=&#34;https://git-scm.com/book/en/v2/Getting-Started-Installing-Git&#34;&gt;Git&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;由于后续下载 hugo 主题，以及部署的过程，均需使用到 Git，这里要求必须完成相关环境的安装。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;ladder-主题&#34;&gt;Ladder 主题&lt;/h3&gt;
&lt;p&gt;hugo-ladder 是一个简约的 hugo 主题，也是这个博客使用的主题，由 &lt;a href=&#34;https://github.com/guangzhengli/hugo-theme-ladder&#34;&gt;Ladder&lt;/a&gt; 这个 Git 仓库的作者维护，如果后续你有任何有趣的想法，可以为仓库贡献代码。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 这个命令用于创建一个新的Hugo站点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new site my-site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd my-site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 这个命令用于将Hugo主题作为一个Git子模块添加到当前的Git仓库中，并克隆代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/guangzhengli/hugo-theme-ladder themes/hugo-theme-ladder
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;theme = &amp;#39;hugo-theme-ladder&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; hugo.toml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 本地启动 hugo 服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/83dd9a74b9943400b3dbb23ffe5e19f7.png&#34; alt=&#34;image-20250112203038502&#34;&gt;&lt;/p&gt;
&lt;p&gt;接着会在默认的 1313 端口启动 hugo 的站点（我本地的1313被占用了，则随机分配了另一端口），当前站点内没有任何的内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/cc9972b634fccc216bee93263edb9634.png&#34; alt=&#34;image-20250112202827124&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;自定义配置&#34;&gt;自定义配置&lt;/h3&gt;
&lt;p&gt;首先我们来熟悉一下 hugo 的文件目录，也就是通过命令创建的 &lt;code&gt;my-site&lt;/code&gt; 这个文件夹。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- archetypes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- assets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- content &lt;span style=&#34;color:#75715e&#34;&gt;# 内容，后续博客文章将放置在这里&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- hugo.toml &lt;span style=&#34;color:#75715e&#34;&gt;# 配置文件，菜单、评论、网站统计等所有功能，均可以通过直接配置进行开启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- i18n &lt;span style=&#34;color:#75715e&#34;&gt;# 多语言&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- layouts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- public
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- resources
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- static &lt;span style=&#34;color:#75715e&#34;&gt;# 静态文件，如头像图片等&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- themes &lt;span style=&#34;color:#75715e&#34;&gt;# 所有主题以子文件夹的形式存放&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;文章&#34;&gt;文章&lt;/h4&gt;
&lt;p&gt;首先我们找到根目录下 &lt;code&gt;archetypes&lt;/code&gt; 文件夹中的 &lt;code&gt;default.md&lt;/code&gt; 文件，用下面的文件替代其中内容，这是用于控制创建新博客时的模板。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---title: 博客标题date: {{ .Date }}tags: []series: []featured: true---这是摘要 &amp;lt;!--more--&amp;gt; 这是内容
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在根目录下通过如下命令，创建一篇博客：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new blog/first.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;则会自动生成 &lt;code&gt;content/blog/first.md&lt;/code&gt; 这篇博客。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/0508398f111236c72080b22938584bc7.png&#34; alt=&#34;image-20250112204512522&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;菜单&#34;&gt;菜单&lt;/h4&gt;
&lt;p&gt;接下来继续配置根目录下的 &lt;code&gt;hugo.toml&lt;/code&gt;，创建几个菜单管理不同类目的博客。事实上，hugo 支持 toml 和 yaml 格式的配置文件，如果你并不习惯使用 toml，可以删除根目录的 &lt;code&gt;hugo.toml&lt;/code&gt;，并创建 &lt;code&gt;hugo.yml&lt;/code&gt; 进行相同配置的录入，也是可以生效的。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://example.org/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;languageCode&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;en-us&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;My New Hugo Site&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;theme&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hugo-theme-ladder&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;文章&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/blog/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;归档&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/archive/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;联系&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/contact/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;网站统计&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/xx/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/e6d66e1cc5ee30cb0f825b4ce4742562.png&#34; alt=&#34;image-20250112204922835&#34;&gt;&lt;/p&gt;
&lt;p&gt;这时候，你会发现，当点击文章的时候，可以看到博客列表，但是点击其他目录看不到，因为 &lt;code&gt;content/blog&lt;/code&gt; 是第一篇文章的存放路径，所以文章菜单可以看到，所以后续文章的管理，只需要在创建的时候，指定对应生成的目录即可。&lt;/p&gt;
&lt;p&gt;这时候，你看到 &lt;code&gt;localhost:1313/&lt;/code&gt; 目录下也能看到这篇博客，Featured Posts 表示的是主页的推荐文章，所有标志了 &lt;code&gt;featured: true&lt;/code&gt; 的文章都可以在这里展示，而 &lt;code&gt;featured: false&lt;/code&gt; 的文章，则只会在对应目录展示。&lt;/p&gt;
&lt;p&gt;所以尝试将 &lt;code&gt;/content/blog/first.md&lt;/code&gt; 这篇文章的 featured 设置为 false，你将无法在首页看到它了，但 &lt;code&gt;localhost:1313/blog&lt;/code&gt; 依旧可以看到。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---title: 博客标题date: 2025-01-12T20:44:21+08:00tags: []series: []featured: false---这是摘要 &amp;lt;!--more--&amp;gt; 这是内容
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;更多定制化&#34;&gt;更多定制化&lt;/h4&gt;
&lt;p&gt;尝试在 images 中导入一张图片 avatar.png，darkModeTheme 开启夜间模式，尝试修改网页的 logo等。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://baize.github.io&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 网站的 URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;languageCode&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;zh&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 网站语言代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;白泽&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 网站标题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;theme&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hugo-theme-ladder&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 使用的主题名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultContentLanguage&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;zh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;brand&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;主页&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;author&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;白泽&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;authorDescription&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;阅读｜思考｜产出｜进步&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;info&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;从未停止对未知的探索，尝试分享一些有趣的东西&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;avatarURL&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;images/baize.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;darkModeTheme&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data-dark-mode&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;favicon&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;images/baize.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进行到这一步，你本地的站点应该与我的博客样式近乎相同，恭喜你几乎完成了所有博客本地的搭建工作了，后续更多功能的添加，完全依托于 hugo 强大的配置能力，以及你的聪明头脑（这个阶段，需要阅读 hugo 的配置文档）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/492ddd2a4afbab95a1202796a38e85fd.png&#34; alt=&#34;image-20250112210500340&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;umami-网站数据统计&#34;&gt;Umami 网站数据统计&lt;/h3&gt;
&lt;p&gt;这是一个有趣的内容， 当你完成接入之后，将获得如下的访客信息统计看板。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/6c4c2f7fcbabdad1382afe3dbd868067.png&#34; alt=&#34;image-20250112211314274&#34;&gt;&lt;/p&gt;
&lt;p&gt;包括区域和设备分布：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/ef177a0aa2f43270eb7cdec6f9b687d7.png&#34; alt=&#34;image-20250112211404681&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;工作原理&#34;&gt;工作原理&lt;/h4&gt;
&lt;p&gt;Umami 是一个简单、快速且开源的分析工具，用于跟踪网站的访问数据。它的工作原理主要包括以下几个步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据收集&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;当用户访问你的网站时，Umami 通过在网页中嵌入的JavaScript代码来收集数据。这些数据包括页面浏览量、访问时长、用户地理位置、设备信息等。&lt;/li&gt;
&lt;li&gt;每次页面加载时，嵌入的JavaScript代码会发送一个请求到Umami服务器，携带收集到的数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;数据存储&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Umami 服务器接收到数据后，会将其存储在数据库中。Umami 使用PostgreSQL作为其默认数据库，但也可以配置为使用其他数据库。&lt;/li&gt;
&lt;li&gt;数据存储在数据库中，以便后续进行查询和分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;strong&gt;数据处理&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Umami 服务器会对收集到的数据进行处理，生成各种统计信息，如页面浏览量、独立访客数、访问时长等。&lt;/li&gt;
&lt;li&gt;这些统计信息会定期更新，以反映最新的访问数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;strong&gt;数据展示&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Umami 提供一个管理界面，用户可以通过这个界面查看和分析网站的访问数据。&lt;/li&gt;
&lt;li&gt;管理界面展示了各种图表和报告，帮助用户了解网站的访问情况。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;umami-免费部署&#34;&gt;Umami 免费部署&lt;/h4&gt;
&lt;h5 id=&#34;创建数据库&#34;&gt;创建数据库&lt;/h5&gt;
&lt;p&gt;数据库用的是 &lt;a href=&#34;https://app.supabase.com/&#34;&gt;supabase&lt;/a&gt; 提供的有限额的 &lt;a href=&#34;https://supabase.com/docs/guides/database&#34;&gt;postgres&lt;/a&gt; 数据库，创建一个 supabase 账号，新建一个项目，输入 Datebase password 即可创建数据库服务。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/d07a30f7db36db1ba1e91cbe4f4171b0.png&#34; alt=&#34;image-20250112213146231&#34;&gt;&lt;/p&gt;
&lt;p&gt;进入 database 菜单，点击 Connect。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/bf631790ace8318528875e330a4deb8d.png&#34; alt=&#34;image-20250112213258281&#34;&gt;&lt;/p&gt;
&lt;p&gt;记录下这里通过 Session pooler 接入数据库的方式（DATABASE_URL），下文 Umami 接入 DB 时注意替换密码为你创建的密码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/ebfce0b8e7de03e5972b48226f7b2750.png&#34; alt=&#34;image-20250112213526312&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;部署-umami&#34;&gt;部署 umami&lt;/h5&gt;
&lt;p&gt;首先 umami 是开源的，访问它的 &lt;a href=&#34;https://github.com/umami-software/umami&#34;&gt;GitHub 仓库&lt;/a&gt;，将其 fork 为自己的 repo。&lt;/p&gt;
&lt;p&gt;vercel 是一个现代的云平台，专注于前端开发和无服务器函数（Serverless Functions），提供快速部署、自动缩放和全球 CDN 支持。它特别适合部署静态网站、单页应用（SPA）、以及需要无服务器后端的项目。&lt;/p&gt;
&lt;p&gt;vercel 提供了免费计划，虽然有一些限制（具体限额大家可以自行参考官网信息），目前支撑我们的网站分析功能是够用的。&lt;/p&gt;
&lt;p&gt;登录 &lt;a href=&#34;https://vercel.com/&#34;&gt;vercel&lt;/a&gt; ，创建一个的账号，建议使用 GitHub 账号注册登录，在 &lt;code&gt;new project&lt;/code&gt; 中选择 &lt;code&gt;import&lt;/code&gt; 你刚刚 &lt;code&gt;fork&lt;/code&gt; 的 umami 项目。&lt;/p&gt;
&lt;p&gt;编辑构建命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yarn build &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; yarn update-db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;添加环境变量：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DATABASE_URL: 上一步从 supabase 获取
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TRACKER_SCRIPT_NAME: baize
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;点击部署并等待：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/ec253dbeea6b64b80904db66cab1220c.png&#34; alt=&#34;image-20250112214402104&#34;&gt;&lt;/p&gt;
&lt;p&gt;在 vercel 部署完成 umami 后会得到一个 &lt;code&gt;&amp;lt;deploy-id&amp;gt;.vercel.app&lt;/code&gt; ，默认登陆的账号密码是 &lt;strong&gt;admin&lt;/strong&gt; 和 &lt;strong&gt;umami&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;完成基础帐号配置后，点击侧边栏网站 Tab，点击添加网站。填写网站基本信息，可以勾选 &lt;code&gt;enable share URL&lt;/code&gt;，这样任何人都可以访问这个数据看板。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/2ee2a0a971baf285038c037e77ec1066.png&#34; alt=&#34;image-20250112214652457&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;umami-接入-hugo&#34;&gt;Umami 接入 Hugo&lt;/h4&gt;
&lt;p&gt;在 Tracking code 中，我们拿到对应的 &lt;code&gt;data-website-id&lt;/code&gt; 和 &lt;code&gt;src&lt;/code&gt; 。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script defer src&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://umami-jlwf.vercel.app/hugo-ladder&amp;#34;&lt;/span&gt; data-website-id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ec55b2da-4f55-45ef-8aed-26e57078fd15&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将其填入主题配置中的 &lt;code&gt;params.analytics.umami.website_id&lt;/code&gt; 和 &lt;code&gt;params.analytics.umami.url&lt;/code&gt; 即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;analytics&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;umami&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;enable&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;website_id&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ec55b2da-4f55-45ef-8aed-26e57078fd15&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://umami-jlwf.vercel.app/hugo-ladder&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不要忘记将你的网站统计查看地址配置给菜单：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[&lt;span style=&#34;color:#a6e22e&#34;&gt;menu&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;网站统计&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://umami-jlwf.vercel.app/share/ZKhEVgh56RlSfAMa/baize1998.github.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; = &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;至此你的站点在被访问的时候，会向部署的 vercel 的 umami 上报数据，任何人都可以跳转看到统计数据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i-blog.csdnimg.cn/img_convert/a879bad83a05ec2346665b8452a673b6.png&#34; alt=&#34;image-20250112215243834&#34;&gt;&lt;/p&gt;
&lt;p&gt;以上我们完成了本地博客的搭建以及网站数据统计能力的接入&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>SICP_python_期中前笔记</title>
      <link>https://cloudymount789.github.io/blog/sicp_note_before_mid/</link>
      <pubDate>Thu, 11 Dec 2025 17:02:23 +0800</pubDate>
      
      <guid>https://cloudymount789.github.io/blog/sicp_note_before_mid/</guid>
      <description>&lt;p&gt;摘要&lt;/p&gt;
&lt;p&gt;本文为《计算机程序的构造和解释》（SICP，CS61A 南大引进版）python部分期中前课程核心笔记，聚焦程序设计的底层逻辑与核心思想，旨在帮助学习者搭建“知其然更知其所以然”的编程认知框架。适合正在学习 CS61A 课程的学习者梳理知识体系，也可作为编程入门者夯实基础、理解程序设计本质的参考资料。&lt;/p&gt;
&lt;h1 id=&#34;sicp_python_期中前笔记&#34;&gt;SICP_python_期中前笔记&lt;/h1&gt;
&lt;hr&gt;
&lt;h3 id=&#34;易错提醒&#34;&gt;易错提醒&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;记得初始化参数！&lt;/li&gt;
&lt;li&gt;记得每个函数接受多少个输入！&lt;/li&gt;
&lt;li&gt;记得return！&lt;/li&gt;
&lt;li&gt;lambda函数要在被()调用的时候才会执行！&lt;/li&gt;
&lt;li&gt;被next拿出来的会在可变序列中消失！pop也是！可变序列在一处被修改后，所有对它的引用都会随之改变！！！&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;易忘函数&#34;&gt;易忘函数&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;all(iterable)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：如果 &lt;code&gt;iterable&lt;/code&gt; 中所有元素为 &lt;code&gt;True&lt;/code&gt;，返回 &lt;code&gt;True&lt;/code&gt;，否则返回 &lt;code&gt;False&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：会短路，即遇到第一个 &lt;code&gt;False&lt;/code&gt; 时立即返回 &lt;code&gt;False&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;code&gt;any(iterable)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：如果 &lt;code&gt;iterable&lt;/code&gt; 中至少有一个元素为 &lt;code&gt;True&lt;/code&gt;，返回 &lt;code&gt;True&lt;/code&gt;，否则返回 &lt;code&gt;False&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：会短路，即遇到第一个 &lt;code&gt;True&lt;/code&gt; 时立即返回 &lt;code&gt;True&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;code&gt;enumerate(iterable, start=0)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：返回一个枚举对象，包含可迭代对象的索引和值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;code&gt;start&lt;/code&gt; 参数指定索引的起始值。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;code&gt;filter(function, iterable)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：根据 &lt;code&gt;function&lt;/code&gt; 函数过滤 &lt;code&gt;iterable&lt;/code&gt; 中的元素，只有 &lt;code&gt;function&lt;/code&gt; 返回 &lt;code&gt;True&lt;/code&gt; 的元素会被保留。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：返回一个迭代器，需要转换为列表等容器查看结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;&lt;code&gt;pow(x, y, z=None)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：返回 &lt;code&gt;x&lt;/code&gt; 的 &lt;code&gt;y&lt;/code&gt; 次幂。如果提供了 &lt;code&gt;z&lt;/code&gt;，则返回 &lt;code&gt;(x ** y) % z&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：该函数在处理大数时效率较高。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;&lt;code&gt;zip(*iterables)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：将多个可迭代对象按元素配对，返回一个包含元组的迭代器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果输入可迭代对象长度不一致，按&lt;strong&gt;最短长度&lt;/strong&gt;配对。需要转换为列表等容器查看结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;错题&#34;&gt;错题：&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; print(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt;: print(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(f1, f2, f2())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;, Function, &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;world&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;hello
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;and只对左边求值，右边被短路，返回左边的值为None，而REPL遇到None不输出内容&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#3 神秘斐波那契数列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mystery&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    iter1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mystery()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    iter2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mystery()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    next(iter2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;yield from&lt;/span&gt; map(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; pair: pair[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pair[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;], zip(iter1, iter2))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;series1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mystery()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;series2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; filter(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; n: n &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, series1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;[next(series1) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;[next(series1) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;[next(series2) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;next(series1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;抽象的猜出一个函数的作用！
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    存在递归调用的生成器一般是无限的！
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    注意赋值语句在赋值的时候是不求值的！被使用的时候才会求值&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;functions--control&#34;&gt;Functions &amp;amp; Control&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&#34;expression--value&#34;&gt;Expression &amp;amp; Value&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;An expression describes a computation and evaluates to a value&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;include : function call notation, operators and operands&lt;/li&gt;
&lt;li&gt;order : evaluate operater subexpression &amp;gt; operand ~ &amp;gt; apply&lt;/li&gt;
&lt;li&gt;types : primitive(numbers, strings, names), arithmetic, call&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Programs manipulate values&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;types: 4&lt;/li&gt;
&lt;li&gt;Expressions evaluate to values in one or more steps&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;name--assignment&#34;&gt;Name &amp;amp; Assignment&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Values can be assigned to names to make referring to them easier.&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A name can only be bound to a single value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One way to introduce a new name in a program is with an assignment statement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Statements affect the program, &lt;strong&gt;but do not evaluate to values&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;function-definition&#34;&gt;Function Definition&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;function : abstraction&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Execution rule for def Statements&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Create a function with signature &lt;name&gt;(&lt;parameters&gt;)&lt;/li&gt;
&lt;li&gt;Set the body of that function to be everything indented after the first line&lt;/li&gt;
&lt;li&gt;Bind &lt;name&gt; to that function in the current frame&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;function-call-eval--apply&#34;&gt;Function Call (Eval &amp;amp; Apply)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Procedure for calling/applying user-defined functions (for now)&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Create a new environment frame&lt;/li&gt;
&lt;li&gt;Bind the function&amp;rsquo;s parameters to its arguments in that frame&lt;/li&gt;
&lt;li&gt;Execute the body of the function in the new environment&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;pure--non-pure-functions-print-vs-return-none&#34;&gt;Pure / Non-Pure Functions (Print vs Return, None)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The special value None represents nothing in Python&lt;/li&gt;
&lt;li&gt;A function that does not explicitly return a value will return None&lt;/li&gt;
&lt;li&gt;Careful: None is not displayed by the interpreter as the value of an expression&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pure Functions
just return values&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Non-Pure Functions
have side effects&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;conditional-control-if-statement&#34;&gt;Conditional Control (If-Statement)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Execution Rule for Conditional Statements:&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Each header is considered in order&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Evaluate the header’s conditional expression if the header is not an else&lt;/li&gt;
&lt;li&gt;If the expression evaluates to true or the header is an else, execute the suite and skip the remaining headers&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;要特别注意!有的语句前不该用elif/ else, 会导致被短路，只是检查条件的话，可以只用一个if就好了&lt;/p&gt;
&lt;h3 id=&#34;boolean-expressions--short-circuiting&#34;&gt;Boolean Expressions &amp;amp; Short Circuiting&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;boolean contexts:
False values in Python: False, None, 0, ‘’ (more to come)&lt;br&gt;
True values: everything else
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;special operators
&lt;exp1&gt; and &lt;exp2&gt; and &lt;exp3&gt; and &amp;hellip;
Evaluate to the first false value.
If none are false, evaluates to the last expression
&lt;exp1&gt; or &lt;exp2&gt; or &lt;exp3&gt; or &amp;hellip;
Evaluate to first true value.
If none are true, evaluates to the last expression
not &lt;exp&gt;
Evaluates to True if &lt;exp&gt; if a false value and False if &lt;exp&gt; is a true value&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;返回的是操作数的值！不是True or False！&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;notice: &lt;em&gt;&lt;strong&gt;Short-Circuiting&lt;/strong&gt;&lt;/em&gt; —— avoid side-effect and error&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;iterative-control-while-statement&#34;&gt;Iterative Control (While-Statement)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Execution Rule for While Statements:&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Evaluate the header’s expression&lt;/li&gt;
&lt;li&gt;If it is a true value, execute the  (whole) suite, then return to step 1&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;斐波那契数列&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fib&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Compute the nth Fibonacci number, for N &amp;gt;= 1&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pred, curr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 0th and 1st Fibonacci numbers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    k &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;              &lt;span style=&#34;color:#75715e&#34;&gt;# curr is the kth Fibonacci number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; k &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; n:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pred, curr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; curr, pred &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; curr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        k &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; curr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;error-messages&#34;&gt;Error Messages&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://cloudymount789.github.io/blog/sicp_note_before_mid/####-built-in-exceptation&#34;&gt;见后&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;environment-diagrams&#34;&gt;Environment Diagrams&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A visual tool to keep track of bindings &amp;amp; state of a computer program&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;A frame keeps track of variable-to-value bindings.&lt;/li&gt;
&lt;li&gt;Every call expression has a corresponding frame.&lt;/li&gt;
&lt;li&gt;Global, a.k.a(又名). the global frame, is the starting frame.
It doesn&amp;rsquo;t correspond to a specific call expression.&lt;/li&gt;
&lt;li&gt;Parent frames
The parent of a function is the frame in which it was defined.
If you can&amp;rsquo;t find a variable in the current frame, you check it&amp;rsquo;s parent, and so on. If you can&amp;rsquo;t find the variable, &lt;strong&gt;NameError&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;assignment-statements&#34;&gt;Assignment Statements&lt;/h3&gt;
&lt;p&gt;bind variable to value&lt;/p&gt;
&lt;h3 id=&#34;def-statements&#34;&gt;Def Statements&lt;/h3&gt;
&lt;p&gt;Create a function value: in current frame
&lt;img src=&#34;https://cloudymount789.github.io/images/image-1.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;func &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;name&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;formal parameters&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;) [parent&lt;span style=&#34;color:#f92672&#34;&gt;=&amp;lt;&lt;/span&gt;label&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;] &lt;span style=&#34;color:#75715e&#34;&gt;#Its parent is the current frame.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Bind &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;name&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; to the function value &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; the current frame
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;call-expressions&#34;&gt;Call Expressions&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a local frame, titled with the &lt;name&gt; of the function being applied.&lt;/li&gt;
&lt;li&gt;Copy the parent of the function (not always the current frame) to the local frame: [parent=&lt;label&gt;]&lt;/li&gt;
&lt;li&gt;Bind the &lt;formal parameters&gt; to the arguments in the local frame.&lt;/li&gt;
&lt;li&gt;Execute the body of the function in the environment that starts with the local frame&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;variable-lookup&#34;&gt;Variable Lookup&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Variable Lookup:&lt;/p&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Lookup name in the current frame&lt;/li&gt;
&lt;li&gt;Lookup name in parent frame, its parent frame, etc..&lt;/li&gt;
&lt;li&gt;Stop at the global frame&lt;/li&gt;
&lt;li&gt;If not found, an error is thrown&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;注意： 函数的parent frame 取决于def的环境，而不是调用的环境&lt;/li&gt;
&lt;li&gt;只能寻找并使用，若要修改则需要用nonlocal or global 声明&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;区别函数传参：若使用而未改变传入参数，则若外部参数发生变化，内部参数也会随之发生变化；若改变了该参数，相当于在内部框架对参数进行重新赋值，不会改变外部参数的值，称为闭包，并且此后外部参数再发生变化不会影响内部参数&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;求值（Evaluation）：是对表达式的求解和计算过程。
应用（Apply）：是指 函数调用，即将一个函数和它的参数结合在一起并执行。
当你调用一个函数时，首先会 求值 参数，接着 应用 函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lambda-expressions&#34;&gt;Lambda Expressions&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;evaluate to functions !&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Only the def statement gives the function an intrinsic name&lt;/p&gt;
&lt;h4 id=&#34;notice-lambda-for-loop&#34;&gt;notice: lambda for loop&lt;/h4&gt;
&lt;p&gt;如果你在循环中使用 lambda 函数时，要注意变量绑定的问题。通常，这种情况会导致 lambda 函数在创建时捕获的变量值是循环结束后的最终值。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;示例&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt;: i &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print([f() &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; fs])  &lt;span style=&#34;color:#75715e&#34;&gt;# [4, 4, 4, 4, 4]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因：&lt;/p&gt;
&lt;p&gt;lambda 捕获的是外部的 i 变量，而不是 i 在每次迭代中的值。所以，在迭代完成后，i 的值是 4，因此所有的 lambda 函数最终都返回 4。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;解决方案&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; i: &lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt;: i)(i) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print([f() &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; fs])  &lt;span style=&#34;color:#75715e&#34;&gt;# [0, 1, 2, 3, 4]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过为每个 lambda 函数创建一个局部作用域，确保每个 lambda 捕获当前 i 的值。&lt;/p&gt;
&lt;h3 id=&#34;recursion&#34;&gt;Recursion&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-2.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The same function fact is called multiple times, each time solving a simpler problem&lt;/li&gt;
&lt;li&gt;All the frames share the &lt;strong&gt;same parent&lt;/strong&gt; - only difference is the argument&lt;/li&gt;
&lt;li&gt;What n evaluates to depends upon the current environment（在每个frame中修改n的时候实现重新赋值，而不会因为其他frame而改变当前frame的n的值）&lt;/li&gt;
&lt;li&gt;执行顺序是从最末情况到base case开始创建frame，返回值是从base case得到的值回到最末层&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lists&#34;&gt;Lists&lt;/h3&gt;
&lt;h4 id=&#34;box-and-poinger-notation&#34;&gt;Box and Poinger Notation&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-5.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;lists-in-lists-in-lists&#34;&gt;Lists in Lists in Lists&lt;/h4&gt;
&lt;p&gt;point to another list&lt;/p&gt;
&lt;h3 id=&#34;default-arguments&#34;&gt;Default Arguments&lt;/h3&gt;
&lt;hr&gt;
&lt;h2 id=&#34;higher-order-functions&#34;&gt;Higher order functions&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;takes a function as an argument value, and/or
returns a function as a return value(often defined locally)&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;use: &lt;strong&gt;Abstraction and Generalization!&lt;/strong&gt; Give each function exactly one job, but make it apply to many related situations(分步进行的计算)
&lt;ol&gt;
&lt;li&gt;Generalize over different form of computation&lt;/li&gt;
&lt;li&gt;Helps remove repetitive segments of code&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lambda-expressions-vs-def-statements&#34;&gt;Lambda Expressions vs. Def Statements&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://cloudymount789.github.io/blog/sicp_note_before_mid/###lambda-expressions&#34;&gt;见这里&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;function-design--generalization&#34;&gt;Function Design &amp;amp; Generalization&lt;/h3&gt;
&lt;p&gt;函数泛化，提高可读性、可维护性和扩展性，在不同情景保持复用性&lt;/p&gt;
&lt;h3 id=&#34;functions-as-arguments&#34;&gt;Functions As Arguments&lt;/h3&gt;
&lt;p&gt;eg. 常见的高阶函数：&lt;/p&gt;
&lt;p&gt;map()：对一个可迭代对象的每个元素应用一个函数。&lt;/p&gt;
&lt;p&gt;filter()：根据给定的条件过滤一个可迭代对象。&lt;/p&gt;
&lt;p&gt;reduce()：累积地应用一个二元函数到一个可迭代对象上。&lt;/p&gt;
&lt;h3 id=&#34;functions-that-return-functions&#34;&gt;Functions That Return Functions&lt;/h3&gt;
&lt;p&gt;常常用于构建 闭包（closures），在其中返回的函数使用外部函数的环境变量来执行任务。&lt;/p&gt;
&lt;h3 id=&#34;function-currying&#34;&gt;Function Currying&lt;/h3&gt;
&lt;p&gt;函数柯里化（Currying）是将接受多个参数的函数转化为一系列接受单一参数的函数的技术。换句话说，柯里化的过程是将一个多参数的函数分解成多个单参数的函数序列。&lt;/p&gt;
&lt;p&gt;函数柯里化使得你可以部分应用函数参数，即先提供部分参数，得到一个新的函数，等待剩余的参数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;部分应用：通过柯里化，你可以将一个多参数的函数转化为一系列单一参数的函数，这有助于代码的简化和模块化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数链：柯里化可以链式调用，允许更流畅的表达式。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;self-reference&#34;&gt;Self Reference&lt;/h3&gt;
&lt;p&gt;自我引用是指一个对象、函数或变量引用自己。在函数编程中，自我引用通常用于递归函数的实现，它允许函数在其内部调用自己来解决问题。&lt;/p&gt;
&lt;p&gt;自我引用常常出现在递归中，其中函数调用自身来逐步解决子问题，直到达到一个基本情况。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;recursion-1&#34;&gt;Recursion&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;means: solving problems with a naturally repeating structure - they are defined in terms of themselves&lt;/li&gt;
&lt;li&gt;It requires you to find patterns of smaller problems, and to define the smallest problem possible&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;function-abstraction&#34;&gt;Function Abstraction&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心：隐藏复杂性，提供简洁的接口&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;definition-of-recursion&#34;&gt;Definition of Recursion&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;递归是一种通过函数调用自身来解决问题的方法。递归的核心在于问题能被分解成更简单的子问题，且每次递归都会接近基础情况（base case）。&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;基础情况：递归停止的条件，通常是最简单的情况，比如 n == 0 或 n == 1。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;递归情况：问题通过递归调用被分解成更小的子问题，最终汇总得到答案。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;structure-of-a-recursive-function&#34;&gt;Structure of a Recursive Function&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Divide - Conquer - Combine&lt;/strong&gt;&lt;/em&gt;
递归函数通常遵循以下结构：&lt;/p&gt;
&lt;p&gt;分解（Divide）：将问题分解成一个或多个子问题。(多种情况or多个步骤)&lt;/p&gt;
&lt;p&gt;解决（Conquer）：解决更小的子问题，通常是递归地调用函数。&lt;/p&gt;
&lt;p&gt;合并（Combine）：将子问题的解合并，得到问题的最终解。&lt;/p&gt;
&lt;p&gt;递归结构的关键是将一个复杂的问题通过逐步减小问题的规模，最终解决最小的子问题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;知道上个子问题的答案，可以怎样解决下一个问题？&lt;/li&gt;
&lt;li&gt;base case是什么？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;tree-recursion--recursion-tree&#34;&gt;Tree Recursion &amp;amp; Recursion Tree&lt;/h3&gt;
&lt;p&gt;树状递归是指递归函数的调用图呈树状结构。每次递归调用都会产生多个子调用，类似树的分支。递归树的深度取决于递归的层数，广度取决于每一层的调用数&lt;/p&gt;
&lt;h3 id=&#34;mutual-recursion&#34;&gt;Mutual Recursion&lt;/h3&gt;
&lt;p&gt;互相递归是指两个或更多的函数互相调用对方来完成任务。这种递归结构通常在两个函数的行为依赖于彼此时出现。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_odd&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; is_even(n &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_even&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; is_odd(n &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;iteration-vs-recursion&#34;&gt;Iteration vs. Recursion&lt;/h3&gt;
&lt;p&gt;递归可以更清晰地表示分解问题的过程，尤其是当问题的结构天然适合分解时。&lt;/p&gt;
&lt;p&gt;迭代通常更高效，因为每次递归调用都要维护栈帧，而迭代只需要更新变量。&lt;/p&gt;
&lt;h3 id=&#34;recursion-examples&#34;&gt;Recursion Examples:&lt;/h3&gt;
&lt;p&gt;When learning to write recursive functions, put the base case/s first&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意考虑边界情况!&lt;/strong&gt;
eg.&lt;strong&gt;Count Partitions&lt;/strong&gt;
Goal: Count the number of ways to give out n ( &amp;gt; 0) pieces of chocolate if nobody can have more than m (&amp;gt; 0) pieces.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If n is negative, then we cannot get to a valid partition&lt;/li&gt;
&lt;li&gt;If n is 0, then we have arrived at a valid partition&lt;/li&gt;
&lt;li&gt;If the largest piece we can use is 0, then we cannot get to a valid partition&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;sum-digits&#34;&gt;Sum-Digits&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sum_digits&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; sum_digits(n &lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;cascade级联&#34;&gt;Cascade(级联)&lt;/h4&gt;
&lt;p&gt;级联递归指的是将多个函数或操作按顺序组合，每个函数的输出作为下一个函数的输入&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#从高位开始输出每位数字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cascade&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cascade(n &lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(n &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;在递归函数中，通常会在每一次递归调用时暂停当前函数的执行，直到递归结束并返回&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#从低位开始输出每位数字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cascade&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(n &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cascade(n &lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;fibonacci&#34;&gt;Fibonacci&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fibonacci&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fibonacci(n &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fibonacci(n &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;count-partitions&#34;&gt;Count-Partitions&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;count_partitions&lt;/span&gt;(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, n &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        count &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; count_partitions(n &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; i)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; count
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;if-time---speeding-up-recursion&#34;&gt;If Time - Speeding Up Recursion&lt;/h3&gt;
&lt;p&gt;store some values that had already calculated&lt;/p&gt;
&lt;h3 id=&#34;summery&#34;&gt;SUMMERY&lt;/h3&gt;
&lt;p&gt;Recursion has three main components&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Base case/s: The simplest form of the problem&lt;/li&gt;
&lt;li&gt;Recursive call/s: Smaller version of the problem&lt;/li&gt;
&lt;li&gt;Use the solution to the smaller version of the problem to arrive at the solution to the original problem&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;When working with recursion, use functional abstraction: assume the recursive call gives the correct result&lt;/li&gt;
&lt;li&gt;Tree recursion makes multiple recursive calls and explores different choices&lt;/li&gt;
&lt;li&gt;Use doctests and your own examples to help you figure out the simplest forms and how to make the problem smaller&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;sequence&#34;&gt;Sequence&lt;/h2&gt;
&lt;h3 id=&#34;sequence-abstraction&#34;&gt;Sequence Abstraction&lt;/h3&gt;
&lt;p&gt;All sequences have finite length.
Each element in a sequence has a discrete integer index.&lt;/p&gt;
&lt;h3 id=&#34;sequence-operation-expression&#34;&gt;Sequence Operation (Expression)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#### Get Item&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;get the ith element &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;seq&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;[i]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#### Slicing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;##### Slicing Creates New Values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create a copy of the sequence &lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; i to j  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;seq&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;[i:j:skip]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#### Check Membership&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;check &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; the value of &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;expr&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;seq&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;expr&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;seq&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#### Concatenate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;combine two sequences into a single sequence  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;s1&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;s2&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;sequence-processing-statement&#34;&gt;Sequence Processing (Statement)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#### Iterating&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;For each element &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;seq&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) Bind it to &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;name&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) Execute &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;body&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;unpacking&#34;&gt;Unpacking&lt;/h4&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-3.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;range&#34;&gt;Range&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;range(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;start&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;end&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;skip&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-4.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;list&#34;&gt;List&lt;/h3&gt;
&lt;h4 id=&#34;list-comprehensions&#34;&gt;List Comprehensions&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;expr&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;name&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;seq&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;cond&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;string&#34;&gt;String&lt;/h3&gt;
&lt;h4 id=&#34;string-literals-three-forms&#34;&gt;String Literals (Three Forms)&lt;/h4&gt;
&lt;p&gt;Python 中有三种常见的字符串字面量表示形式：&lt;/p&gt;
&lt;p&gt;单引号： &amp;lsquo;Hello&amp;rsquo;&lt;/p&gt;
&lt;p&gt;双引号： &amp;ldquo;Hello&amp;rdquo;&lt;/p&gt;
&lt;p&gt;三引号： &amp;lsquo;&amp;lsquo;&amp;lsquo;Hello&amp;rsquo;&amp;rsquo;&amp;rsquo; 或 &amp;ldquo;&amp;ldquo;&amp;ldquo;Hello&amp;rdquo;&amp;rdquo;&amp;rdquo;
三引号用于表示多行字符串，或者在字符串中包含引号时可以避免转义。&lt;/p&gt;
&lt;h3 id=&#34;sequence-aggregation-sum-max--min-all--any&#34;&gt;Sequence Aggregation (Sum, Max / Min, All / Any)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-6.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;dictionary&#34;&gt;Dictionary&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cloudymount789.github.io/images/image-7.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;data-abstraction-and-tree&#34;&gt;Data abstraction and Tree&lt;/h2&gt;
&lt;p&gt;Compound values combine other values together
Data abstraction lets us manipulate compound values as units
e.g.
有理数由分子（numerator）和分母（denominator）组成，是分数的精确表示形式，以整数对形式存在。常规表达进行除法运算，可能会丢失精确表示。
so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 基础构造与选择器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rational&lt;/span&gt;(n, d): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [n, d]  &lt;span style=&#34;color:#75715e&#34;&gt;# 构造有理数（列表形式）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;numer&lt;/span&gt;(x): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; x[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]  &lt;span style=&#34;color:#75715e&#34;&gt;# 获取分子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;denom&lt;/span&gt;(x): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; x[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]  &lt;span style=&#34;color:#75715e&#34;&gt;# 获取分母&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 运算实现&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mul_rational&lt;/span&gt;(x, y): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; rational(numer(x)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;numer(y), denom(x)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;denom(y))  &lt;span style=&#34;color:#75715e&#34;&gt;# 乘法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;add_rational&lt;/span&gt;(x, y):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    nx, dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numer(x), denom(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ny, dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numer(y), denom(y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; rational(nx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ny&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx, dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy)  &lt;span style=&#34;color:#75715e&#34;&gt;# 加法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;print_rational&lt;/span&gt;(x): print(numer(x), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, denom(x))  &lt;span style=&#34;color:#75715e&#34;&gt;# 打印&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rationals_are_equal&lt;/span&gt;(x, y): &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; numer(x)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;denom(y) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; numer(y)&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;denom(x)  &lt;span style=&#34;color:#75715e&#34;&gt;# 相等判断&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 最简形式优化（引入最大公约数）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; math &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; gcd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rational&lt;/span&gt;(n, d):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    g &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gcd(n, d)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [n&lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt;g, d&lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt;g]  &lt;span style=&#34;color:#75715e&#34;&gt;# 返回最简分数形式的有理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;abstraction-barrier-between-representation--use&#34;&gt;Abstraction Barrier (between Representation &amp;amp; Use)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;def: 将数据的表示和使用分开的一种设计思想。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过抽象屏障，可以使得数据的表示方式对外部用户隐藏，从而保护数据的结构，使其不容易受到外部代码的直接修改。
把底层的数据结构和功能封装起来，使得使用者可以通过抽象接口来操作数据，而不需要理解内部的实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表示：指的是数据的内部结构，如何在计算机中存储这些数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用：指的是外部代码与数据进行交互的方式，用户与数据的交互不关心数据的具体实现，只关心如何操作数据。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;constructor--selectors&#34;&gt;Constructor &amp;amp; Selectors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Constructor（构造函数）是用于创建数据对象的函数，它定义了如何通过一些基本组件来构造出复杂的数据结构。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Selectors（选择器）是用于从已构建的数据结构中提取信息的函数。它们允许用户访问数据结构中的元素或属性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;break:
过度依赖数据的内部实现，或者在外部代码中直接修改、访问类和数据结构的私有部分或底层细节&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;abstract-data-type&#34;&gt;Abstract Data Type&lt;/h3&gt;
&lt;p&gt;指数据结构和操作的组合
e.g.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;列表（List）：一个抽象数据类型，可以进行元素添加、删除、查找等操作，具体实现可以是动态数组、链表等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;栈（Stack）：一种抽象数据类型，具有push()和pop()等操作，可以通过不同的实现方式（例如数组或链表）来实现。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;closure&#34;&gt;Closure&lt;/h3&gt;
&lt;p&gt;指函数不仅能够访问其自己的局部变量，还能够访问外部函数的局部变量。闭包使得函数能够“记住”它被创建时的环境，即使外部函数已经返回，内部函数仍然能够访问外部函数的变量。&lt;/p&gt;
&lt;h3 id=&#34;tree-abstraction&#34;&gt;Tree Abstraction&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;递归描述（木质树视角）
树由一个根（root）和一组分支（branches）组成。
每个分支本身也是一棵树。
零个分支的树称为叶子（leaf）。
&lt;ul&gt;
&lt;li&gt;Label：节点的值&lt;/li&gt;
&lt;li&gt;Branches：子节点或子树，是一个列表，其中每个元素表示一个子节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;相对描述（家族树视角）
树中每个位置称为节点（node）。
每个节点有一个标签值（label value）。
节点间存在父子关系（parent/child）。
常根据节点位置描述值的关系&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;树包含标签值和分支列表的结构，分支列表可为空（对应叶子）&lt;/p&gt;
&lt;h3 id=&#34;tree-implementation&#34;&gt;Tree Implementation&lt;/h3&gt;
&lt;h4 id=&#34;constructor-tree&#34;&gt;Constructor: tree&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tree&lt;/span&gt;(label, branches&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; branch &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; branches:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;assert&lt;/span&gt; is_tree(branch)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [label] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; list(branches)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;selectors-label-branches&#34;&gt;Selectors: label, branches&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;label&lt;/span&gt;(tree):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; tree[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;branches&lt;/span&gt;(tree):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; tree[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;convinence-functions-is_tree-is_leaf&#34;&gt;Convinence Functions: is_tree, is_leaf&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_tree&lt;/span&gt;(tree):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; type(tree) &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; list &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; len(tree) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; branch &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; branches(tree):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; is_tree(branch):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;is_leaf&lt;/span&gt;(tree):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; branches(tree)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;tree-processing-using-recursion&#34;&gt;Tree Processing (using Recursion)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;count_leaves&lt;/span&gt;(t):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;统计树的叶子节点总数&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; is_leaf(t):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 叶子节点返回1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 递归计算每个分支的叶子数，求和聚合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        branch_counts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [count_leaves(b) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; branches(t)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; sum(branch_counts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;increment_leaves&lt;/span&gt;(t):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;返回叶子节点标签递增1的新树&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; is_leaf(t):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; tree(label(t) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#75715e&#34;&gt;# 叶子节点标签+1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 递归处理每个分支，保留非叶子节点标签&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        bs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [increment_leaves(b) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; branches(t)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; tree(label(t), bs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;increment&lt;/span&gt;(t):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;返回所有节点标签递增1的新树&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 根节点标签+1，递归处理所有分支&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; tree(label(t) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, [increment(b) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; branches(t)])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;mutablility&#34;&gt;Mutablility&lt;/h2&gt;
&lt;p&gt;指对象在创建后是否可以改变其内容或状态，它们影响了对象的行为、存储方式、以及如何处理对象的引用&lt;/p&gt;
&lt;h3 id=&#34;objects&#34;&gt;Objects&lt;/h3&gt;
&lt;p&gt;对象 是程序中所有数据的基本单位。每个对象都有两个主要属性：身份（Identity）和 值（Value）。对象的身份由它的内存地址决定，而值则是对象所包含的数据。对象的行为通过其类型（如列表、字典、整数等）决定&lt;/p&gt;
&lt;h3 id=&#34;mutable-objects&#34;&gt;Mutable Objects&lt;/h3&gt;
&lt;h4 id=&#34;lists-1&#34;&gt;Lists&lt;/h4&gt;
&lt;p&gt;append()：向列表末尾添加元素。&lt;/p&gt;
&lt;p&gt;pop()：移除并返回列表的最后一个元素，或指定索引的元素。&lt;/p&gt;
&lt;p&gt;remove()：移除列表中第一个匹配的指定元素。&lt;/p&gt;
&lt;p&gt;extend()：将一个可迭代对象中的元素添加到列表末尾。&lt;/p&gt;
&lt;p&gt;Slice Assignment：通过切片语法修改列表中的部分元素。&lt;/p&gt;
&lt;h3 id=&#34;dictionaries&#34;&gt;Dictionaries&lt;/h3&gt;
&lt;p&gt;由键（key）和值（value）对组成的映射。字典允许通过键来查找对应的值，可以进行修改、删除或添加新的键值对。&lt;/p&gt;
&lt;h3 id=&#34;mutate-with-functions&#34;&gt;Mutate with Functions&lt;/h3&gt;
&lt;p&gt;由于 Python 中的可变对象是通过引用传递的，修改可变对象会影响原始对象&lt;/p&gt;
&lt;h3 id=&#34;immutable-objects&#34;&gt;Immutable Objects&lt;/h3&gt;
&lt;p&gt;Tuple, str, int, float
可变仅指元组本身的元素绑定不可变，若元组包含可变元素（如列表），该可变元素的内容可被修改。&lt;/p&gt;
&lt;h3 id=&#34;identity--equality&#34;&gt;Identity &amp;amp; Equality&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Identity 指的是对象在内存中的位置，通常由 id() 函数来查看。
同一性（is运算符）：判断两个表达式是否指向同一个对象。&lt;/li&gt;
&lt;li&gt;Equality 则是指对象的内容是否相等。对于可变对象，修改对象的内容不会改变对象的身份；而对于不可变对象，任何修改都需要创建一个新对象。
同一对象必然值相等，但值相等的对象不一定是同一对象。
相等性（==运算符）：判断两个表达式的值是否相等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;default-arguments-1&#34;&gt;Default Arguments&lt;/h3&gt;
&lt;p&gt;函数的默认参数值是函数定义的一部分，仅在函数定义时创建一次，而非每次调用时重新生成。
若默认参数是可变对象（如列表），多次调用函数会共享该对象，导致意外的状态累积。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;append_to_list&lt;/span&gt;(value, lst&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[]):  &lt;span style=&#34;color:#75715e&#34;&gt;# 注意：默认值是可变的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lst&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(value)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; lst
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(append_to_list(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))  &lt;span style=&#34;color:#75715e&#34;&gt;# 输出 [1]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(append_to_list(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;))  &lt;span style=&#34;color:#75715e&#34;&gt;# 输出 [1, 2]，因为默认的列表是共享的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要避免这种情况，使用不可变的默认参数（例如 None）并在函数体内初始化：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;append_to_list&lt;/span&gt;(value, lst&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; lst &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lst &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lst&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(value)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; lst
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(append_to_list(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))  &lt;span style=&#34;color:#75715e&#34;&gt;# 输出 [1]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(append_to_list(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;))  &lt;span style=&#34;color:#75715e&#34;&gt;# 输出 [2]，避免了共享同一个列表的问题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;mutable-functions-nonlocal&#34;&gt;Mutable Functions (Nonlocal)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nonlocal 关键字用于修改外层函数作用域中的变量，而不是创建一个局部变量&lt;/li&gt;
&lt;li&gt;tip:
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果外层函数的变量是可变的（例如列表、字典等），你可以修改它的内容，而无需使用 nonlocal。但如果你想直接对变量本身（例如赋值为一个新对象）进行修改，就需要使用 nonlocal。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果外层函数的变量是不可变的（例如整数、字符串、元组等），则即使使用 nonlocal 关键字，你也只能修改它的引用，而不能直接改变它的值（因为不可变对象的值一旦创建就无法修改）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;unboundlocalerror&#34;&gt;UnboundLocalError&lt;/h4&gt;
&lt;p&gt;当你在函数内部引用一个变量，并且该变量在局部作用域中没有声明时，Python 会抛出 UnboundLocalError 错误。这通常发生在试图在函数中修改局部变量时，而没有明确声明该变量为 nonlocal 或 global。&lt;/p&gt;
&lt;h4 id=&#34;mutate-mutable-values-wihout-nonlocal&#34;&gt;Mutate Mutable Values wihout Nonlocal&lt;/h4&gt;
&lt;p&gt;如果一个变量是可变的且位于外部作用域，你可以在内部函数中修改它的内容，而不必使用 nonlocal&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#嵌套列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [t]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;extend(t)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;], [&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(t[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;])  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;iterable&#34;&gt;Iterable&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Iterable&lt;/strong&gt; 是任何能够逐个返回其成员的对象。它包括序列类型（如列表、字符串、元组）以及非序列类型（如字典）。&lt;/p&gt;
&lt;h3 id=&#34;iterators-iter--next&#34;&gt;Iterators (iter &amp;amp; next)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iter(iterable)&lt;/strong&gt;：此函数返回一个迭代器(iterator)，它可以逐个遍历&lt;strong&gt;可迭代对象&lt;/strong&gt;(iterable)的元素。可以把它理解为一本书的书签，从书的前面开始。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;next(iterator)&lt;/strong&gt;：此函数返回&lt;strong&gt;迭代器&lt;/strong&gt;的下一个元素，并将书签移动到下一页。迭代器会记住它的当前位置。如果当前位置已经是书的结尾，它会抛出一个错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;views-of-a-dictionary-keys--values&#34;&gt;Views of a Dictionary (keys &amp;amp; values)&lt;/h3&gt;
&lt;p&gt;字典及其&lt;strong&gt;键&lt;/strong&gt;(keys)、&lt;strong&gt;值&lt;/strong&gt;(values)和&lt;strong&gt;项&lt;/strong&gt;(items)都是可迭代对象。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;d.keys()&lt;/code&gt;&lt;/strong&gt;：返回字典&lt;strong&gt;键&lt;/strong&gt;的可迭代视图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;d.values()&lt;/code&gt;&lt;/strong&gt;：返回字典&lt;strong&gt;值&lt;/strong&gt;的可迭代视图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;d.items()&lt;/code&gt;&lt;/strong&gt;：返回字典&lt;strong&gt;键值对&lt;/strong&gt;的可迭代视图。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;built-in-functions-for-iteration&#34;&gt;Built-in Functions for Iteration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;map(func, iterable)&lt;/strong&gt;：对可迭代对象中的每个元素应用指定的函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;filter(func, iterable)&lt;/strong&gt;：过滤可迭代对象中的元素，保留通过&lt;strong&gt;函数&lt;/strong&gt;判断为&lt;strong&gt;真&lt;/strong&gt;的元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zip(first_iter, second_iter)&lt;/strong&gt;：将两个或多个可迭代对象中的元素按顺序组成元组返回。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reversed(sequence)&lt;/strong&gt;：返回一个反向迭代器，逐个遍历&lt;strong&gt;序列&lt;/strong&gt;中的元素。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;create-iterators&#34;&gt;Create Iterators&lt;/h3&gt;
&lt;p&gt;这些函数允许我们创建迭代器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;map&lt;/strong&gt;：将一个函数应用到每个元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;filter&lt;/strong&gt;：根据一个&lt;strong&gt;条件函数&lt;/strong&gt;筛选元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zip&lt;/strong&gt;：将两个可迭代对象的元素按顺序组成元组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reversed&lt;/strong&gt;：创建一个反向遍历&lt;strong&gt;序列&lt;/strong&gt;的迭代器。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;view-iterators&#34;&gt;View Iterators&lt;/h3&gt;
&lt;p&gt;这些函数将&lt;strong&gt;可迭代对象&lt;/strong&gt;转换为不同的数据结构视图：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;list(iterable)&lt;/strong&gt;：将可迭代对象转换为列表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tuple(iterable)&lt;/strong&gt;：将可迭代对象转换为元组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sorted(iterable)&lt;/strong&gt;：将可迭代对象排序后返回一个新的列表。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Example of iterators and map function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;naturals&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; nats &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; naturals()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; next(nats)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; next(nats)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; nats1, nats2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; naturals(), naturals()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; [next(nats1) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; next(nats2) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;]  &lt;span style=&#34;color:#75715e&#34;&gt;# Squares the first 5 natural numbers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;generators-and-generator-functions&#34;&gt;Generators and Generator Functions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generators&lt;/strong&gt;：生成器是通过调用生成器函数自动创建的迭代器。它使用&lt;code&gt;yield&lt;/code&gt;关键字逐个返回值，并保持函数的状态，以便后续调用&lt;code&gt;next()&lt;/code&gt;时继续执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generator Functions&lt;/strong&gt;：生成器函数包含一个或多个&lt;code&gt;yield&lt;/code&gt;语句。与普通函数不同，生成器函数在每次&lt;code&gt;yield&lt;/code&gt;时返回一个值，而不是一次性返回。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;yield-value&#34;&gt;&lt;code&gt;yield&lt;/code&gt; value&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;yield&lt;/code&gt;关键字用于生成一个值，并挂起函数的执行，之后可以继续执行。&lt;/p&gt;
&lt;h4 id=&#34;yield-from-iterator--iterable&#34;&gt;&lt;code&gt;yield from iterator / iterable&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;yield from&lt;/code&gt;语法用于将另一个迭代器或可迭代对象的所有值逐个返回。它简化了代码，在需要将值传递给另一个生成器或可迭代对象时非常有用。&lt;/p&gt;
&lt;h4 id=&#34;generators-representing-infinite-sequences&#34;&gt;Generators Representing Infinite Sequences&lt;/h4&gt;
&lt;p&gt;生成器可以表示无限序列。例如，上述的&lt;code&gt;naturals()&lt;/code&gt;函数生成一个从0开始的无限自然数序列。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;exception&#34;&gt;Exception&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Exception&lt;/strong&gt; 是程序在运行时遇到的错误，会打断程序的正常执行流程。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;中文名&lt;/th&gt;
          &lt;th&gt;英文名&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;异常&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Exception&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;程序运行时检测到的错误，会中断当前代码的正常执行流程。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;抛出异常&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Raise an Exception&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;使用 &lt;code&gt;raise&lt;/code&gt; 语句主动触发异常。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;捕获异常&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Catch / Handle Exception&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;使用 &lt;code&gt;try...except&lt;/code&gt; 捕获并处理异常，防止程序崩溃。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;异常传播&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Exception Propagation&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;如果当前作用域未捕获异常，异常会沿着调用栈往上层传递，直到被捕获或导致程序终止。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;异常对象&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Exception Object&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;每个异常都是一个类的实例，包含错误类型、信息、堆栈信息等。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;异常类层级结构&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Exception Hierarchy&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Python 中所有异常都是从 &lt;code&gt;BaseException&lt;/code&gt; 类继承而来的一棵树。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;built-in-exceptions&#34;&gt;Built-in Exceptions&lt;/h4&gt;
&lt;p&gt;Python提供了多个内建异常，每种异常用于不同类型的错误。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;异常名&lt;/th&gt;
          &lt;th&gt;英文说明&lt;/th&gt;
          &lt;th&gt;常见触发场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SyntaxError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Syntax error&lt;/td&gt;
          &lt;td&gt;语法错误（代码结构非法）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;IndentationError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Indentation error&lt;/td&gt;
          &lt;td&gt;缩进错误&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NameError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Undefined variable&lt;/td&gt;
          &lt;td&gt;使用了未定义的变量&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Type mismatch&lt;/td&gt;
          &lt;td&gt;类型不兼容（如把字符串加到整数上）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ValueError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Invalid value&lt;/td&gt;
          &lt;td&gt;值类型正确但取值非法（如 &lt;code&gt;int(&amp;quot;abc&amp;quot;)&lt;/code&gt;）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;IndexError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Index out of range&lt;/td&gt;
          &lt;td&gt;列表索引越界&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;KeyError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Missing dictionary key&lt;/td&gt;
          &lt;td&gt;字典中查找不存在的键&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;AttributeError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Missing attribute&lt;/td&gt;
          &lt;td&gt;对象没有该属性或方法&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ZeroDivisionError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Division by zero&lt;/td&gt;
          &lt;td&gt;除以零错误&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;IOError&lt;/code&gt; / &lt;code&gt;OSError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Input/Output error&lt;/td&gt;
          &lt;td&gt;文件或系统操作失败（如找不到文件）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;FileNotFoundError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;File not found&lt;/td&gt;
          &lt;td&gt;打开不存在的文件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ImportError&lt;/code&gt; / &lt;code&gt;ModuleNotFoundError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Import error&lt;/td&gt;
          &lt;td&gt;模块导入失败&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;RuntimeError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Generic runtime error&lt;/td&gt;
          &lt;td&gt;运行时检测到其他异常情况&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;RecursionError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Maximum recursion depth exceeded&lt;/td&gt;
          &lt;td&gt;递归层数太深&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;AssertionError&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Assertion failed&lt;/td&gt;
          &lt;td&gt;断言失败（&lt;code&gt;assert&lt;/code&gt;）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;StopIteration&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Iterator finished&lt;/td&gt;
          &lt;td&gt;迭代器结束（由迭代协议内部抛出）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;StopAsyncIteration&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Async iterator finished&lt;/td&gt;
          &lt;td&gt;异步迭代结束&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;exception-mechanism&#34;&gt;Exception Mechanism&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detection (发现错误)&lt;/strong&gt;: 错误会在程序执行时被发现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Raising (raise)&lt;/strong&gt;: 可以通过&lt;code&gt;raise&lt;/code&gt;关键字显式地抛出错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propagation (异常传播)&lt;/strong&gt;: 如果当前作用域没有捕获异常，异常会沿着调用栈向上传播，直到被捕获或导致程序终止。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Catching (捕获)&lt;/strong&gt;: 错误可以使用&lt;code&gt;try&lt;/code&gt;/&lt;code&gt;except&lt;/code&gt;块进行捕获。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Else (无异常时执行)&lt;/strong&gt;: 如果&lt;code&gt;try&lt;/code&gt;块没有抛出异常，则执行&lt;code&gt;else&lt;/code&gt;块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finally (始终执行)&lt;/strong&gt;: 无论是否发生异常，&lt;code&gt;finally&lt;/code&gt;块总是会执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;raise-syntax&#34;&gt;&lt;code&gt;raise&lt;/code&gt; Syntax&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;expression&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# &amp;lt;expression&amp;gt; 必须是一个异常对象&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;example&#34;&gt;Example&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;divide&lt;/span&gt;(a, b):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;assert&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Divider cannot be zero&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; b
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AssertionError&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Assertion failed:&amp;#34;&lt;/span&gt;, e)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ZeroDivisionError&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Caught division error:&amp;#34;&lt;/span&gt;, e)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Result is:&amp;#34;&lt;/span&gt;, result)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;finally&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Computation ended.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;divide(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Assertion failed: Divider cannot be zero
Computation ended.
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
  </channel>
</rss>