<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>初五的小窝</title><description>ChuwuYo的小窝, 这里有我的日常、思考以及一些开发分享, 欢迎你的到来</description><link>https://blog.chuwu.top/</link><language>zh-CN</language><atom:link href="https://blog.chuwu.top/rss.xml" rel="self" type="application/rss+xml"/><item><title>序章</title><link>https://blog.chuwu.top/posts/2025-09-29/unveiling/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2025-09-29/unveiling/</guid><description>ChuwuYo 博客的第一个版本，使用 Charlotte 主题构建</description><pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;欢迎来到 Chuwu 的博客。&lt;/h1&gt;
&lt;h2&gt;这个博客是使用 &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; 框架和基于 &lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt; 的 &lt;a href=&quot;https://github.com/ChuwuYo/Charlotte&quot;&gt;Charlotte主题&lt;/a&gt; 构建的。&lt;/h2&gt;
&lt;p&gt;关于是否建立一个博客，其实我想了很久，最后还是说服了自己，希望这份热情能持续下去。&lt;/p&gt;
&lt;h3&gt;不知道我们能走多久呢……&lt;/h3&gt;
&lt;hr /&gt;
&lt;p&gt;感谢以下项目与项目开发者们：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;saicaca-Fuwari&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/afoim/fuwari&quot;&gt;afoim(二叉树树)-Fuwari&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/matsuzaka-yuki/Mizuki&quot;&gt;yuki(松坂有希)-Mizuki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/xingpingcn/enhanced-FaaS-in-China&quot;&gt;enhanced-FaaS-in-China&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vercel.cdn.yt-blog.top/&quot;&gt;Vercel CDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>MySQL学习笔记 (8)</title><link>https://blog.chuwu.top/posts/sql/mysql8/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql8/</guid><description>INSERT、UPDATE、DELETE、视图、事务</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/sql-data-manipulation-statements.html&quot;&gt;数据操作&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;INSERT INTO&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;INSERT INTO&lt;/code&gt; 语句用于向表中插入新记录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO employee (emp_id, last_name, dept_no)
VALUES (201, &apos;周七&apos;, &apos;D01&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一次插入多行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO employee (emp_id, last_name, dept_no)
VALUES (202, &apos;吴八&apos;, &apos;D01&apos;),
       (203, &apos;郑九&apos;, &apos;D02&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有出现在列表里的列会使用默认值，或者是 NULL。&lt;/p&gt;
&lt;p&gt;也可以把查询结果插入另一张表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE employee_archive (
    emp_id    INTEGER     NOT NULL,
    last_name VARCHAR(40) NOT NULL
);

INSERT INTO employee_archive (emp_id, last_name)
SELECT emp_id, last_name
FROM   employee
WHERE  hire_date &amp;lt; DATE &apos;2020-01-01&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;UPDATE&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;UPDATE&lt;/code&gt; 语句用于更新表中的记录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UPDATE employee
SET    salary = salary * 1.05,
       dept_no = &apos;D02&apos;
WHERE  emp_id = 101;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：省略 &lt;code&gt;WHERE&lt;/code&gt; 会更新表中的所有行。&lt;/p&gt;
&lt;h2&gt;DELETE&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DELETE&lt;/code&gt; 语句用于删除表中的记录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM employee
WHERE  emp_id = 103;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：省略 &lt;code&gt;WHERE&lt;/code&gt; 会删除表中的所有行。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TRUNCATE TABLE&lt;/code&gt; 也会清空表，和逐行 &lt;code&gt;DELETE&lt;/code&gt; 不完全一样。&lt;/p&gt;
&lt;h2&gt;视图&lt;/h2&gt;
&lt;p&gt;视图是基于 SQL 语句的结果集的可视化表。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE VIEW employee_public AS
SELECT emp_id, last_name, dept_no
FROM   employee;

SELECT * FROM employee_public
WHERE  dept_no = &apos;D01&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除视图：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DROP VIEW employee_public;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;WITH CHECK OPTION&lt;/code&gt; 要求通过视图插入或更新的行，仍然能被该视图查到。带聚合、&lt;code&gt;DISTINCT&lt;/code&gt; 或多表的视图往往不能更新。&lt;/p&gt;
&lt;h2&gt;事务&lt;/h2&gt;
&lt;p&gt;事务把多条语句绑在一起：要么全部成功，要么全部取消。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE account (
    id      INTEGER        NOT NULL,
    balance NUMERIC(12, 2) NOT NULL,
    CONSTRAINT account_pk PRIMARY KEY (id)
);

INSERT INTO account (id, balance)
VALUES (1, 500), (2, 200);

START TRANSACTION;

UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;

COMMIT;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;START TRANSACTION&lt;/code&gt;：开始事务&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COMMIT&lt;/code&gt;：提交&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ROLLBACK&lt;/code&gt;：回滚，撤销还没提交的修改&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;许多客户端默认每条语句自动提交。需要多条语句一起提交时，先执行 &lt;code&gt;START TRANSACTION&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/insert.html&quot;&gt;MySQL 26.7 · INSERT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/update.html&quot;&gt;MySQL 26.7 · UPDATE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/delete.html&quot;&gt;MySQL 26.7 · DELETE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/create-view.html&quot;&gt;MySQL 26.7 · CREATE VIEW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/commit.html&quot;&gt;MySQL 26.7 · START TRANSACTION&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (8)</title><link>https://blog.chuwu.top/posts/python/python8/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python8/</guid><description>模块与包、输入输出与文件、pathlib、类、类型注解、venv 与标准库地图</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;import&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import math
print(math.sqrt(2))

from math import sqrt, pi
print(sqrt(2), pi)

import datetime as dt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模块是一个 &lt;code&gt;.py&lt;/code&gt; 文件。&lt;code&gt;import math&lt;/code&gt; 之后通过 &lt;code&gt;math.sqrt&lt;/code&gt; 访问。&lt;code&gt;from math import sqrt&lt;/code&gt; 将 &lt;code&gt;sqrt&lt;/code&gt; 导入当前命名空间。&lt;code&gt;as&lt;/code&gt; 用于指定别名。&lt;/p&gt;
&lt;p&gt;同一个模块只执行顶层代码一次，结果缓存在 &lt;code&gt;sys.modules&lt;/code&gt; 里。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;from module import *&lt;/code&gt; 会导入模块中的全部名字，不建议使用。&lt;/p&gt;
&lt;p&gt;命令行参数在 &lt;code&gt;sys.argv&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import sys
print(sys.argv)  # [脚本路径, 后续参数...]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;包与 &lt;strong&gt;init&lt;/strong&gt;.py&lt;/h2&gt;
&lt;p&gt;含 &lt;a href=&quot;https://docs.python.org/3/reference/import.html#regular-packages&quot;&gt;&lt;code&gt;__init__.py&lt;/code&gt;&lt;/a&gt; 的目录是包，可以 &lt;code&gt;import pkg.mod&lt;/code&gt;（&lt;a href=&quot;https://docs.python.org/3/tutorial/modules.html#packages&quot;&gt;Packages&lt;/a&gt;）。&lt;code&gt;__init__.py&lt;/code&gt; 可以为空。包内可用相对导入：&lt;code&gt;from . import echo&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;没有 &lt;code&gt;__init__.py&lt;/code&gt; 的目录也可能作为 &lt;a href=&quot;https://peps.python.org/pep-0420/&quot;&gt;namespace package&lt;/a&gt;（PEP 420）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sound/
    __init__.py
    effects/
        __init__.py
        echo.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;from sound.effects import echo&lt;/code&gt; 后使用 &lt;code&gt;echo.surround()&lt;/code&gt;。包内子模块也是完整模块名：&lt;code&gt;sound.effects.echo&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;打包发布见 &lt;a href=&quot;https://packaging.python.org/&quot;&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;if &lt;strong&gt;name&lt;/strong&gt; == &apos;&lt;strong&gt;main&lt;/strong&gt;&apos;&lt;/h2&gt;
&lt;p&gt;脚本直接运行时，&lt;a href=&quot;https://docs.python.org/3/library/__main__.html&quot;&gt;&lt;code&gt;__name__&lt;/code&gt;&lt;/a&gt; 为 &lt;code&gt;&apos;__main__&apos;&lt;/code&gt;；被 &lt;code&gt;import&lt;/code&gt; 时为模块名（如 &lt;code&gt;&apos;mymodule&apos;&lt;/code&gt;）。常见写法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def main():
    ...

if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;import mymodule&lt;/code&gt; 不执行 &lt;code&gt;main()&lt;/code&gt;；&lt;code&gt;python mymodule.py&lt;/code&gt; 会执行。也可用 &lt;code&gt;python -m pkg.module&lt;/code&gt;（&lt;a href=&quot;https://docs.python.org/3/library/runpy.html&quot;&gt;&lt;code&gt;-m&lt;/code&gt; 搜索&lt;/a&gt;）。&lt;/p&gt;
&lt;h2&gt;print 与 input&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;print&lt;/code&gt; 可以把对象写到文件：&lt;code&gt;print(x, file=f)&lt;/code&gt;。&lt;code&gt;input(prompt=&apos;&apos;)&lt;/code&gt; 从标准输入读一行，&lt;strong&gt;返回 str&lt;/strong&gt;（去掉末尾换行），数值运算再 &lt;code&gt;int()&lt;/code&gt; / &lt;code&gt;float()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/pprint.html&quot;&gt;&lt;code&gt;pprint&lt;/code&gt;&lt;/a&gt; 用于格式化输出嵌套结构。&lt;a href=&quot;https://docs.python.org/3/library/json.html#json.dumps&quot;&gt;&lt;code&gt;json.dumps&lt;/code&gt;&lt;/a&gt; 用于输出 JSON。字符串格式化见 f-string / &lt;code&gt;str.format&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;open 读写与 with&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#open&quot;&gt;&lt;code&gt;open(file, mode=&apos;r&apos;, encoding=None, ... )&lt;/code&gt;&lt;/a&gt; 返回 &lt;a href=&quot;https://docs.python.org/3/library/io.html&quot;&gt;text 或 binary 流&lt;/a&gt;。文本模式默认编码依平台，通常显式传 &lt;code&gt;encoding=&apos;utf-8&apos;&lt;/code&gt;（&lt;a href=&quot;https://docs.python.org/3/library/functions.html#open&quot;&gt;UTF-8 模式&lt;/a&gt; 在 3.7+ 可通过 &lt;code&gt;-X utf8&lt;/code&gt; 或 &lt;code&gt;PYTHONUTF8&lt;/code&gt; 影响默认行为）。&lt;/p&gt;
&lt;p&gt;常用模式：&lt;code&gt;&apos;r&apos;&lt;/code&gt; 读、&lt;code&gt;&apos;w&apos;&lt;/code&gt; 写（清空）、&lt;code&gt;&apos;a&apos;&lt;/code&gt; 追加、&lt;code&gt;&apos;x&apos;&lt;/code&gt; 独占创建、&lt;code&gt;&apos;r+&apos;&lt;/code&gt; 读写；加 &lt;code&gt;&apos;b&apos;&lt;/code&gt; 为二进制（&lt;code&gt;encoding&lt;/code&gt; 无效）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;with open(&quot;notes.txt&quot;, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f:
    f.write(&quot;第一行\n&quot;)
    f.writelines([&quot;第二行\n&quot;, &quot;第三行\n&quot;])

with open(&quot;notes.txt&quot;, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:
    whole = f.read()       # 整个文件 str
    # 或 for line in f:   # 逐行，省内存
    # 或 lines = f.readlines()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件对象实现上下文管理器，离开 &lt;code&gt;with&lt;/code&gt; 时会调用 &lt;code&gt;close()&lt;/code&gt;。不使用 &lt;code&gt;with&lt;/code&gt; 时需要调用 &lt;code&gt;f.close()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;二进制：&lt;code&gt;with open(&quot;img.bin&quot;, &quot;rb&quot;) as f: data = f.read()&lt;/code&gt;。CSV、JSON 见 &lt;a href=&quot;https://docs.python.org/3/library/csv.html&quot;&gt;&lt;code&gt;csv&lt;/code&gt;&lt;/a&gt;、&lt;a href=&quot;https://docs.python.org/3/library/json.html&quot;&gt;&lt;code&gt;json&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;文本流常用方法见 &lt;a href=&quot;https://docs.python.org/3/library/io.html#io.IOBase&quot;&gt;io.IOBase&lt;/a&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;read&lt;/code&gt; / &lt;code&gt;readline&lt;/code&gt; / &lt;code&gt;readlines&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;write&lt;/code&gt; / &lt;code&gt;writelines&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seek(offset, whence=0)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;移动文件指针；&lt;code&gt;whence&lt;/code&gt; 0 开头、1 当前、2 末尾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tell()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前指针位置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flush()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刷缓冲区&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;close()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;关闭（&lt;code&gt;with&lt;/code&gt; 会自动调）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;&apos;w+&apos;&lt;/code&gt; 写完后若要读回去，须先 &lt;code&gt;seek(0)&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;路径：pathlib 与 os.path&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/pathlib.html&quot;&gt;pathlib&lt;/a&gt;（3.4+）用面向对象路径替代字符串拼接。常用 &lt;a href=&quot;https://docs.python.org/3/library/pathlib.html#pathlib.Path&quot;&gt;&lt;code&gt;Path&lt;/code&gt;&lt;/a&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from pathlib import Path

p = Path(&quot;data&quot;) / &quot;logs&quot; / &quot;app.log&quot;  # 跨平台拼接
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text(&quot;hello\n&quot;, encoding=&quot;utf-8&quot;)
text = p.read_text(encoding=&quot;utf-8&quot;)
print(p.suffix, p.stem, p.resolve())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用：&lt;code&gt;exists()&lt;/code&gt;、&lt;code&gt;is_file()&lt;/code&gt;、&lt;code&gt;is_dir()&lt;/code&gt;、&lt;code&gt;glob()&lt;/code&gt;、&lt;code&gt;iterdir()&lt;/code&gt;、&lt;code&gt;rename()&lt;/code&gt;、&lt;code&gt;unlink()&lt;/code&gt;（删文件）。&lt;a href=&quot;https://docs.python.org/3/library/pathlib.html#pathlib.PurePath&quot;&gt;&lt;code&gt;PurePath&lt;/code&gt;&lt;/a&gt; 不做 I/O，只算路径。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/os.path.html&quot;&gt;&lt;code&gt;os.path&lt;/code&gt;&lt;/a&gt; 提供基于字符串的路径操作：&lt;code&gt;os.path.join&lt;/code&gt;、&lt;code&gt;dirname&lt;/code&gt;、&lt;code&gt;basename&lt;/code&gt;、&lt;code&gt;abspath&lt;/code&gt;、&lt;code&gt;splitext&lt;/code&gt;。可与 pathlib 互转：&lt;code&gt;Path(p)&lt;/code&gt;、&lt;code&gt;str(path)&lt;/code&gt;。获取文件状态可使用 &lt;code&gt;Path.stat()&lt;/code&gt; 或 &lt;a href=&quot;https://docs.python.org/3/library/os.html#os.stat&quot;&gt;&lt;code&gt;os.stat&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;当前工作目录：&lt;a href=&quot;https://docs.python.org/3/library/pathlib.html#pathlib.Path.cwd&quot;&gt;&lt;code&gt;Path.cwd()&lt;/code&gt;&lt;/a&gt;；改变用 &lt;a href=&quot;https://docs.python.org/3/library/os.html#os.chdir&quot;&gt;&lt;code&gt;os.chdir&lt;/code&gt;&lt;/a&gt;（改变进程全局 cwd）。&lt;/p&gt;
&lt;h2&gt;os 常用&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/os.html&quot;&gt;&lt;code&gt;os&lt;/code&gt;&lt;/a&gt; 提供操作系统接口；与路径无关的常见调用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;os.environ&lt;/code&gt;&lt;/strong&gt;：环境变量映射，可读可写；取值也可用 &lt;a href=&quot;https://docs.python.org/3/library/os.html#os.getenv&quot;&gt;&lt;code&gt;os.getenv&lt;/code&gt;&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;os.listdir(path)&lt;/code&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;os.scandir(path)&lt;/code&gt;&lt;/strong&gt;：列目录（后者更高效，可拿类型信息）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;os.mkdir&lt;/code&gt; / &lt;code&gt;os.makedirs&lt;/code&gt;&lt;/strong&gt;：建目录；&lt;code&gt;makedirs(..., exist_ok=True)&lt;/code&gt; 类似 &lt;code&gt;Path.mkdir&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;os.walk(top)&lt;/code&gt;&lt;/strong&gt;：递归遍历目录树（&lt;a href=&quot;https://docs.python.org/3/library/os.html#os.walk&quot;&gt;os.walk&lt;/a&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;os.replace&lt;/code&gt;&lt;/strong&gt;：覆盖式重命名，跨平台比 &lt;code&gt;rename&lt;/code&gt; 稳。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;os.getpid()&lt;/code&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;code&gt;os.cpu_count()&lt;/code&gt;&lt;/strong&gt;：进程 id、CPU 数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/pathlib.html&quot;&gt;&lt;code&gt;pathlib&lt;/code&gt;&lt;/a&gt; 与 &lt;code&gt;os.environ&lt;/code&gt; 常一起使用。子进程见 &lt;a href=&quot;https://docs.python.org/3/library/subprocess.html&quot;&gt;&lt;code&gt;subprocess&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;class&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/classes.html&quot;&gt;Classes&lt;/a&gt;：使用 &lt;code&gt;class&lt;/code&gt; 定义类。实例属性写在 &lt;code&gt;self&lt;/code&gt; 上。方法的第一个参数约定为 &lt;code&gt;self&lt;/code&gt;，调用时自动传入。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Dog:
    kind = &quot;canine&quot;  # 类属性，共享

    def __init__(self, name):
        self.name = name  # 实例属性

    def bark(self):
        return f&quot;{self.name}: woof!&quot;

d = Dog(&quot;Rex&quot;)
print(d.bark(), Dog.kind)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#object.__init__&quot;&gt;&lt;code&gt;__init__&lt;/code&gt;&lt;/a&gt; 在实例创建后初始化，不是分配内存的构造器（那是 &lt;code&gt;__new__&lt;/code&gt;）。&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#object.__repr__&quot;&gt;&lt;code&gt;__repr__&lt;/code&gt;&lt;/a&gt; / &lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#object.__str__&quot;&gt;&lt;code&gt;__str__&lt;/code&gt;&lt;/a&gt; 控制 &lt;code&gt;repr(obj)&lt;/code&gt; 与 &lt;code&gt;str(obj)&lt;/code&gt; / &lt;code&gt;print(obj)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;继承&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Animal:
    def __init__(self, name):
        self.name = name

class Cat(Animal):
    def __init__(self, name, indoor=True):
        super().__init__(name)  # 调父类 __init__
        self.indoor = indoor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#super&quot;&gt;&lt;code&gt;super()&lt;/code&gt;&lt;/a&gt; 在单继承里找父类实现；多继承按 &lt;a href=&quot;https://docs.python.org/3/tutorial/classes.html#multiple-inheritance&quot;&gt;MRO&lt;/a&gt;（方法解析顺序）线性化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据 vs 方法&lt;/strong&gt;：Python 不强制访问控制。约定 &lt;code&gt;_name&lt;/code&gt; 表示内部使用；&lt;a href=&quot;https://docs.python.org/3/tutorial/classes.html#private-variables&quot;&gt;&lt;code&gt;__name&lt;/code&gt;&lt;/a&gt; 触发名称改写（name mangling），改写后仍可通过 &lt;code&gt;_类名__属性&lt;/code&gt; 访问。&lt;a href=&quot;https://docs.python.org/3/library/functions.html#property&quot;&gt;&lt;code&gt;@property&lt;/code&gt;&lt;/a&gt; 把方法当属性读；&lt;a href=&quot;https://docs.python.org/3/library/functions.html#classmethod&quot;&gt;&lt;code&gt;@classmethod&lt;/code&gt;&lt;/a&gt; / &lt;a href=&quot;https://docs.python.org/3/library/functions.html#staticmethod&quot;&gt;&lt;code&gt;@staticmethod&lt;/code&gt;&lt;/a&gt; 见 &lt;a href=&quot;https://docs.python.org/3/tutorial/classes.html#class-and-instance-variables&quot;&gt;Class and Instance Variables&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;类本身也是对象，可传参、可放入容器，见 &lt;a href=&quot;https://docs.python.org/3/tutorial/classes.html#a-word-about-names-and-objects&quot;&gt;Odds and Ends&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;类型注解&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0484/&quot;&gt;PEP 484&lt;/a&gt; 函数注解、&lt;a href=&quot;https://peps.python.org/pep-0526/&quot;&gt;PEP 526&lt;/a&gt; 变量注解、&lt;a href=&quot;https://peps.python.org/pep-0585/&quot;&gt;PEP 585&lt;/a&gt; 内置泛型 &lt;code&gt;list[int]&lt;/code&gt;、&lt;a href=&quot;https://peps.python.org/pep-0604/&quot;&gt;PEP 604&lt;/a&gt; 的 &lt;code&gt;X | Y&lt;/code&gt;（3.10+）。运行时默认不强制检查；静态检查可用 &lt;a href=&quot;https://mypy.readthedocs.io/&quot;&gt;mypy&lt;/a&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def greet(name: str, times: int = 1) -&amp;gt; str:
    return (name + &quot;! &quot;) * times

def sum_all(nums: list[float]) -&amp;gt; float:
    return sum(nums)

from typing import Optional

def find(items: list[str], key: str) -&amp;gt; Optional[str]:
    return key if key in items else None
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用 &lt;a href=&quot;https://docs.python.org/3/library/typing.html&quot;&gt;&lt;code&gt;typing&lt;/code&gt;&lt;/a&gt; 名字：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Optional[T]&lt;/code&gt;&lt;/strong&gt; — 等价于 &lt;code&gt;T | None&lt;/code&gt;（3.10+ 也可写 &lt;a href=&quot;https://docs.python.org/3/library/typing.html#typing.Union&quot;&gt;&lt;code&gt;Union&lt;/code&gt;&lt;/a&gt; 或 &lt;code&gt;|&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Union[A, B]&lt;/code&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;A | B&lt;/code&gt;&lt;/strong&gt; — 多种类型之一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;list[int]&lt;/code&gt;、&lt;code&gt;dict[str, int]&lt;/code&gt;&lt;/strong&gt; — 泛型容器（3.9+ 内置泛型；旧代码见 &lt;code&gt;List&lt;/code&gt;、&lt;code&gt;Dict&lt;/code&gt; from typing）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Callable[[int, str], bool]&lt;/code&gt;&lt;/strong&gt; — 可调用签名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Iterable[T]&lt;/code&gt;、&lt;code&gt;Sequence[T]&lt;/code&gt;&lt;/strong&gt; — 只读迭代 / 序列抽象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;TypedDict&lt;/code&gt;、&lt;code&gt;Protocol&lt;/code&gt;、&lt;code&gt;NamedTuple&lt;/code&gt;&lt;/strong&gt; — 结构化数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;变量也可注解：&lt;code&gt;count: int = 0&lt;/code&gt;。类属性：&lt;code&gt;class User: id: int; name: str&lt;/code&gt;。延迟解析字符串注解：&lt;a href=&quot;https://docs.python.org/3/__future__.html&quot;&gt;&lt;code&gt;from __future__ import annotations&lt;/code&gt;&lt;/a&gt;（3.7+；3.11+ 部分行为默认变化见 &lt;a href=&quot;https://docs.python.org/3/whatsnew/3.11.html&quot;&gt;What&apos;s New&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/typing.html#typing.get_type_hints&quot;&gt;&lt;code&gt;typing.get_type_hints()&lt;/code&gt;&lt;/a&gt; 可在运行时取注解。&lt;/p&gt;
&lt;h2&gt;venv：虚拟环境&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/venv.html&quot;&gt;&lt;code&gt;venv&lt;/code&gt;&lt;/a&gt; 创建轻量隔离环境，各自拥有 &lt;code&gt;python&lt;/code&gt; 与 &lt;code&gt;pip&lt;/code&gt;（或 &lt;a href=&quot;https://docs.python.org/3/library/ensurepip.html&quot;&gt;&lt;code&gt;ensurepip&lt;/code&gt;&lt;/a&gt; 引导），包安装不污染系统 Python。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -m venv .venv
# Windows PowerShell:
.\.venv\Scripts\Activate.ps1
# Unix / macOS:
source .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;激活后 &lt;code&gt;which python&lt;/code&gt; / &lt;code&gt;where python&lt;/code&gt; 应指向 &lt;code&gt;.venv&lt;/code&gt;。安装依赖：&lt;code&gt;python -m pip install requests&lt;/code&gt;。冻结清单：&lt;code&gt;python -m pip freeze &amp;gt; requirements.txt&lt;/code&gt;，再 &lt;code&gt;python -m pip install -r requirements.txt&lt;/code&gt;。退出：&lt;code&gt;deactivate&lt;/code&gt;。指定解释器版本：&lt;code&gt;python3.12 -m venv .venv&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;项目根常见 &lt;code&gt;.venv/&lt;/code&gt; 加入 &lt;code&gt;.gitignore&lt;/code&gt;；依赖列表用 &lt;code&gt;requirements.txt&lt;/code&gt; 或 &lt;code&gt;pyproject.toml&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://virtualenv.pypa.io/&quot;&gt;&lt;code&gt;virtualenv&lt;/code&gt;&lt;/a&gt; 是第三方替代；&lt;a href=&quot;https://docs.conda.io/&quot;&gt;&lt;code&gt;conda&lt;/code&gt;&lt;/a&gt; 是另一套生态。教程：&lt;a href=&quot;https://docs.python.org/3/tutorial/venv.html&quot;&gt;Virtual Environments and Packages&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;标准库地图&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/stdlib.html&quot;&gt;Brief Tour of the Standard Library&lt;/a&gt; 与 &lt;a href=&quot;https://docs.python.org/3/library/index.html&quot;&gt;stdlib index&lt;/a&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;strong&gt;os&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;操作系统接口：环境变量、进程 id、目录项、部分路径与权限原语。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;解释器相关：&lt;code&gt;argv&lt;/code&gt;、&lt;code&gt;path&lt;/code&gt;、&lt;code&gt;stdin/stdout/stderr&lt;/code&gt;、版本与退出。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;json&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON 与 Python 对象互转（&lt;code&gt;dumps&lt;/code&gt; / &lt;code&gt;loads&lt;/code&gt; / &lt;code&gt;dump&lt;/code&gt; / &lt;code&gt;load&lt;/code&gt;），非 Python 专有类型需默认处理。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;datetime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;日期与时间：&lt;code&gt;date&lt;/code&gt;、&lt;code&gt;time&lt;/code&gt;、&lt;code&gt;datetime&lt;/code&gt;、&lt;code&gt;timedelta&lt;/code&gt;，时区见 &lt;a href=&quot;https://docs.python.org/3/library/zoneinfo.html&quot;&gt;&lt;code&gt;zoneinfo&lt;/code&gt;&lt;/a&gt;（3.9+）。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pathlib&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;面向对象的文件系统路径与常见 I/O 快捷方法。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;collections&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;专用容器：&lt;code&gt;Counter&lt;/code&gt;、&lt;code&gt;deque&lt;/code&gt;、&lt;code&gt;defaultdict&lt;/code&gt;、&lt;code&gt;namedtuple&lt;/code&gt; 等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;itertools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;迭代器代数：无穷序列、组合、链式、分组（惰性、省内存）。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;functools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;高阶函数：&lt;code&gt;partial&lt;/code&gt;、&lt;code&gt;reduce&lt;/code&gt;、&lt;code&gt;lru_cache&lt;/code&gt;、&lt;code&gt;wraps&lt;/code&gt;（装饰器元数据）。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;shutil&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;高层文件操作：&lt;code&gt;copyfile&lt;/code&gt;、&lt;code&gt;move&lt;/code&gt;、&lt;code&gt;rmtree&lt;/code&gt;。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;glob&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;glob.glob(&apos;*.py&apos;)&lt;/code&gt; 按通配符列文件。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;argparse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;命令行参数解析。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;还常会用到：&lt;code&gt;re&lt;/code&gt;、&lt;code&gt;urllib&lt;/code&gt; / &lt;code&gt;http&lt;/code&gt;、&lt;code&gt;sqlite3&lt;/code&gt;、&lt;code&gt;logging&lt;/code&gt;、&lt;code&gt;unittest&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：import 形式速查&lt;/h2&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;import mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;绑定 &lt;code&gt;mod&lt;/code&gt; 模块对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;import mod as m&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;绑定别名 &lt;code&gt;m&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;from mod import a, b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;把 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt; 放入当前命名空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;from mod import a as x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;别名导入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;from mod import *&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;导入 &lt;code&gt;__all__&lt;/code&gt; 或公开名字（不推荐）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;from pkg.sub import obj&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;导入子模块或子模块中的名字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;from . import sibling&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;包内相对导入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;importlib.import_module(&apos;mod&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;动态导入（&lt;a href=&quot;https://docs.python.org/3/library/importlib.html&quot;&gt;&lt;code&gt;importlib&lt;/code&gt;&lt;/a&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：open 模式与 pathlib 对照&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;需求&lt;/th&gt;
&lt;th&gt;open&lt;/th&gt;
&lt;th&gt;pathlib（3.11+ 部分 API 更早）&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;code&gt;open(p, encoding=&apos;utf-8&apos;).read()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Path(p).read_text(encoding=&apos;utf-8&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写文本&lt;/td&gt;
&lt;td&gt;&lt;code&gt;open(p, &apos;w&apos;, encoding=&apos;utf-8&apos;).write(s)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Path(p).write_text(s, encoding=&apos;utf-8&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;读字节&lt;/td&gt;
&lt;td&gt;&lt;code&gt;open(p, &apos;rb&apos;).read()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Path(p).read_bytes()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拼接路径&lt;/td&gt;
&lt;td&gt;&lt;code&gt;os.path.join(a, b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Path(a) / b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;是否存在&lt;/td&gt;
&lt;td&gt;&lt;code&gt;os.path.exists(p)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Path(p).exists()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;列目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;os.listdir(d)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Path(d).iterdir()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：typing 常用符号（3.10+ 风格）&lt;/h2&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;x: int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;变量为 int&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def f() -&amp;gt; None&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;无返回值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list[str]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dict[str, int]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;键 str、值 int&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tuple[int, ...]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;整数可变长元组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;str | None&lt;/code&gt; / &lt;code&gt;Optional[str]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可为 None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;int | str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;联合类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Callable[[int], str]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;接受 int 返回 str 的可调用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Literal[&quot;r&quot;, &quot;w&quot;]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只能是列出的字面量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TypeVar(&apos;T&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;泛型类型变量&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;运行时默认不按注解校验对象。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/modules.html&quot;&gt;Modules&lt;/a&gt; — import、模块搜索路径、包、&lt;code&gt;__init__.py&lt;/code&gt;、&lt;code&gt;__name__&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/inputoutput.html&quot;&gt;Input and Output&lt;/a&gt; — &lt;code&gt;print&lt;/code&gt;、&lt;code&gt;input&lt;/code&gt;、格式化、f-string、读写文件 intro&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/classes.html&quot;&gt;Classes&lt;/a&gt; — 属性、方法、继承、&lt;code&gt;super&lt;/code&gt;、私有约定&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/venv.html&quot;&gt;Virtual Environments and Packages&lt;/a&gt; — venv 与 pip 工作流&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/stdlib.html&quot;&gt;Brief Tour of the Standard Library&lt;/a&gt; — 标准库导览&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/import.html&quot;&gt;The import system&lt;/a&gt; — 导入语义、相对导入、namespace package&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/pathlib.html&quot;&gt;pathlib&lt;/a&gt; — &lt;code&gt;Path&lt;/code&gt; / &lt;code&gt;PurePath&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/os.html&quot;&gt;os&lt;/a&gt; — 操作系统接口&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/os.path.html&quot;&gt;os.path&lt;/a&gt; — 路径字符串函数&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#open&quot;&gt;open()&lt;/a&gt; — 文件打开&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/io.html&quot;&gt;io&lt;/a&gt; — 流基类&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/typing.html&quot;&gt;typing&lt;/a&gt; — 类型注解构造&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/venv.html&quot;&gt;venv&lt;/a&gt; — 创建虚拟环境&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/json.html&quot;&gt;json&lt;/a&gt; — JSON&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/datetime.html&quot;&gt;datetime&lt;/a&gt; — 日期时间&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/collections.html&quot;&gt;collections&lt;/a&gt; — 容器&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/itertools.html&quot;&gt;itertools&lt;/a&gt; — 迭代工具&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/functools.html&quot;&gt;functools&lt;/a&gt; — 高阶函数工具&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/sys.html&quot;&gt;sys&lt;/a&gt; — 解释器&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/__main__.html&quot;&gt;&lt;strong&gt;main&lt;/strong&gt;&lt;/a&gt; — 主模块&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PEP：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0484/&quot;&gt;PEP 484 — Type Hints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0526/&quot;&gt;PEP 526 — Syntax for Variable Annotations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0585/&quot;&gt;PEP 585 — Type Hinting Generics In Standard Collections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0604/&quot;&gt;PEP 604 — Allow writing union types as X | Y&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0420/&quot;&gt;PEP 420 — Implicit Namespace Packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0008/&quot;&gt;PEP 8 — Style Guide&lt;/a&gt; — import 顺序等&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-module.html&quot;&gt;菜鸟教程 · Python3 模块&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-inputoutput.html&quot;&gt;菜鸟教程 · Python3 输入和输出&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-file-methods.html&quot;&gt;菜鸟教程 · Python3 文件方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-os-file-methods.html&quot;&gt;菜鸟教程 · OS 文件/目录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-class.html&quot;&gt;菜鸟教程 · Python3 面向对象&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python/python-venv.html&quot;&gt;菜鸟教程 · 虚拟环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python-type-hints.html&quot;&gt;菜鸟教程 · 类型注解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-stdlib.html&quot;&gt;菜鸟教程 · 标准库概览&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>MySQL学习笔记 (7)</title><link>https://blog.chuwu.top/posts/sql/mysql7/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql7/</guid><description>JOIN、UNION、子查询、EXISTS</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/join.html&quot;&gt;JOIN&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;JOIN&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;JOIN&lt;/code&gt; 用于把两个或多个表的行结合起来。&lt;/p&gt;
&lt;p&gt;最常见的是 &lt;code&gt;INNER JOIN&lt;/code&gt;：只返回两个表中匹配的行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT e.last_name, d.dept_name
FROM   employee AS e
INNER  JOIN department AS d
       ON e.dept_no = d.dept_no;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;连接条件写在 &lt;code&gt;ON&lt;/code&gt; 后面。两表列名相同时，也可以用 &lt;code&gt;USING (dept_no)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;列名冲突时要写成 &lt;code&gt;表名.列名&lt;/code&gt; 或 &lt;code&gt;别名.列名&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;LEFT JOIN / RIGHT JOIN&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;LEFT JOIN&lt;/code&gt; 返回左表的全部行。右表没有匹配时，右表的列是 NULL。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT e.last_name, d.dept_name
FROM   employee AS e
LEFT   JOIN department AS d
       ON e.dept_no = d.dept_no;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;RIGHT JOIN&lt;/code&gt; 返回右表的全部行。左表没有匹配时，左表的列是 NULL。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;OUTER&lt;/code&gt; 可以省略：&lt;code&gt;LEFT OUTER JOIN&lt;/code&gt; 和 &lt;code&gt;LEFT JOIN&lt;/code&gt; 相同。&lt;/p&gt;
&lt;h2&gt;CROSS JOIN&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CROSS JOIN&lt;/code&gt; 返回两个表的笛卡尔积，也就是每行与另一表的每一行组合。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT *
FROM employee
CROSS JOIN department;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CROSS JOIN&lt;/code&gt; 不写 &lt;code&gt;ON&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;UNION&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;UNION&lt;/code&gt; 用于合并两个 &lt;code&gt;SELECT&lt;/code&gt; 的结果。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT dept_no FROM employee
UNION
SELECT dept_no FROM department;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UNION&lt;/code&gt;：去掉重复行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNION ALL&lt;/code&gt;：保留重复行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两边选出的列数要相同。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ORDER BY&lt;/code&gt; 写在整个 &lt;code&gt;UNION&lt;/code&gt; 的最后。&lt;/p&gt;
&lt;p&gt;还可以用 &lt;code&gt;INTERSECT&lt;/code&gt;（交集）和 &lt;code&gt;EXCEPT&lt;/code&gt;（差集）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT dept_no FROM employee
INTERSECT
SELECT dept_no FROM department;

SELECT dept_no FROM employee
EXCEPT
SELECT dept_no FROM department;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;子查询&lt;/h2&gt;
&lt;p&gt;子查询是嵌套在另一条语句里的查询。&lt;/p&gt;
&lt;p&gt;下面找出工资高于平均工资的员工：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name
FROM   employee
WHERE  salary &amp;gt; (SELECT AVG(salary) FROM employee);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;EXISTS&lt;/code&gt; 判断子查询是否返回了行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name
FROM   employee AS e
WHERE  EXISTS (
    SELECT *
    FROM   department AS d
    WHERE  d.dept_no = e.dept_no
    AND    d.director = &apos;院长&apos;
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;FROM&lt;/code&gt; 后面的子查询必须起别名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT dept_no, n
FROM (
    SELECT dept_no, COUNT(*) AS n
    FROM   employee
    GROUP  BY dept_no
) AS t
WHERE n &amp;gt;= 2;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/join.html&quot;&gt;MySQL 26.7 · JOIN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/set-operations.html&quot;&gt;MySQL 26.7 · Set Operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/subqueries.html&quot;&gt;MySQL 26.7 · Subqueries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/exists-and-not-exists-subqueries.html&quot;&gt;MySQL 26.7 · EXISTS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (7)</title><link>https://blog.chuwu.top/posts/python/python7/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python7/</guid><description>函数、参数、作用域、异常、with、迭代器与生成器、装饰器</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;定义函数 def&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;def greet(name):
    &quot;&quot;&quot;向 name 问好。&quot;&quot;&quot;
    return f&quot;Hello, {name}!&quot;

print(greet(&quot;Alice&quot;))
print(greet.__name__)  # greet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#function-definitions&quot;&gt;&lt;code&gt;def&lt;/code&gt;&lt;/a&gt; 用于定义函数。函数体在调用时执行。函数可以作为变量、参数和返回值。&lt;/p&gt;
&lt;p&gt;函数可以 &lt;code&gt;return&lt;/code&gt; 多个值（实际返回一个元组），也可以没有 &lt;code&gt;return&lt;/code&gt;（等价于 &lt;code&gt;return None&lt;/code&gt;）。&lt;a href=&quot;https://docs.python.org/3/tutorial/controlflow.html#defining-functions&quot;&gt;Defining Functions&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;参数&lt;/h2&gt;
&lt;p&gt;位置参数按定义顺序传入，也可以按名字传：&lt;code&gt;greet(name=&quot;Alice&quot;)&lt;/code&gt;。带默认值的可以省略（&lt;a href=&quot;https://docs.python.org/3/tutorial/controlflow.html#defining-functions&quot;&gt;Defining Functions&lt;/a&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def greet(name, greeting=&quot;Hello&quot;):
    return f&quot;{greeting}, {name}!&quot;

print(greet(&quot;Alice&quot;))
print(greet(&quot;Bob&quot;, greeting=&quot;Hi&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认值在&lt;strong&gt;定义时&lt;/strong&gt;只求值一次。默认值不要使用可变对象（&lt;code&gt;[]&lt;/code&gt;、&lt;code&gt;{}&lt;/code&gt;），多次调用会共享同一个对象：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def good(a, items=None):
    if items is None:
        items = []
    items.append(a)
    return items
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;*args&lt;/code&gt; 收集多余的位置参数为元组，&lt;code&gt;**kwargs&lt;/code&gt; 收集多余的关键字参数为字典：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def demo(a, *args, **kwargs):
    print(a, args, kwargs)

demo(1, 2, 3, x=4)  # 1 (2, 3) {&apos;x&apos;: 4}
print(*(1, 2, 3))   # 等同于 print(1, 2, 3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/&lt;/code&gt; 之前的参数只能按位置传入（3.8+），&lt;code&gt;*&lt;/code&gt; 之后的只能按关键字传入，例如 &lt;code&gt;def f(pos, /, both, *, kwonly)&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;return&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#return&quot;&gt;&lt;code&gt;return&lt;/code&gt;&lt;/a&gt; 结束当前函数调用，并返回表达式的值。没有表达式时返回 &lt;code&gt;None&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def find_first(pred, items):
    for x in items:
        if pred(x):
            return x
    return None
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;lambda&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#lambda&quot;&gt;&lt;code&gt;lambda&lt;/code&gt;&lt;/a&gt; 创建匿名函数，语法为 &lt;code&gt;lambda 参数: 表达式&lt;/code&gt;。函数体只能是一个表达式。较复杂的逻辑使用 &lt;code&gt;def&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pairs = [(2, &quot;b&quot;), (1, &quot;a&quot;), (3, &quot;c&quot;)]
pairs.sort(key=lambda p: p[0])
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;命名空间与作用域&lt;/h2&gt;
&lt;p&gt;变量按 &lt;strong&gt;LEGB&lt;/strong&gt; 顺序查找：&lt;strong&gt;L&lt;/strong&gt;ocal（当前函数）、&lt;strong&gt;E&lt;/strong&gt;nclosing（外层函数）、&lt;strong&gt;G&lt;/strong&gt;lobal（模块全局）、&lt;strong&gt;B&lt;/strong&gt;uilt-in（内置名，如 &lt;code&gt;len&lt;/code&gt;）。&lt;a href=&quot;https://docs.python.org/3/reference/executionmodel.html#naming-and-binding&quot;&gt;命名与绑定&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x = &quot;global&quot;

def outer():
    x = &quot;enclosing&quot;

    def inner():
        x = &quot;local&quot;
        print(x)  # local

    inner()
    print(x)  # enclosing

outer()
print(x)  # global
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数定义时会捕获外层作用域（闭包）。内层函数可以读取外层变量；若要给外层非全局变量赋值，使用 &lt;code&gt;nonlocal&lt;/code&gt;；给模块级变量赋值使用 &lt;code&gt;global&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt; / &lt;code&gt;for&lt;/code&gt; / &lt;code&gt;while&lt;/code&gt; / &lt;code&gt;try&lt;/code&gt; 不会像函数那样创建局部作用域，块中赋值的变量在块外仍可使用。&lt;a href=&quot;https://docs.python.org/3/reference/executionmodel.html#naming-and-binding&quot;&gt;Naming and binding&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;内置名在 &lt;code&gt;builtins&lt;/code&gt; 模块：&lt;code&gt;import builtins; dir(builtins)&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;global 与 nonlocal&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#the-global-statement&quot;&gt;&lt;code&gt;global&lt;/code&gt;&lt;/a&gt; 把本函数里的名字标成&lt;strong&gt;模块全局&lt;/strong&gt;。&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement&quot;&gt;&lt;code&gt;nonlocal&lt;/code&gt;&lt;/a&gt; 标成&lt;strong&gt;最近一层外层函数&lt;/strong&gt;里的名字（不能是全局）。&lt;/p&gt;
&lt;p&gt;函数体内只要出现对某名字的赋值，整个函数都把它当局部。因此下面会 &lt;code&gt;UnboundLocalError&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x = 1

def f():
    print(x)  # 想读全局 x
    x = 2     # 这一行让 x 在整个 f 里都是局部
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要改全局就写 &lt;code&gt;global x&lt;/code&gt;，或不要在函数里给同名赋值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;count = 0

def inc_global():
    global count
    count += 1

def make_counter():
    n = 0

    def inc():
        nonlocal n
        n += 1
        return n

    return inc

c = make_counter()
print(c(), c())  # 1, 2
inc_global()
print(count)     # 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;global&lt;/code&gt; 会让数据流难追踪；状态用参数、返回值或类封装。&lt;/p&gt;
&lt;h2&gt;try / except / else / finally&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#the-try-statement&quot;&gt;The try statement&lt;/a&gt; 与 &lt;a href=&quot;https://docs.python.org/3/tutorial/errors.html&quot;&gt;Errors and Exceptions&lt;/a&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try:
    risky()
except ValueError as e:
    handle(e)
except (TypeError, OSError):
    recover()
else:
    # 仅当 try 块未抛出异常时执行
    on_success()
finally:
    # 总是执行（除非进程被杀死等）
    cleanup()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;except&lt;/code&gt;&lt;/strong&gt;：匹配异常类型（元组表示多个）。&lt;code&gt;as e&lt;/code&gt; 绑定异常实例；在 Python 3 里，&lt;code&gt;except&lt;/code&gt; 块结束后 &lt;code&gt;e&lt;/code&gt; 会被删除，避免循环引用（&lt;a href=&quot;https://peps.python.org/pep-3110/&quot;&gt;PEP 3110&lt;/a&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;else&lt;/code&gt;&lt;/strong&gt;：没有异常时运行，常把可能抛错的逻辑放在 &lt;code&gt;try&lt;/code&gt;、成功路径放在 &lt;code&gt;else&lt;/code&gt;，避免把 &lt;code&gt;else&lt;/code&gt; 里的错误当成 &lt;code&gt;except&lt;/code&gt; 能处理的同一类问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;finally&lt;/code&gt;&lt;/strong&gt;：用于释放资源；若有 &lt;code&gt;return&lt;/code&gt;，&lt;code&gt;finally&lt;/code&gt; 仍会在返回前执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;顺序&lt;/strong&gt;：&lt;code&gt;try&lt;/code&gt; → 若异常则匹配的 &lt;code&gt;except&lt;/code&gt; → 无异常则 &lt;code&gt;else&lt;/code&gt; → 始终 &lt;code&gt;finally&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#raise&quot;&gt;&lt;code&gt;raise&lt;/code&gt;&lt;/a&gt; 抛出异常：&lt;code&gt;raise ValueError(&quot;msg&quot;)&lt;/code&gt;；&lt;code&gt;raise&lt;/code&gt; 单独使用则重新抛出当前异常（常在 &lt;code&gt;except&lt;/code&gt; 里记录后再抛）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def parse_int(s):
    try:
        return int(s)
    except ValueError:
        raise ValueError(f&quot;不是整数: {s!r}&quot;) from None  # 抑制异常链
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/errors.html#exception-chaining&quot;&gt;&lt;code&gt;Exception chaining&lt;/code&gt;&lt;/a&gt;：内层 &lt;code&gt;raise ... from e&lt;/code&gt; 保留原因；&lt;code&gt;from None&lt;/code&gt; 隐藏上下文。&lt;/p&gt;
&lt;p&gt;用户自定义异常：继承 &lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#Exception&quot;&gt;&lt;code&gt;Exception&lt;/code&gt;&lt;/a&gt;（不要直接继承 &lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#BaseException&quot;&gt;&lt;code&gt;BaseException&lt;/code&gt;&lt;/a&gt;，除非做系统退出类异常）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class MyAppError(Exception):
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#assert&quot;&gt;&lt;code&gt;assert&lt;/code&gt;&lt;/a&gt; 用于断言。使用 &lt;code&gt;-O&lt;/code&gt; 优化时会被忽略，不适合作为常规错误处理。&lt;/p&gt;
&lt;h2&gt;内置异常&lt;/h2&gt;
&lt;p&gt;下列名字来自 &lt;a href=&quot;https://docs.python.org/3/library/exceptions.html&quot;&gt;Built-in Exceptions&lt;/a&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;Exception&lt;/code&gt;&lt;/td&gt;
&lt;td&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;迭代器没有更多元素（&lt;code&gt;next&lt;/code&gt; / &lt;code&gt;for&lt;/code&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;异步迭代器结束&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ArithmeticError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;算术错误分支的基类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FloatingPointError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浮点运算失败（极少见，依赖平台）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OverflowError&lt;/code&gt;&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;除法或取模除零&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;&lt;code&gt;assert&lt;/code&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;属性不存在或无法设置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EOFError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;input()&lt;/code&gt; 在无数据可读时（如 Ctrl+D）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ImportError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;import&lt;/code&gt; 失败&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ModuleNotFoundError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;找不到模块（&lt;code&gt;ImportError&lt;/code&gt; 子类）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LookupError&lt;/code&gt;&lt;/td&gt;
&lt;td&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;序列下标越界&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;字典键不存在&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MemoryError&lt;/code&gt;&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;未定义的名字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UnboundLocalError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;局部名字在赋值前被引用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OSError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;系统 / I/O 相关（&lt;code&gt;IOError&lt;/code&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;文件不存在&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PermissionError&lt;/code&gt;&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;超过最大递归深度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ReferenceError&lt;/code&gt;&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;一般不落在更具体类型时的运行时错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NotImplementedError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抽象方法 / 待实现&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SyntaxError&lt;/code&gt;&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;缩进错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TabError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tab 与空格混用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SystemError&lt;/code&gt;&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;类型不对或参数个数不对&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;类型对但值不合法（如 &lt;code&gt;int(&quot;abc&quot;)&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UnicodeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unicode 编解码相关基类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UnicodeDecodeError&lt;/code&gt; / &lt;code&gt;UnicodeEncodeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;解码 / 编码失败&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Warning&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;警告类别基类（不是 &lt;code&gt;Exception&lt;/code&gt; 同级习惯捕获对象）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一般不捕获 &lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#BaseException&quot;&gt;&lt;code&gt;BaseException&lt;/code&gt;&lt;/a&gt; 下的 &lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#KeyboardInterrupt&quot;&gt;&lt;code&gt;KeyboardInterrupt&lt;/code&gt;&lt;/a&gt;、&lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#SystemExit&quot;&gt;&lt;code&gt;SystemExit&lt;/code&gt;&lt;/a&gt;、&lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#GeneratorExit&quot;&gt;&lt;code&gt;GeneratorExit&lt;/code&gt;&lt;/a&gt;，除非在做框架级顶层处理。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;with 与上下文管理器&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#the-with-statement&quot;&gt;&lt;code&gt;with&lt;/code&gt;&lt;/a&gt; 语句用于管理资源：进入时 setup，离开时 teardown，即使发生异常也会清理。&lt;a href=&quot;https://peps.python.org/pep-0343/&quot;&gt;PEP 343&lt;/a&gt; 定义协议。&lt;/p&gt;
&lt;p&gt;上下文管理器需实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#object.__enter__&quot;&gt;&lt;code&gt;__enter__(self)&lt;/code&gt;&lt;/a&gt;：进入 &lt;code&gt;with&lt;/code&gt; 块前调用；返回值绑定到 &lt;code&gt;as&lt;/code&gt; 后的变量（若无 &lt;code&gt;as&lt;/code&gt; 则忽略返回值）。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#object.__exit__&quot;&gt;&lt;code&gt;__exit__(self, exc_type, exc_val, exc_tb)&lt;/code&gt;&lt;/a&gt;：离开 &lt;code&gt;with&lt;/code&gt; 块时调用。若返回真值，会&lt;strong&gt;抑制&lt;/strong&gt;当前异常（一般不这么做）；否则异常继续传播。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;class Tag:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print(f&quot;&amp;lt;{self.name}&amp;gt;&quot;)
        return self

    def __exit__(self, exc_type, exc, tb):
        print(f&quot;&amp;lt;/{self.name}&amp;gt;&quot;)
        return False

with Tag(&quot;p&quot;) as t:
    print(&quot;body&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内置 &lt;a href=&quot;https://docs.python.org/3/library/functions.html#open&quot;&gt;&lt;code&gt;open()&lt;/code&gt;&lt;/a&gt; 返回的文件对象、&lt;a href=&quot;https://docs.python.org/3/library/threading.html#threading.Lock&quot;&gt;&lt;code&gt;threading.Lock&lt;/code&gt;&lt;/a&gt; 等已实现该协议。自定义资源管理可用 &lt;a href=&quot;https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager&quot;&gt;&lt;code&gt;contextlib.contextmanager&lt;/code&gt;&lt;/a&gt; 装饰生成器，或用 &lt;a href=&quot;https://docs.python.org/3/library/contextlib.html#contextlib.AbstractContextManager&quot;&gt;&lt;code&gt;contextlib.AbstractContextManager&lt;/code&gt;&lt;/a&gt;。多个上下文管理器可写 &lt;code&gt;with A() as a, B() as b:&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;iter 与 next&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/glossary.html#term-iterator&quot;&gt;迭代器&lt;/a&gt;实现迭代器协议：&lt;code&gt;__iter__()&lt;/code&gt; 返回自身（或另一迭代器），该对象再提供 &lt;code&gt;__next__()&lt;/code&gt;。内置 &lt;a href=&quot;https://docs.python.org/3/library/functions.html#iter&quot;&gt;&lt;code&gt;iter()&lt;/code&gt;&lt;/a&gt; 优先调用 &lt;code&gt;__iter__()&lt;/code&gt;；若没有 &lt;code&gt;__iter__&lt;/code&gt; 但实现了从 0 开始的 &lt;code&gt;__getitem__&lt;/code&gt;，仍可按序列方式迭代（见 &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#iterator-types&quot;&gt;iterator protocol&lt;/a&gt;）。自定义可迭代对象时，实现 &lt;code&gt;__iter__&lt;/code&gt; 即可。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#next&quot;&gt;&lt;code&gt;next(iterator[, default])&lt;/code&gt;&lt;/a&gt; 调用 &lt;code&gt;iterator.__next__()&lt;/code&gt;。没有更多元素时，&lt;code&gt;__next__()&lt;/code&gt; 抛出 &lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#StopIteration&quot;&gt;&lt;code&gt;StopIteration&lt;/code&gt;&lt;/a&gt;；若提供了 &lt;code&gt;default&lt;/code&gt;，则返回 &lt;code&gt;default&lt;/code&gt; 而不抛异常。&lt;/p&gt;
&lt;p&gt;容器（如 &lt;code&gt;list&lt;/code&gt;）本身通常不是迭代器，但可迭代（&lt;a href=&quot;https://docs.python.org/3/glossary.html#term-iterable&quot;&gt;iterable&lt;/a&gt;）：&lt;code&gt;__iter__()&lt;/code&gt; 返回一个新的迭代器。每次 &lt;code&gt;for x in lst:&lt;/code&gt; 都会先 &lt;code&gt;iter(lst)&lt;/code&gt; 再反复 &lt;code&gt;next&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it = iter([10, 20, 30])
print(next(it))  # 10
print(next(it))  # 20
print(next(it, &quot;没了&quot;))  # 30
print(next(it, &quot;没了&quot;))  # 没了
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt; 循环在底层等价于：取迭代器 → 反复 &lt;code&gt;next&lt;/code&gt; → 捕获 &lt;code&gt;StopIteration&lt;/code&gt; 结束。实现 &lt;code&gt;__iter__&lt;/code&gt; 与 &lt;code&gt;__next__&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class CountDown:
    def __init__(self, n):
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        if self.n &amp;lt;= 0:
            raise StopIteration
        self.n -= 1
        return self.n + 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;生成器与 yield&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/glossary.html#term-generator&quot;&gt;生成器&lt;/a&gt;是一种迭代器，由含 &lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#yield&quot;&gt;&lt;code&gt;yield&lt;/code&gt;&lt;/a&gt; 的函数或 &lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#yield-from&quot;&gt;&lt;code&gt;yield from&lt;/code&gt;&lt;/a&gt; 表达式产生。调用生成器函数不会立刻执行函数体，而是返回一个生成器对象；每次 &lt;code&gt;next()&lt;/code&gt; 或 &lt;code&gt;for&lt;/code&gt; 循环驱动执行到下一个 &lt;code&gt;yield&lt;/code&gt;，产出值并暂停。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def count_up_to(n):
    i = 1
    while i &amp;lt;= n:
        yield i
        i += 1

for x in count_up_to(3):
    print(x)  # 1, 2, 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成器表达式 &lt;code&gt;(x * x for x in range(5))&lt;/code&gt; 语法类似列表推导，但结果是生成器而非列表，适合大数据或流水线。&lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#generator-expressions&quot;&gt;Generator expressions&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;yield from iterable&lt;/code&gt; 把产出委托给另一个可迭代对象，常用于扁平化嵌套生成器。要用 &lt;code&gt;with&lt;/code&gt; 包一层生成器，需 &lt;a href=&quot;https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager&quot;&gt;&lt;code&gt;contextlib.contextmanager&lt;/code&gt;&lt;/a&gt;；生成器本身不是上下文管理器。&lt;/p&gt;
&lt;h2&gt;装饰器&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0318/&quot;&gt;PEP 318&lt;/a&gt; 引入函数装饰器语法：&lt;code&gt;@decorator&lt;/code&gt; 放在 &lt;code&gt;def&lt;/code&gt;（或 &lt;code&gt;class&lt;/code&gt;）前，等价于 &lt;code&gt;func = decorator(func)&lt;/code&gt;。装饰器通常是&lt;strong&gt;接受 callable、返回 callable&lt;/strong&gt; 的可调用对象。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def log_calls(fn):
    def wrapper(*args, **kwargs):
        print(f&quot;calling {fn.__name__}&quot;)
        return fn(*args, **kwargs)
    return wrapper

@log_calls
def add(a, b):
    return a + b

add(1, 2)  # 先打印 calling add，再返回 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;被包装后 &lt;code&gt;wrapper.__name__&lt;/code&gt; 等元数据会丢；用 &lt;a href=&quot;https://docs.python.org/3/library/functools.html#functools.wraps&quot;&gt;&lt;code&gt;functools.wraps&lt;/code&gt;&lt;/a&gt; 拷回去：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import functools

def log_calls(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        print(f&quot;calling {fn.__name__}&quot;)
        return fn(*args, **kwargs)
    return wrapper
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;带参装饰器&lt;/strong&gt;：外层函数先接收装饰器参数，返回真正的装饰器。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def repeat(times):
    def decorator(fn):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = fn(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def hi():
    print(&quot;hi&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;类也可以当装饰器（实现 &lt;code&gt;__call__&lt;/code&gt;）。内置装饰器如 &lt;a href=&quot;https://docs.python.org/3/library/functions.html#staticmethod&quot;&gt;&lt;code&gt;staticmethod&lt;/code&gt;&lt;/a&gt;、&lt;a href=&quot;https://docs.python.org/3/library/functions.html#classmethod&quot;&gt;&lt;code&gt;classmethod&lt;/code&gt;&lt;/a&gt;、&lt;a href=&quot;https://docs.python.org/3/library/functions.html#property&quot;&gt;&lt;code&gt;property&lt;/code&gt;&lt;/a&gt;。装饰器栈从下往上应用：&lt;code&gt;@a @b def f&lt;/code&gt; 等价于 &lt;code&gt;f = a(b(f))&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;附录：内置异常继承关系&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/exceptions.html#exception-hierarchy&quot;&gt;Exception hierarchy&lt;/a&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;BaseException&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SystemExit&lt;/code&gt;, &lt;code&gt;KeyboardInterrupt&lt;/code&gt;, &lt;code&gt;GeneratorExit&lt;/code&gt;, &lt;code&gt;Exception&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Exception&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;StopIteration&lt;/code&gt;, &lt;code&gt;StopAsyncIteration&lt;/code&gt;, &lt;code&gt;ArithmeticError&lt;/code&gt;, &lt;code&gt;AssertionError&lt;/code&gt;, &lt;code&gt;AttributeError&lt;/code&gt;, &lt;code&gt;BufferError&lt;/code&gt;, &lt;code&gt;EOFError&lt;/code&gt;, &lt;code&gt;ImportError&lt;/code&gt;, &lt;code&gt;LookupError&lt;/code&gt;, &lt;code&gt;MemoryError&lt;/code&gt;, &lt;code&gt;NameError&lt;/code&gt;, &lt;code&gt;OSError&lt;/code&gt;, &lt;code&gt;ReferenceError&lt;/code&gt;, &lt;code&gt;RuntimeError&lt;/code&gt;, &lt;code&gt;SyntaxError&lt;/code&gt;, &lt;code&gt;SystemError&lt;/code&gt;, &lt;code&gt;TypeError&lt;/code&gt;, &lt;code&gt;ValueError&lt;/code&gt;, &lt;code&gt;Warning&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ArithmeticError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FloatingPointError&lt;/code&gt;, &lt;code&gt;OverflowError&lt;/code&gt;, &lt;code&gt;ZeroDivisionError&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LookupError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IndexError&lt;/code&gt;, &lt;code&gt;KeyError&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OSError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BlockingIOError&lt;/code&gt;, &lt;code&gt;ChildProcessError&lt;/code&gt;, &lt;code&gt;ConnectionError&lt;/code&gt;, &lt;code&gt;FileExistsError&lt;/code&gt;, &lt;code&gt;FileNotFoundError&lt;/code&gt;, &lt;code&gt;InterruptedError&lt;/code&gt;, &lt;code&gt;IsADirectoryError&lt;/code&gt;, &lt;code&gt;NotADirectoryError&lt;/code&gt;, &lt;code&gt;PermissionError&lt;/code&gt;, &lt;code&gt;ProcessLookupError&lt;/code&gt;, &lt;code&gt;TimeoutError&lt;/code&gt; …&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ConnectionError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BrokenPipeError&lt;/code&gt;, &lt;code&gt;ConnectionAbortedError&lt;/code&gt;, &lt;code&gt;ConnectionRefusedError&lt;/code&gt;, &lt;code&gt;ConnectionResetError&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ImportError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ModuleNotFoundError&lt;/code&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;&lt;code&gt;UnboundLocalError&lt;/code&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;&lt;code&gt;NotImplementedError&lt;/code&gt;, &lt;code&gt;RecursionError&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SyntaxError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IndentationError&lt;/code&gt; → &lt;code&gt;TabError&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UnicodeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UnicodeDecodeError&lt;/code&gt;, &lt;code&gt;UnicodeEncodeError&lt;/code&gt;, &lt;code&gt;UnicodeTranslateError&lt;/code&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;&lt;code&gt;UnicodeError&lt;/code&gt; 等&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;except OSError&lt;/code&gt; 可捕 &lt;code&gt;FileNotFoundError&lt;/code&gt;；&lt;code&gt;except LookupError&lt;/code&gt; 可捕 &lt;code&gt;IndexError&lt;/code&gt; 与 &lt;code&gt;KeyError&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：函数参数汇总&lt;/h2&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;def f(a, b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;位置或关键字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def f(a, b=0)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;b&lt;/code&gt; 有默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def f(a, /, b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt; 仅位置（3.8+）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def f(a, *, b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;b&lt;/code&gt; 仅关键字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def f(*args)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多余位置 → 元组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def f(**kwargs)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;多余关键字 → 字典&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def f(a, /, b, *args, c=1, **kw)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顺序：仅位置、&lt;code&gt;/&lt;/code&gt;、位置或关键字、&lt;code&gt;*args&lt;/code&gt;、仅关键字、&lt;code&gt;**kwargs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/controlflow.html#defining-functions&quot;&gt;More Control Flow Tools — Defining Functions&lt;/a&gt; — 默认参数、关键字参数、&lt;code&gt;*args&lt;/code&gt; / &lt;code&gt;**kwargs&lt;/code&gt;、Docstring&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/controlflow.html#intermezzo-coding-style&quot;&gt;More Control Flow Tools — Intermezzo: Coding Style&lt;/a&gt; — 命名与可读性&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/errors.html&quot;&gt;Errors and Exceptions&lt;/a&gt; — 异常处理、&lt;code&gt;else&lt;/code&gt; / &lt;code&gt;finally&lt;/code&gt;、&lt;code&gt;raise&lt;/code&gt;、用户异常、异常链&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#function-definitions&quot;&gt;Compound statements — Function definitions&lt;/a&gt; — 完整参数语法、&lt;code&gt;lambda&lt;/code&gt; 不能替代 &lt;code&gt;def&lt;/code&gt; 的全部能力&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#the-try-statement&quot;&gt;Compound statements — The try statement&lt;/a&gt; — &lt;code&gt;try&lt;/code&gt; / &lt;code&gt;except&lt;/code&gt; / &lt;code&gt;else&lt;/code&gt; / &lt;code&gt;finally&lt;/code&gt; 语义&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#the-with-statement&quot;&gt;Compound statements — The with statement&lt;/a&gt; — &lt;code&gt;with&lt;/code&gt; 与 &lt;code&gt;as&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/datamodel.html#with-statement-context-managers&quot;&gt;Data model — With Statement Context Managers&lt;/a&gt; — &lt;code&gt;__enter__&lt;/code&gt; / &lt;code&gt;__exit__&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/glossary.html&quot;&gt;Glossary — iterator / generator / iterable&lt;/a&gt; — 术语定义&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/executionmodel.html#naming-and-binding&quot;&gt;Execution model — Naming and binding&lt;/a&gt; — LEGB、闭包&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html&quot;&gt;Simple statements — global / nonlocal / return / raise / yield&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/exceptions.html&quot;&gt;Built-in Exceptions&lt;/a&gt; — 异常列表与继承树&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/functools.html#functools.wraps&quot;&gt;functools.wraps&lt;/a&gt; — 装饰器保留元数据&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/contextlib.html&quot;&gt;contextlib&lt;/a&gt; — 上下文管理器工具&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PEP：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0318/&quot;&gt;PEP 318 — Decorators for Functions and Methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0343/&quot;&gt;PEP 343 — The &quot;with&quot; Statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-3102/&quot;&gt;PEP 3102 — Keyword-Only Arguments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-03110/&quot;&gt;PEP 3110 — Catching exceptions in Python 3000&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-function.html&quot;&gt;菜鸟教程 · Python3 函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-iterator-generator.html&quot;&gt;菜鸟教程 · Python3 迭代器与生成器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-decorator.html&quot;&gt;菜鸟教程 · Python3 装饰器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-errors-exceptions.html&quot;&gt;菜鸟教程 · Python3 错误和异常&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-namespace-scope.html&quot;&gt;菜鸟教程 · Python3 命名空间/作用域&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-with.html&quot;&gt;菜鸟教程 · Python3 with&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-lambda.html&quot;&gt;菜鸟教程 · Python3 lambda&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>MySQL学习笔记 (6)</title><link>https://blog.chuwu.top/posts/sql/mysql6/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql6/</guid><description>COUNT/SUM/AVG/MIN/MAX、GROUP BY、HAVING</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/aggregate-functions.html&quot;&gt;聚合函数&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;聚合函数&lt;/h2&gt;
&lt;p&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;COUNT(*)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;行数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COUNT(col)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;col&lt;/code&gt; 不是 NULL 的个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COUNT(DISTINCT col)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;去重后的个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SUM(expr)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;合计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AVG(expr)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;平均值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MIN(expr)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;最小值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAX(expr)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;最大值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;SELECT COUNT(*)          AS n_emp,
       COUNT(manager_id) AS n_with_mgr,
       AVG(salary)       AS avg_sal
FROM employee;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有 &lt;code&gt;GROUP BY&lt;/code&gt; 时，整张表（经过 &lt;code&gt;WHERE&lt;/code&gt; 之后）算作一组。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;COUNT(phone)&lt;/code&gt; 只统计填了手机号的行；&lt;code&gt;COUNT(*)&lt;/code&gt; 统计所有行。&lt;/p&gt;
&lt;h2&gt;GROUP BY&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;GROUP BY&lt;/code&gt; 用于结合聚合函数，按一个或多个列分组。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT dept_no, COUNT(*) AS n, AVG(salary) AS avg_sal
FROM   employee
GROUP  BY dept_no;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt; 里没有用聚合函数的列，一般要出现在 &lt;code&gt;GROUP BY&lt;/code&gt; 中。下面这样是不对的：按部门分组，却直接选出每个人的姓名。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT dept_no, last_name, COUNT(*)
FROM employee
GROUP BY dept_no;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按多列分组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GROUP BY dept_no, job_id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;WHERE&lt;/code&gt; 在分组之前筛选行。分组之后的条件要用 &lt;code&gt;HAVING&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;HAVING&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;HAVING&lt;/code&gt; 用于筛选分组后的结果。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT dept_no, COUNT(*) AS n
FROM   employee
WHERE  salary &amp;gt;= 3000
GROUP  BY dept_no
HAVING COUNT(*) &amp;gt;= 2
ORDER  BY n DESC;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;HAVING&lt;/code&gt; 里可以使用聚合函数，&lt;code&gt;WHERE&lt;/code&gt; 里不行。&lt;/p&gt;
&lt;h2&gt;NULL 和聚合&lt;/h2&gt;
&lt;p&gt;分组键是 NULL 的行会分到同一组。&lt;/p&gt;
&lt;p&gt;某一组里 &lt;code&gt;SUM&lt;/code&gt; 的值全是 NULL 时，结果是 NULL，不是 0。需要显示 0 时可以写成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;COALESCE(SUM(amount), 0)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/aggregate-functions.html&quot;&gt;MySQL 26.7 · Aggregate Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/group-by-handling.html&quot;&gt;MySQL 26.7 · GROUP BY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/select.html&quot;&gt;MySQL 26.7 · SELECT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (6)</title><link>https://blog.chuwu.top/posts/python/python6/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python6/</guid><description>条件与循环、match / case、range/enumerate/zip、斐波那契与推导式</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;条件：if / elif / else&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;score = 85
if score &amp;gt;= 90:
    grade = &quot;A&quot;
elif score &amp;gt;= 80:
    grade = &quot;B&quot;
elif score &amp;gt;= 60:
    grade = &quot;C&quot;
else:
    grade = &quot;F&quot;
print(grade)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;elif&lt;/code&gt; 可以没有或有多个，&lt;code&gt;else&lt;/code&gt; 可有可无。空分支写 &lt;code&gt;pass&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;None&lt;/code&gt;、&lt;code&gt;False&lt;/code&gt;、&lt;code&gt;0&lt;/code&gt;、&lt;code&gt;&apos;&apos;&lt;/code&gt;、&lt;code&gt;[]&lt;/code&gt;、&lt;code&gt;{}&lt;/code&gt; 在条件里当假，其余一般为真。&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#truth-value-testing&quot;&gt;Truth Value Testing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt; / &lt;code&gt;for&lt;/code&gt; / &lt;code&gt;while&lt;/code&gt; 中赋值的变量在代码块外仍然可以使用。函数具有独立的局部作用域。&lt;/p&gt;
&lt;h3&gt;比较与链式比较&lt;/h3&gt;
&lt;p&gt;比较运算符：&lt;code&gt;==&lt;/code&gt; &lt;code&gt;!=&lt;/code&gt; &lt;code&gt;&amp;lt;&lt;/code&gt; &lt;code&gt;&amp;lt;=&lt;/code&gt; &lt;code&gt;&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;gt;=&lt;/code&gt;，以及 &lt;code&gt;is&lt;/code&gt; / &lt;code&gt;is not&lt;/code&gt;（身份）、&lt;code&gt;in&lt;/code&gt; / &lt;code&gt;not in&lt;/code&gt;（成员）。可链式写：&lt;code&gt;a &amp;lt; b &amp;lt;= c&lt;/code&gt; 等价于 &lt;code&gt;a &amp;lt; b and b &amp;lt;= c&lt;/code&gt;，且 &lt;strong&gt;b 只算一次&lt;/strong&gt;（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#comparisons&quot;&gt;Comparisons&lt;/a&gt;）。&lt;/p&gt;
&lt;h3&gt;三元表达式（条件表达式）&lt;/h3&gt;
&lt;p&gt;语法：&lt;code&gt;value_if_true if condition else value_if_false&lt;/code&gt;。先计算 &lt;code&gt;condition&lt;/code&gt;，再选择其中一个表达式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;status = &quot;adult&quot; if age &amp;gt;= 18 else &quot;minor&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;:=&lt;/code&gt; 可在表达式中赋值（&lt;a href=&quot;https://peps.python.org/pep-0572/&quot;&gt;PEP 572&lt;/a&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;words = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]
if (n := len(words)) &amp;gt; 3:
    print(n)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;循环：while 与 for&lt;/h2&gt;
&lt;h3&gt;while&lt;/h3&gt;
&lt;p&gt;条件为 &lt;code&gt;True&lt;/code&gt; 时重复执行循环体。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;n = 3
while n &amp;gt; 0:
    print(n)
    n -= 1
print(&quot;lift off&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;for&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#the-for-statement&quot;&gt;for 语句&lt;/a&gt; 依次取出元素赋给循环变量。列表、字符串、&lt;code&gt;range&lt;/code&gt; 都可以。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;words = [&quot;Python&quot;, &quot;is&quot;, &quot;great&quot;]
for w in words:
    print(w)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;遍历 dict 时，默认迭代&lt;strong&gt;键&lt;/strong&gt;；要键值用 &lt;code&gt;.items()&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;break、continue&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;break&lt;/code&gt;&lt;/strong&gt; — 立刻跳出&lt;strong&gt;最内层&lt;/strong&gt; enclosing 循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/strong&gt; — 跳过本次剩余 suite，进入下一轮迭代。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;for x in range(10):
    if x % 2 == 0:
        continue
    if x &amp;gt; 5:
        break
    print(x)    # 1, 3, 5
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;循环的 else 子句&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;while&lt;/code&gt; / &lt;code&gt;for&lt;/code&gt; 可以带 &lt;code&gt;else&lt;/code&gt;：循环正常结束（没有被 &lt;code&gt;break&lt;/code&gt; 中断）时执行 &lt;code&gt;else&lt;/code&gt; 子句。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for n in [2, 4, 6, 8]:
    if n % 2 == 1:
        print(&quot;found odd&quot;)
        break
else:
    print(&quot;all even&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;match / case（3.10+）&lt;/h3&gt;
&lt;p&gt;3.10 起可用 &lt;code&gt;match&lt;/code&gt; / &lt;code&gt;case&lt;/code&gt; 按值分支（&lt;a href=&quot;https://peps.python.org/pep-0636/&quot;&gt;PEP 636&lt;/a&gt;）。3.9 及更早没有这套语法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code = 404
match code:
    case 200:
        msg = &quot;OK&quot;
    case 404:
        msg = &quot;Not Found&quot;
    case 500 | 502 | 503:
        msg = &quot;Server Error&quot;
    case _:
        msg = &quot;Unknown&quot;
print(msg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;_&lt;/code&gt; 为通配模式。可解构序列、映射、对象属性。&lt;/p&gt;
&lt;h2&gt;range&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#range&quot;&gt;&lt;code&gt;range&lt;/code&gt;&lt;/a&gt; 是不可变整数序列，&lt;strong&gt;不占&lt;/strong&gt;完整 list 内存。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;range(stop)                    # 0 .. stop-1
range(start, stop)             # start .. stop-1
range(start, stop, step)       # step 不可为 0
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;print(list(range(5)))           # [0, 1, 2, 3, 4]
print(list(range(2, 8, 2)))     # [2, 4, 6]
print(list(range(0, -3, -1)))   # [0, -1, -2]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要 list 时再 &lt;code&gt;list(range(...))&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;enumerate 与 zip&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#enumerate&quot;&gt;&lt;code&gt;enumerate(iterable, start=0)&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; — 产出 &lt;code&gt;(index, item)&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for i, fruit in enumerate([&quot;apple&quot;, &quot;banana&quot;], start=1):
    print(i, fruit)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#zip&quot;&gt;&lt;code&gt;zip&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; — 并行迭代，每次得到一组值，长度取&lt;strong&gt;最短&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;names = [&quot;Alice&quot;, &quot;Bob&quot;]
scores = [90, 85]
for name, score in zip(names, scores):
    print(name, score)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;长度不等时余下部分丢弃。要对齐最长一侧，用 &lt;a href=&quot;https://docs.python.org/3/library/itertools.html#itertools.zip_longest&quot;&gt;&lt;code&gt;itertools.zip_longest&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;斐波那契&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;a, b = 0, 1
while a &amp;lt; 1000:
    print(a, end=&quot;, &quot;)
    a, b = b, a + b
print()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;固定项数可以用 &lt;code&gt;for&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a, b = 0, 1
for _ in range(10):
    print(a, end=&quot; &quot;)
    a, b = b, a + b
print()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要存起来就往 list 里 &lt;code&gt;append&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;result = []
a, b = 0, 1
for _ in range(8):
    result.append(a)
    a, b = b, a + b
print(result)   # [0, 1, 1, 2, 3, 5, 8, 13]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;列表推导式&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions&quot;&gt;List Comprehensions&lt;/a&gt;：&lt;code&gt;[expression for item in iterable if condition]&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;squares = [x * x for x in range(10)]
evens = [x for x in range(20) if x % 2 == 0]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;嵌套循环从左到右等价于嵌套 &lt;code&gt;for&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pairs = [(x, y) for x in range(3) for y in range(3) if x != y]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;简单变换用推导式；副作用多或逻辑复杂时用普通 &lt;code&gt;for&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;保序去重&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;raw = [3, 1, 2, 3, 2, 1]
ordered_unique = list(dict.fromkeys(raw))
print(ordered_unique)   # [3, 1, 2]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;集合与字典推导式&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;集合推导式&lt;/strong&gt; — &lt;code&gt;{expr for item in iterable if cond}&lt;/code&gt;，花括号与 dict 字面量相同，但&lt;strong&gt;无冒号&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unique_lengths = {len(w) for w in [&quot;hi&quot;, &quot;hello&quot;, &quot;hi&quot;]}
print(unique_lengths)   # {2, 5}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;字典推导式&lt;/strong&gt; — &lt;code&gt;{key: value for ...}&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;word_map = {w: len(w) for w in [&quot;Python&quot;, &quot;Java&quot;, &quot;Go&quot;]}
print(word_map)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;生成器表达式&lt;/h2&gt;
&lt;p&gt;语法与 list 推导式类似，圆括号：&lt;code&gt;(expr for item in iterable if cond)&lt;/code&gt;。产出 &lt;strong&gt;iterator&lt;/strong&gt;，惰性求值：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;total = sum(x * x for x in range(1000000))   # 外层函数吞掉括号
gen = (x * x for x in range(5))
print(next(gen))   # 0
print(list(gen))   # [1, 4, 9, 16] — 已消耗 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;单独写 &lt;code&gt;(x for x in iterable)&lt;/code&gt; 是生成器表达式；仅 &lt;code&gt;{}&lt;/code&gt;、&lt;code&gt;[]&lt;/code&gt; 构成 dict / list 推导式。&lt;strong&gt;单层&lt;/strong&gt; &lt;code&gt;(x for ...)&lt;/code&gt; 与调用写成 &lt;code&gt;func(x for ...)&lt;/code&gt; 时，圆括号可省略一层（&lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#generator-expressions&quot;&gt;Generator expressions&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;推导式里的海象 &lt;code&gt;:=&lt;/code&gt; 见 &lt;a href=&quot;https://peps.python.org/pep-0572/&quot;&gt;PEP 572&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：控制流与推导式语法速查&lt;/h2&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;code&gt;if&lt;/code&gt; / &lt;code&gt;elif&lt;/code&gt; / &lt;code&gt;else&lt;/code&gt; + 缩进 suite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;三元&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a if cond else b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;match&lt;/td&gt;
&lt;td&gt;&lt;code&gt;match subject:&lt;/code&gt; + &lt;code&gt;case pattern:&lt;/code&gt;（3.10+）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;while&lt;/td&gt;
&lt;td&gt;&lt;code&gt;while cond:&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;for&lt;/td&gt;
&lt;td&gt;&lt;code&gt;for target in iterable:&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;break / continue&lt;/td&gt;
&lt;td&gt;仅作用于最内层循环&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;循环 else&lt;/td&gt;
&lt;td&gt;未 &lt;code&gt;break&lt;/code&gt; 时执行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;list 推导&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[e for x in it if c]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;set 推导&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{e for x in it if c}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dict 推导&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{k: v for x in it if c}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生成器表达式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(e for x in it if c)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;range&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;整数序列&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enumerate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;带索引迭代&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;并行迭代&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;len&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;长度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sum&lt;/code&gt; / &lt;code&gt;min&lt;/code&gt; / &lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;聚合（可接可迭代对象）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sorted&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回新排序 list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reversed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回 reverse iterator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/controlflow.html&quot;&gt;More Control Flow Tools&lt;/a&gt; — &lt;code&gt;if&lt;/code&gt;、&lt;code&gt;while&lt;/code&gt;、&lt;code&gt;for&lt;/code&gt;、&lt;code&gt;break&lt;/code&gt;/&lt;code&gt;continue&lt;/code&gt;/&lt;code&gt;else&lt;/code&gt;、匹配语句&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/introduction.html#first-steps-towards-programming&quot;&gt;First Steps Towards Programming&lt;/a&gt; — 斐波那契 &lt;code&gt;while&lt;/code&gt; 示例&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions&quot;&gt;List Comprehensions&lt;/a&gt; — 列表推导与集合推导&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#looping-techniques&quot;&gt;Looping Techniques&lt;/a&gt; — &lt;code&gt;enumerate&lt;/code&gt;、&lt;code&gt;zip&lt;/code&gt;、dict 遍历&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#the-for-statement&quot;&gt;The for statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html#the-while-statement&quot;&gt;The while statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#generator-expressions&quot;&gt;Generator expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#range&quot;&gt;range&lt;/a&gt; — 构造与步长&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#enumerate&quot;&gt;enumerate()&lt;/a&gt; / &lt;a href=&quot;https://docs.python.org/3/library/functions.html#zip&quot;&gt;zip()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#truth-value-testing&quot;&gt;Truth Value Testing&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PEP：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0636/&quot;&gt;PEP 636 — Structural Pattern Matching&lt;/a&gt; — &lt;code&gt;match&lt;/code&gt; / &lt;code&gt;case&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-conditional-statements.html&quot;&gt;菜鸟教程 · 条件控制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-loop.html&quot;&gt;菜鸟教程 · 循环语句&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>MySQL学习笔记 (5)</title><link>https://blog.chuwu.top/posts/sql/mysql5/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql5/</guid><description>WHERE、AND/OR、IN、BETWEEN、LIKE、IS NULL、CASE</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/comparison-operators.html&quot;&gt;比较运算符&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;WHERE 子句&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;WHERE&lt;/code&gt; 用于筛选记录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name, salary
FROM   employee
WHERE  salary &amp;gt;= 8000
AND    dept_no = &apos;D01&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&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;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;等于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不等于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;大于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;小于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;大于等于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;小于等于&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;AND、OR、NOT&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AND&lt;/code&gt;：并且&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OR&lt;/code&gt;：或者&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOT&lt;/code&gt;：非&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;NOT&lt;/code&gt; 优先于 &lt;code&gt;AND&lt;/code&gt;，&lt;code&gt;AND&lt;/code&gt; 优先于 &lt;code&gt;OR&lt;/code&gt;。可以用括号改变顺序：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WHERE dept_no = &apos;D01&apos; OR dept_no = &apos;D02&apos; AND salary &amp;gt; 9000
-- D01 的全部，加上 D02 且工资大于 9000 的

WHERE (dept_no = &apos;D01&apos; OR dept_no = &apos;D02&apos;) AND salary &amp;gt; 9000
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;IN&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;IN&lt;/code&gt; 用于在多个可能值中匹配：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WHERE dept_no IN (&apos;D01&apos;, &apos;D02&apos;, &apos;D03&apos;)
WHERE dept_no NOT IN (&apos;D01&apos;, &apos;D02&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;BETWEEN&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;BETWEEN&lt;/code&gt; 选取介于两个值之间的数据，包含两端：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WHERE salary BETWEEN 5000 AND 12000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;相当于 &lt;code&gt;salary &amp;gt;= 5000 AND salary &amp;lt;= 12000&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;LIKE&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;LIKE&lt;/code&gt; 用于在 &lt;code&gt;WHERE&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;%&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;替代 0 个或多个字符&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;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;WHERE last_name LIKE &apos;张%&apos;
WHERE last_name LIKE &apos;_明&apos;
WHERE last_name NOT LIKE &apos;%test%&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要匹配 &lt;code&gt;%&lt;/code&gt; 或 &lt;code&gt;_&lt;/code&gt; 本身，使用 &lt;code&gt;ESCAPE&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WHERE title LIKE &apos;%10$%%&apos; ESCAPE &apos;$&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;IS NULL&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;IS NULL&lt;/code&gt; 用于查找 NULL 值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WHERE manager_id IS NULL
WHERE manager_id IS NOT NULL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：不能写成 &lt;code&gt;manager_id = NULL&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;CASE&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CASE&lt;/code&gt; 根据条件返回不同的值：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name,
       CASE
           WHEN salary &amp;gt;= 12000 THEN &apos;high&apos;
           WHEN salary &amp;gt;= 8000  THEN &apos;mid&apos;
           ELSE &apos;low&apos;
       END AS band
FROM employee;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以写成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CASE salary WHEN 0 THEN &apos;zero&apos; ELSE &apos;nonzero&apos; END
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有 &lt;code&gt;ELSE&lt;/code&gt; 时，不匹配的结果是 NULL。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/comparison-operators.html&quot;&gt;MySQL 26.7 · Comparison Operators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/logical-operators.html&quot;&gt;MySQL 26.7 · Logical Operators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/string-comparison-functions.html#operator_like&quot;&gt;MySQL 26.7 · LIKE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/flow-control-functions.html&quot;&gt;MySQL 26.7 · CASE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (5)</title><link>https://blog.chuwu.top/posts/python/python5/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python5/</guid><description>字典与集合：映射与去重、视图方法、集合运算与 frozenset</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;字典 dict&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;user = {&quot;name&quot;: &quot;Alice&quot;, &quot;age&quot;: 25}
print(user[&quot;name&quot;])
user[&quot;age&quot;] = 26
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;dict&lt;/code&gt; 用键取值。键必须可哈希（&lt;a href=&quot;https://docs.python.org/3/glossary.html#term-hashable&quot;&gt;hashable&lt;/a&gt;）：数字、字符串、元组可以；list、dict 不行。&lt;code&gt;1&lt;/code&gt;、&lt;code&gt;1.0&lt;/code&gt;、&lt;code&gt;True&lt;/code&gt; 会当成同一个键。&lt;/p&gt;
&lt;h3&gt;创建&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;empty = {}
also_empty = dict()

user = {&quot;name&quot;: &quot;Alice&quot;, &quot;age&quot;: 25}
from_pairs = dict([(&quot;a&quot;, 1), (&quot;b&quot;, 2)])
from_zip = dict(zip([&quot;a&quot;, &quot;b&quot;], [1, 2]))
from_keys = dict.fromkeys([&quot;x&quot;, &quot;y&quot;], 0)   # 值默认为 None
from_kwargs = dict(red=1, blue=2)          # 键须为合法标识符
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;{}&lt;/code&gt; 是空 dict，不是空 set。空 set 必须写 &lt;code&gt;set()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;自 3.7 起，dict &lt;strong&gt;保持插入顺序&lt;/strong&gt;；更新已有键的值&lt;strong&gt;不改变&lt;/strong&gt;该键在顺序中的位置；删除后再插入的键排到末尾。&lt;/p&gt;
&lt;h3&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d[key] = value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;插入或更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;value = d[key]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;取值；键不存在 → &lt;code&gt;KeyError&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;del d[key]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除；键不存在 → &lt;code&gt;KeyError&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;key in d&lt;/code&gt; / &lt;code&gt;key not in d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;成员测试（测的是键）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;len(d)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;键值对个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list(d)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;键的 list（插入顺序）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;scores = {&quot;math&quot;: 90}
scores[&quot;english&quot;] = 85
scores[&quot;math&quot;] = 95          # 更新，顺序不变
print(scores[&quot;math&quot;])        # 95
del scores[&quot;english&quot;]
# print(scores[&quot;physics&quot;])   # KeyError
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;get 与 setdefault&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;d.get(key[, default])&lt;/code&gt;&lt;/strong&gt; — 键存在则返回值，否则返回 &lt;code&gt;default&lt;/code&gt;（省略时为 &lt;code&gt;None&lt;/code&gt;），&lt;strong&gt;不抛&lt;/strong&gt; &lt;code&gt;KeyError&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;config = {&quot;host&quot;: &quot;localhost&quot;}
port = config.get(&quot;port&quot;, 8080)
print(port)                  # 8080
print(config.get(&quot;host&quot;))    # localhost
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;d.setdefault(key[, default])&lt;/code&gt;&lt;/strong&gt; — 键存在则返回值；不存在则插入 &lt;code&gt;key: default&lt;/code&gt; 并返回 &lt;code&gt;default&lt;/code&gt;（&lt;code&gt;default&lt;/code&gt; 省略时为 &lt;code&gt;None&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cache = {}
cache.setdefault(&quot;count&quot;, 0)
cache[&quot;count&quot;] += 1
print(cache)                 # {&apos;count&apos;: 1}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;统计词频、按 key 分组时，常用 &lt;code&gt;setdefault&lt;/code&gt; 初始化默认值。缺省值若是新 list 这类可变对象，更常用 &lt;a href=&quot;https://docs.python.org/3/library/collections.html#collections.defaultdict&quot;&gt;&lt;code&gt;collections.defaultdict&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;keys、values、items&lt;/h3&gt;
&lt;p&gt;三者返回&lt;strong&gt;视图对象&lt;/strong&gt;（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects&quot;&gt;Dictionary view objects&lt;/a&gt;）：反映 dict 当前内容，不是静态快照。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;d = {&quot;a&quot;: 1, &quot;b&quot;: 2}
print(list(d.keys()))        # [&apos;a&apos;, &apos;b&apos;]
print(list(d.values()))      # [1, 2]
print(list(d.items()))       # [(&apos;a&apos;, 1), (&apos;b&apos;, 2)]

for k, v in d.items():
    print(k, v)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;视图支持 &lt;code&gt;in&lt;/code&gt;、&lt;code&gt;len&lt;/code&gt;、迭代。两个 &lt;code&gt;dict.values()&lt;/code&gt; 视图互相比永远为 &lt;code&gt;False&lt;/code&gt;（即使来自同一 dict）。&lt;/p&gt;
&lt;p&gt;自 3.8 起 dict 及其视图&lt;strong&gt;可逆&lt;/strong&gt;：&lt;code&gt;reversed(d)&lt;/code&gt;、&lt;code&gt;reversed(d.keys())&lt;/code&gt; 等按插入顺序反序。&lt;/p&gt;
&lt;h3&gt;合并（3.9+）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;defaults = {&quot;theme&quot;: &quot;light&quot;, &quot;lang&quot;: &quot;zh&quot;}
user_pref = {&quot;lang&quot;: &quot;en&quot;}
merged = defaults | user_pref    # 新 dict，右侧优先
print(merged)                    # {&apos;theme&apos;: &apos;light&apos;, &apos;lang&apos;: &apos;en&apos;}

defaults |= user_pref            # 原地更新 defaults
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;update、pop、copy&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d.update(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;批量更新，覆盖已有键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d.pop(key[, default])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除并返回值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d.popitem()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除并返回 LIFO 的 &lt;code&gt;(key, value)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d.clear()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;清空&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d.copy()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浅拷贝&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;字典推导式&lt;/h3&gt;
&lt;p&gt;语法 &lt;code&gt;{key_expr: value_expr for ... in iterable if ...}&lt;/code&gt;，与 list 推导式类似：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;squares = {x: x * x for x in range(5)}
print(squares)   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;dict.fromkeys(iterable, value)&lt;/code&gt; 的 &lt;code&gt;value&lt;/code&gt; 若用可变对象（如 &lt;code&gt;[]&lt;/code&gt;），所有键会共享&lt;strong&gt;同一&lt;/strong&gt;对象；要各自独立应改用 dict 推导式。&lt;/p&gt;
&lt;h2&gt;集合 set&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset&quot;&gt;Set Types — set, frozenset&lt;/a&gt;：&lt;strong&gt;无序&lt;/strong&gt;、&lt;strong&gt;元素不重复&lt;/strong&gt;的可哈希对象集合。用途：成员测试、去重、交并差等。&lt;/p&gt;
&lt;h3&gt;创建与去重&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;empty = set()                # 不能写 {}
tags = {&quot;python&quot;, &quot;blog&quot;, &quot;python&quot;}   # {&apos;python&apos;, &apos;blog&apos;}
from_list = set([1, 2, 2, 3])         # {1, 2, 3}
from_str = set(&quot;hello&quot;)               # {&apos;h&apos;, &apos;e&apos;, &apos;l&apos;, &apos;o&apos;}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;raw = [1, 2, 2, 3, 3, 3]
unique = list(set(raw))      # 顺序不保证
print(unique)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;set &lt;strong&gt;不支持&lt;/strong&gt;索引、切片；元素无固定顺序，&lt;code&gt;for&lt;/code&gt; 迭代顺序实现相关，不要依赖。&lt;/p&gt;
&lt;h3&gt;成员与长度&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;s = {1, 2, 3}
print(2 in s)      # True
print(len(s))      # 3
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;集合运算：运算符与方法&lt;/h3&gt;
&lt;p&gt;对 &lt;strong&gt;set ↔ set&lt;/strong&gt;，运算符与对应方法等价；方法形式常可接受任意 iterable，运算符要求两侧为 set。&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;s | t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.union(t, ...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;并集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s &amp;amp; t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.intersection(t, ...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;交集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s - t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.difference(t, ...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;差集（在 s 不在 t）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s ^ t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.symmetric_difference(t)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对称差（恰在一侧）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s &amp;lt;= t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.issubset(t)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;子集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s &amp;gt;= t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.issuperset(t)&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;s.isdisjoint(t)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;无交集为 True&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)   # {1, 2, 3, 4, 5}
print(a &amp;amp; b)   # {3}
print(a - b)   # {1, 2}
print(a ^ b)   # {1, 2, 4, 5}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;原地&lt;/strong&gt;更新（仅 &lt;code&gt;set&lt;/code&gt;，非 &lt;code&gt;frozenset&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;s |= t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.update(t, ...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s &amp;amp;= t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.intersection_update(t, ...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s -= t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.difference_update(t, ...)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s ^= t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.symmetric_difference_update(t)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;skills = {&quot;python&quot;, &quot;git&quot;}
skills |= {&quot;docker&quot;, &quot;python&quot;}
print(skills)    # {&apos;python&apos;, &apos;git&apos;, &apos;docker&apos;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;增删元素（可变 set）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;s = {1, 2}
s.add(3)
s.remove(2)      # 不存在 → KeyError
s.discard(99)    # 不存在不报错
x = s.pop()      # 任意移除一项；空 set → KeyError
s.clear()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;set&lt;/code&gt; 与 &lt;code&gt;frozenset&lt;/code&gt; 混合运算时，&lt;strong&gt;结果类型与左操作数一致&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;frozenset&lt;/h2&gt;
&lt;p&gt;不可变、&lt;strong&gt;可哈希&lt;/strong&gt;的集合。不能 &lt;code&gt;add&lt;/code&gt; / &lt;code&gt;remove&lt;/code&gt;，可作 dict 键或嵌套在 set 里：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;inner = frozenset([1, 2])
outer = {inner, frozenset([3])}
print(inner in outer)   # True

# { {1, 2} }              # TypeError: set 不能作元素
registry = {frozenset(&quot;ab&quot;): &quot;pair&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构造：&lt;code&gt;frozenset()&lt;/code&gt;、&lt;code&gt;frozenset(iterable)&lt;/code&gt;。支持与 &lt;code&gt;set&lt;/code&gt; 相同的只读运算（&lt;code&gt;union&lt;/code&gt;、&lt;code&gt;intersection&lt;/code&gt; 等及对应运算符）。&lt;/p&gt;
&lt;h2&gt;容易踩的坑&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;{}&lt;/code&gt; 是 dict，&lt;code&gt;set()&lt;/code&gt; 才是空 set。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dict 键必须可哈希&lt;/strong&gt; —— 数字、字符串、tuple（元素皆哈希）可以；list、dict 不行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;set 去重不保序&lt;/strong&gt; —— 要保留首次出现顺序：&lt;code&gt;list(dict.fromkeys(seq))&lt;/code&gt;（3.7+ dict 保序），比 &lt;code&gt;list(set(seq))&lt;/code&gt; 稳。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集合元素必须可哈希&lt;/strong&gt; —— 同 dict 键；要存 list 可先 &lt;code&gt;tuple(...)&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：dict 方法&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#mapping-types-dict&quot;&gt;Mapping Types — dict&lt;/a&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;clear()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;清空&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copy()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浅拷贝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fromkeys(iterable, value=None)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;类方法，键来自 iterable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get(key, default=None)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安全取值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;items()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(key, value)&lt;/code&gt; 视图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keys()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;键视图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;values()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;值视图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pop(key[, default])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除并返回&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;popitem()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LIFO 弹出一项&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;setdefault(key, default=None)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;无则插入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update([mapping,] **kwargs)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;批量更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d | other&lt;/code&gt; / &lt;code&gt;d |= other&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;合并（3.9+）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reversed(d)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;逆序键（3.8+）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;另有：&lt;code&gt;d[key]&lt;/code&gt;、&lt;code&gt;del d[key]&lt;/code&gt;、&lt;code&gt;key in d&lt;/code&gt;、&lt;code&gt;len(d)&lt;/code&gt;、&lt;code&gt;iter(d)&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;附录：set / frozenset 方法&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;set&lt;/th&gt;
&lt;th&gt;frozenset&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;union&lt;/code&gt; / &lt;code&gt;|&lt;/code&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;intersection&lt;/code&gt; / &lt;code&gt;&amp;amp;&lt;/code&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;difference&lt;/code&gt; / &lt;code&gt;-&lt;/code&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;symmetric_difference&lt;/code&gt; / &lt;code&gt;^&lt;/code&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;copy()&lt;/code&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;isdisjoint&lt;/code&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;issubset&lt;/code&gt; / &lt;code&gt;&amp;lt;=&lt;/code&gt; / &lt;code&gt;&amp;lt;&lt;/code&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;issuperset&lt;/code&gt; / &lt;code&gt;&amp;gt;=&lt;/code&gt; / &lt;code&gt;&amp;gt;&lt;/code&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;update&lt;/code&gt; / &lt;code&gt;|=&lt;/code&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;add&lt;/code&gt; / &lt;code&gt;remove&lt;/code&gt; / &lt;code&gt;discard&lt;/code&gt; / &lt;code&gt;pop&lt;/code&gt; / &lt;code&gt;clear&lt;/code&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;p&gt;另有：&lt;code&gt;x in s&lt;/code&gt;、&lt;code&gt;len(s)&lt;/code&gt;、&lt;code&gt;for x in s&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#mapping-types-dict&quot;&gt;Mapping Types — dict&lt;/a&gt; — 键值操作、&lt;code&gt;get&lt;/code&gt; / &lt;code&gt;setdefault&lt;/code&gt;、视图&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects&quot;&gt;Dictionary view objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset&quot;&gt;Set Types — set, frozenset&lt;/a&gt; — 运算符与方法&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#dictionaries&quot;&gt;Dictionaries&lt;/a&gt; — 教程示例&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#sets&quot;&gt;Sets&lt;/a&gt; — 教程中的集合用法&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-data-structure.html&quot;&gt;菜鸟教程 · 数据结构&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>MySQL学习笔记 (4)</title><link>https://blog.chuwu.top/posts/sql/mysql4/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql4/</guid><description>SELECT、DISTINCT、别名、ORDER BY、LIMIT</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/select.html&quot;&gt;SELECT&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;SELECT 语句&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SELECT&lt;/code&gt; 语句用于从数据库中选取数据。&lt;/p&gt;
&lt;p&gt;结果存放在结果表中，称为结果集。&lt;/p&gt;
&lt;p&gt;语法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT column1, column2, ...
FROM table_name;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;选取所有列：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM table_name;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面的语句从 &lt;code&gt;employee&lt;/code&gt; 表选取姓名和入职日期：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name, hire_date
FROM   employee
WHERE  dept_no = &apos;D01&apos;
ORDER  BY last_name;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;列别名&lt;/h2&gt;
&lt;p&gt;可以用 &lt;code&gt;AS&lt;/code&gt; 给列起别名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT emp_id,
       salary * 12 AS year_pay
FROM   employee;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;AS&lt;/code&gt; 可以省略。&lt;/p&gt;
&lt;h2&gt;DISTINCT&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SELECT DISTINCT&lt;/code&gt; 用于返回互不相同的值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT DISTINCT dept_no
FROM employee;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;ORDER BY&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ORDER BY&lt;/code&gt; 用于对结果集排序。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name, salary
FROM   employee
ORDER  BY salary DESC, last_name ASC;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ASC&lt;/code&gt;：升序（默认）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DESC&lt;/code&gt;：降序&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以按列名排序，也可以按多列排序。&lt;/p&gt;
&lt;p&gt;注意：没有 &lt;code&gt;ORDER BY&lt;/code&gt; 时，行的顺序不固定。&lt;/p&gt;
&lt;h2&gt;LIMIT&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;LIMIT&lt;/code&gt; 用于限制返回的行数。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name
FROM   employee
ORDER  BY emp_id
LIMIT  10;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;跳过前面若干行再用 &lt;code&gt;OFFSET&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name
FROM   employee
ORDER  BY emp_id
LIMIT  2 OFFSET 2;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/select.html&quot;&gt;MySQL 26.7 · SELECT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/distinct-optimization.html&quot;&gt;MySQL 26.7 · SELECT … DISTINCT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/sorting-rows.html&quot;&gt;MySQL 26.7 · Sorting Rows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (4)</title><link>https://blog.chuwu.top/posts/python/python4/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python4/</guid><description>列表与元组：序列共性、可变列表操作、元组不可变、解包与 *rest</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;列表&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;fruits = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;]
print(fruits[0])       # apple
print(fruits[-1])      # cherry
print(fruits[1:3])     # [&apos;banana&apos;, &apos;cherry&apos;]
print(&quot;banana&quot; in fruits)
print(len(fruits))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt; 有序、可变。下标从 0 起，负数从末尾数。切片左闭右开。&lt;/p&gt;
&lt;p&gt;list、tuple、字符串都能做这些事（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#common-sequence-operations&quot;&gt;Common Sequence Operations&lt;/a&gt;）：&lt;code&gt;in&lt;/code&gt;、&lt;code&gt;+&lt;/code&gt;、&lt;code&gt;*&lt;/code&gt;、&lt;code&gt;[]&lt;/code&gt;、切片、&lt;code&gt;len&lt;/code&gt;、&lt;code&gt;min&lt;/code&gt; / &lt;code&gt;max&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;索引与切片&lt;/h3&gt;
&lt;p&gt;负索引 &lt;code&gt;i&lt;/code&gt; 等价于 &lt;code&gt;len(s) + i&lt;/code&gt;。切片 &lt;code&gt;[i:j]&lt;/code&gt; 在 &lt;code&gt;i &amp;gt;= j&lt;/code&gt; 时为空；省略 &lt;code&gt;i&lt;/code&gt; 视为 &lt;code&gt;0&lt;/code&gt;，省略 &lt;code&gt;j&lt;/code&gt; 视为 &lt;code&gt;len(s)&lt;/code&gt;。带步长 &lt;code&gt;[i:j:k]&lt;/code&gt; 时，&lt;code&gt;k&lt;/code&gt; 为负则方向反向，且 &lt;code&gt;i&lt;/code&gt;、&lt;code&gt;j&lt;/code&gt; 会被截断到合法范围。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nums = [0, 1, 2, 3, 4, 5]
print(nums[::2])    # [0, 2, 4]
print(nums[::-1])   # 新 list，原 list 不变
print(nums[4:1:-1]) # [4, 3, 2]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;拼接与重复&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;s + t&lt;/code&gt; 与 &lt;code&gt;s * n&lt;/code&gt; 都会产生新对象。对可变序列反复使用 &lt;code&gt;+=&lt;/code&gt; 拼接效率较低，可以使用 &lt;code&gt;extend&lt;/code&gt; 或 &lt;code&gt;str.join&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[[]] * 3&lt;/code&gt; 会使三个元素指向同一个内层 list，修改其中一个，其余也会变化。若需要三个独立的空 list，使用 &lt;code&gt;[[] for _ in range(3)]&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;count 与 index&lt;/h3&gt;
&lt;p&gt;序列还支持（部分类型对 &lt;code&gt;start&lt;/code&gt;/&lt;code&gt;stop&lt;/code&gt; 有限制）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;letters = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;b&quot;]
print(letters.count(&quot;b&quot;))   # 2
print(letters.index(&quot;c&quot;))   # 2
# letters.index(&quot;z&quot;)        # ValueError
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;列表的增删改&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt; 可原地增删改（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types&quot;&gt;Mutable Sequence Types&lt;/a&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;s[i] = x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;替换下标 &lt;code&gt;i&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;del s[i]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除下标 &lt;code&gt;i&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s[i:j] = t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用可迭代对象 &lt;code&gt;t&lt;/code&gt; 替换切片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;del s[i:j]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除切片（同 &lt;code&gt;s[i:j] = []&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s += t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;原地扩展，大致同 &lt;code&gt;s[len(s):len(s)] = t&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s *= n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;原地重复 &lt;code&gt;n&lt;/code&gt; 次&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;创建列表&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;empty = []
from_literal = [1, 2, 3]
from_iter = list(&quot;abc&quot;)          # [&apos;a&apos;, &apos;b&apos;, &apos;c&apos;]
from_range = list(range(3))      # [0, 1, 2]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;list(iterable)&lt;/code&gt; 若参数已是 list，会返回&lt;strong&gt;浅拷贝&lt;/strong&gt;（类似 &lt;code&gt;iterable[:]&lt;/code&gt;）。&lt;/p&gt;
&lt;h3&gt;常用方法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;append(x)&lt;/code&gt;&lt;/strong&gt; — 在末尾追加&lt;strong&gt;一个&lt;/strong&gt;元素（不是展开可迭代对象）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stack = [1, 2]
stack.append(3)       # [1, 2, 3]
stack.append([4, 5])  # [1, 2, 3, [4, 5]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;extend(iterable)&lt;/code&gt;&lt;/strong&gt; — 把可迭代对象里的元素逐个追加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a = [1, 2]
a.extend([3, 4])      # [1, 2, 3, 4]
# 等价于 a[len(a):len(a)] = [3, 4]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;insert(index, x)&lt;/code&gt;&lt;/strong&gt; — 在指定位置插入；等价于 &lt;code&gt;s[index:index] = [x]&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;pop([index=-1])&lt;/code&gt;&lt;/strong&gt; — 取出并删除元素，默认最后一个；空序列或越界会 &lt;code&gt;IndexError&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;remove(value)&lt;/code&gt;&lt;/strong&gt; — 删除&lt;strong&gt;第一个&lt;/strong&gt;等于 &lt;code&gt;value&lt;/code&gt; 的项；找不到则 &lt;code&gt;ValueError&lt;/code&gt;（按 &lt;code&gt;==&lt;/code&gt; 比较）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;sort(*, key=None, reverse=False)&lt;/code&gt;&lt;/strong&gt; — &lt;strong&gt;原地&lt;/strong&gt;排序，只使用 &lt;code&gt;&amp;lt;&lt;/code&gt; 比较；返回 &lt;code&gt;None&lt;/code&gt;。稳定排序。要新列表用内置 &lt;code&gt;sorted(s)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;reverse()&lt;/code&gt;&lt;/strong&gt; — 原地反转，返回 &lt;code&gt;None&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;copy()&lt;/code&gt;&lt;/strong&gt; — 浅拷贝，等价于 &lt;code&gt;s[:]&lt;/code&gt;（Python 3.3+）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;items = [3, 1, 4, 1, 5]
items.sort()
print(items)              # [1, 1, 3, 4, 5]
items.sort(reverse=True)
print(items)              # [5, 4, 3, 1, 1]

dup = items.copy()
dup.reverse()
print(dup)                # [1, 1, 3, 4, 5]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原地方法（&lt;code&gt;sort&lt;/code&gt;、&lt;code&gt;reverse&lt;/code&gt;、&lt;code&gt;append&lt;/code&gt; 等）多数返回 &lt;code&gt;None&lt;/code&gt;；不要写 &lt;code&gt;x = lst.sort()&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;浅拷贝与嵌套&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;copy()&lt;/code&gt; 与 &lt;code&gt;[:]&lt;/code&gt; 只复制&lt;strong&gt;一层&lt;/strong&gt;。内层可变对象仍共享：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;matrix = [[1], [2]]
shadow = matrix.copy()
shadow[0].append(9)
print(matrix)   # [[1, 9], [2]] — 内层 list 共用
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要独立嵌套结构时，用 &lt;code&gt;copy.deepcopy()&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;元组 tuple：不可变序列&lt;/h2&gt;
&lt;p&gt;tuple 创建后&lt;strong&gt;不能&lt;/strong&gt;通过 &lt;code&gt;t[i] = x&lt;/code&gt; 改元素，也没有 &lt;code&gt;append&lt;/code&gt;、&lt;code&gt;sort&lt;/code&gt; 等原地方法。优势：可哈希（元素都哈希时）、占内存通常更小、语义上表达「固定字段组合」。&lt;/p&gt;
&lt;h3&gt;创建与「逗号才是 tuple」&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;empty = ()
singleton = (42,)      # 单元素必须带逗号
not_tuple = (42)     # 这是 int，括号只是分组
pair = 1, 2          # 逗号构成 tuple，括号可省略
from_iter = tuple([1, 2, 3])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;真正构成 tuple 的是逗号&lt;/strong&gt;，括号常可省略；空 tuple 必须是 &lt;code&gt;()&lt;/code&gt;，单元素时 &lt;code&gt;(a,)&lt;/code&gt; 避免与表达式分组混淆。&lt;/p&gt;
&lt;h3&gt;不可变 ≠ 内容全不可变&lt;/h3&gt;
&lt;p&gt;tuple 不能换引用，但若元素是可变对象，&lt;strong&gt;对象内部&lt;/strong&gt;仍可改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;t = ([1, 2], &quot;ok&quot;)
t[0].append(3)   # 合法
print(t)         # ([1, 2, 3], &apos;ok&apos;)
# t[0] = []      # TypeError: 不能改 tuple 里的引用
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;含不可哈希元素的 tuple 不能作 dict 键或 set 元素。&lt;/p&gt;
&lt;h3&gt;哈希与 dict 键&lt;/h3&gt;
&lt;p&gt;不可变且元素均可哈希的 tuple 可 &lt;code&gt;hash()&lt;/code&gt;，能当 dict 键：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;point_index = {(0, 0): &quot;origin&quot;, (1, 0): &quot;east&quot;}
print(point_index[(0, 0)])
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;解包&lt;/h2&gt;
&lt;h3&gt;平行赋值&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;a, b, c = [1, 2, 3]
a, b = b, a          # 交换，无需临时变量
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;左右两侧个数必须一致，否则 &lt;code&gt;ValueError&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;带 * 的扩展解包&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-3132/&quot;&gt;PEP 3132&lt;/a&gt; / &lt;a href=&quot;https://peps.python.org/pep-0448/&quot;&gt;PEP 448&lt;/a&gt;：一个带 &lt;code&gt;*&lt;/code&gt; 的目标收集「剩余」元素为 &lt;strong&gt;list&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;first, *middle, last = [1, 2, 3, 4, 5]
print(first, middle, last)   # 1 [2, 3, 4] 5

head, *tail = &quot;Python&quot;
print(head, tail)            # P [&apos;y&apos;, &apos;t&apos;, &apos;h&apos;, &apos;o&apos;, &apos;n&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用函数时，&lt;code&gt;*&lt;/code&gt; 把列表展开成多个参数：&lt;code&gt;print(*[1, 2, 3])&lt;/code&gt; 相当于 &lt;code&gt;print(1, 2, 3)&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;忽略部分值&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;_&lt;/code&gt; 作占位（约定俗成，不是语法）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name, _, city = (&quot;Alice&quot;, 28, &quot;Seoul&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;list 与 tuple 怎么选&lt;/h2&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;code&gt;list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;固定字段、函数多返回值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tuple&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;作 dict 键 / set 元素&lt;/td&gt;
&lt;td&gt;元素可哈希的 &lt;code&gt;tuple&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大量只读数据&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tuple&lt;/code&gt; 略省内存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;需要「命名访问」时，官方推荐 &lt;a href=&quot;https://docs.python.org/3/library/collections.html#collections.namedtuple&quot;&gt;&lt;code&gt;collections.namedtuple&lt;/code&gt;&lt;/a&gt; 或 &lt;a href=&quot;https://docs.python.org/3/library/dataclasses.html&quot;&gt;&lt;code&gt;dataclass&lt;/code&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：list 可变序列方法&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types&quot;&gt;Mutable Sequence Types&lt;/a&gt; 与 &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#lists&quot;&gt;Lists&lt;/a&gt;。&lt;code&gt;list&lt;/code&gt; 另独有 &lt;code&gt;sort()&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;th&gt;返回值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;append(value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;末尾追加一项&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clear()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除全部（同 &lt;code&gt;del s[:]&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copy()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浅拷贝（同 &lt;code&gt;s[:]&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;新 &lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extend(iterable)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;追加 iterable 中各项&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insert(index, value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在 index 处插入&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pop(index=-1)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;取出并删除 index 处项&lt;/td&gt;
&lt;td&gt;被删元素&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;remove(value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除首个等于 value 的项&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reverse()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;原地反转&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sort(*, key=None, reverse=False)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;原地排序（仅 list）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;序列共有 &lt;code&gt;count(value)&lt;/code&gt;、&lt;code&gt;index(value[, start[, stop]])&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;tuple 可用操作小结&lt;/h3&gt;
&lt;p&gt;tuple 仅实现&lt;strong&gt;不可变&lt;/strong&gt;序列操作：&lt;code&gt;+&lt;/code&gt;、&lt;code&gt;*&lt;/code&gt;、&lt;code&gt;in&lt;/code&gt;、&lt;code&gt;len&lt;/code&gt;、&lt;code&gt;min&lt;/code&gt;、&lt;code&gt;max&lt;/code&gt;、索引切片、&lt;code&gt;count&lt;/code&gt;、&lt;code&gt;index&lt;/code&gt;。无 &lt;code&gt;append&lt;/code&gt;、&lt;code&gt;sort&lt;/code&gt; 等。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range&quot;&gt;Sequence Types — list, tuple, range&lt;/a&gt; — 共性操作、可变/不可变区分&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#common-sequence-operations&quot;&gt;Common Sequence Operations&lt;/a&gt; — 索引、切片、拼接、重复&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types&quot;&gt;Mutable Sequence Types&lt;/a&gt; — 原地赋值、删除、方法表&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#lists&quot;&gt;Lists&lt;/a&gt; — 构造、&lt;code&gt;sort()&lt;/code&gt; 关键字参数&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#tuples&quot;&gt;Tuples&lt;/a&gt; — 单元素逗号、括号与逗号&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#more-on-lists&quot;&gt;More on Lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences&quot;&gt;Tuples and Sequences&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PEP：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-3132/&quot;&gt;PEP 3132 — Extended Iterable Unpacking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0448/&quot;&gt;PEP 448 — Additional Unpacking Generalizations&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-data-structure.html&quot;&gt;菜鸟教程 · 数据结构&lt;/a&gt; — list / tuple 章节&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>MySQL学习笔记 (3)</title><link>https://blog.chuwu.top/posts/sql/mysql3/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql3/</guid><description>CREATE SCHEMA、CREATE TABLE、约束、ALTER、DROP、索引</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/create-table.html&quot;&gt;CREATE TABLE&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;创建数据库&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;CREATE SCHEMA scoredb;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后选中这个数据库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;USE scoredb;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以后可以用 &lt;code&gt;scoredb.employee&lt;/code&gt; 这种写法指定库名和表名。&lt;/p&gt;
&lt;h2&gt;CREATE TABLE&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CREATE TABLE&lt;/code&gt; 语句用于创建表。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE department (
    dept_no   CHAR(3)      NOT NULL,
    dept_name VARCHAR(50)  NOT NULL,
    director  VARCHAR(50)  DEFAULT &apos;院长&apos;,
    CONSTRAINT department_pk PRIMARY KEY (dept_no),
    CONSTRAINT department_name_un UNIQUE (dept_name)
);

CREATE TABLE employee (
    emp_id     INTEGER       NOT NULL,
    last_name  VARCHAR(40)   NOT NULL,
    first_name VARCHAR(40),
    dept_no    CHAR(3),
    hire_date  DATE,
    salary     NUMERIC(12, 2),
    manager_id INTEGER,
    is_active  BOOLEAN,
    job_id     VARCHAR(10),
    phone      VARCHAR(20),
    title      VARCHAR(50),
    CONSTRAINT employee_pk PRIMARY KEY (emp_id),
    CONSTRAINT emp_id_ck CHECK (emp_id &amp;gt; 0),
    CONSTRAINT employee_dept_fk
        FOREIGN KEY (dept_no) REFERENCES department (dept_no)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;约束可以写在列后面，也可以写成 &lt;code&gt;CONSTRAINT 名字 …&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;先插入部门，再插入员工（因为员工的部门编号要在部门表里存在）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO department (dept_no, dept_name, director)
VALUES (&apos;D01&apos;, &apos;教务处&apos;, &apos;院长&apos;),
       (&apos;D02&apos;, &apos;人事处&apos;, &apos;院长&apos;),
       (&apos;D03&apos;, &apos;财务处&apos;, &apos;院长&apos;);

INSERT INTO employee (
    emp_id, last_name, first_name, dept_no, hire_date,
    salary, manager_id, is_active, job_id, phone, title
)
VALUES
    (101, &apos;张三&apos;, &apos;明&apos;, &apos;D01&apos;, DATE &apos;2018-03-01&apos;,
     9000, NULL, TRUE, &apos;T01&apos;, &apos;13800000001&apos;, &apos;讲师&apos;),
    (102, &apos;李四&apos;, &apos;华&apos;, &apos;D01&apos;, DATE &apos;2019-07-15&apos;,
     12000, 101, TRUE, &apos;T01&apos;, NULL, &apos;副教授&apos;),
    (103, &apos;王五&apos;, &apos;强&apos;, &apos;D02&apos;, DATE &apos;2021-01-10&apos;,
     7500, 101, TRUE, &apos;T02&apos;, &apos;13800000003&apos;, &apos;助教&apos;),
    (104, &apos;赵六&apos;, &apos;芳&apos;, &apos;D02&apos;, DATE &apos;2016-11-20&apos;,
     15000, NULL, FALSE, &apos;T02&apos;, &apos;13800000004&apos;, &apos;教授&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;约束&lt;/h2&gt;
&lt;p&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;NOT NULL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列不能是 NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UNIQUE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列的值不能重复&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PRIMARY KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主键：非空且唯一，一张表一个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FOREIGN KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;外键：值必须在另一张表里存在&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CHECK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;值必须满足条件，例如 &lt;code&gt;emp_id &amp;gt; 0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEFAULT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;插入时没给值就用默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;外键列可以是 NULL（如果该列允许 NULL）。&lt;/p&gt;
&lt;h2&gt;ALTER TABLE&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ALTER TABLE&lt;/code&gt; 语句用于修改表。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ALTER TABLE employee ADD COLUMN email VARCHAR(100);
ALTER TABLE employee ADD CONSTRAINT employee_email_un UNIQUE (email);
ALTER TABLE employee DROP INDEX employee_email_un;
ALTER TABLE employee DROP COLUMN email;
ALTER TABLE department ALTER COLUMN director SET DEFAULT &apos;院长&apos;;
ALTER TABLE department ALTER COLUMN director DROP DEFAULT;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;DROP TABLE&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DROP TABLE&lt;/code&gt; 语句用于删除表。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DROP TABLE employee, department;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有外键时，先删除子表，或者先删除外键。&lt;/p&gt;
&lt;h2&gt;索引&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CREATE INDEX&lt;/code&gt; 语句用于创建索引，加快查找。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE INDEX employee_name_idx ON employee (last_name);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主键和 &lt;code&gt;UNIQUE&lt;/code&gt; 已经带有索引。删除索引：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DROP INDEX employee_name_idx ON employee;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/create-database.html&quot;&gt;MySQL 26.7 · CREATE SCHEMA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/create-table.html&quot;&gt;MySQL 26.7 · CREATE TABLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/constraints.html&quot;&gt;MySQL 26.7 · Constraints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/create-table-foreign-keys.html&quot;&gt;MySQL 26.7 · FOREIGN KEY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/alter-table.html&quot;&gt;MySQL 26.7 · ALTER TABLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/create-index.html&quot;&gt;MySQL 26.7 · CREATE INDEX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (3)</title><link>https://blog.chuwu.top/posts/python/python3/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python3/</guid><description>int/float/complex 与进制、地板除与幂、math 与 random 常用函数、字符串不可变与切片、转义与 raw、格式化与 f-string、常用 str 方法</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;数字类型总览&lt;/h2&gt;
&lt;p&gt;Python 3 内置三种数值类型（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex&quot;&gt;Numeric Types&lt;/a&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;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt; &lt;code&gt;42&lt;/code&gt; &lt;code&gt;-7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;任意精度整数，仅受内存限制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.14&lt;/code&gt; &lt;code&gt;1e-3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;双精度浮点（实现依赖平台，通常 IEEE 754）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;complex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3+4j&lt;/code&gt; &lt;code&gt;complex(2, -1)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;实部 + 虚部，虚部后缀 &lt;code&gt;j&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;type(1)             # int
type(1.0)           # float
type(2+3j)          # complex
(3+4j).real         # 3.0
(3+4j).imag         # 4.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;bool&lt;/code&gt; 是 &lt;code&gt;int&lt;/code&gt; 子类；算术里 &lt;code&gt;True&lt;/code&gt;/&lt;code&gt;False&lt;/code&gt; 当 1/0。精确小数用 &lt;code&gt;decimal.Decimal&lt;/code&gt;、&lt;code&gt;fractions.Fraction&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;字面量与进制&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;int&lt;/code&gt; 字面量可带进制前缀（&lt;a href=&quot;https://docs.python.org/3/reference/lexical_analysis.html#integer-literals&quot;&gt;Integer literals&lt;/a&gt;）；数字里可用下划线分组（&lt;a href=&quot;https://peps.python.org/pep-0515/&quot;&gt;PEP 515&lt;/a&gt;）：&lt;code&gt;1_000_000&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;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0b&lt;/code&gt; / &lt;code&gt;0B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;二进制&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0b1010&lt;/code&gt; → 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0o&lt;/code&gt; / &lt;code&gt;0O&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;八进制&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0o12&lt;/code&gt; → 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x&lt;/code&gt; / &lt;code&gt;0X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;十六进制&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xFF&lt;/code&gt; → 255&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;int(&quot;1010&quot;, 2)      # 10，任意进制字符串 → int
bin(10)             # &apos;0b1010&apos;
oct(10)             # &apos;0o12&apos;
hex(255)            # &apos;0xff&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浮点可用科学计数：&lt;code&gt;1.5e2&lt;/code&gt; → &lt;code&gt;150.0&lt;/code&gt;。不要使用 &lt;code&gt;0.1 + 0.2 == 0.3&lt;/code&gt; 判断浮点数是否相等；精确小数使用 &lt;code&gt;decimal&lt;/code&gt;，或改用整数运算。&lt;/p&gt;
&lt;h2&gt;算术：//、%、**&lt;/h2&gt;
&lt;p&gt;Python 3 的 &lt;code&gt;/&lt;/code&gt; 恒为真除，结果是 &lt;code&gt;float&lt;/code&gt;。&lt;code&gt;//&lt;/code&gt; 是地板除（向负无穷取整），&lt;code&gt;%&lt;/code&gt; 与之配套。&lt;code&gt;**&lt;/code&gt; 是幂。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;7 / 3               # 2.333...，真除恒为 float
7 // 3              # 2，地板除
-7 // 3             # -3（向负无穷，不是向零）
7 % 3               # 1
-7 % 3              # 2，与 // 配套
2 ** 10             # 1024
pow(2, 8)           # 256，内置函数
pow(2, 8, 5)        # 1，模幂：2**8 % 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;divmod(a, b)&lt;/code&gt; 返回 &lt;code&gt;(a // b, a % b)&lt;/code&gt; 一对。复数不支持 &lt;code&gt;//&lt;/code&gt; 和 &lt;code&gt;%&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;混合类型：&lt;code&gt;int&lt;/code&gt; 与 &lt;code&gt;float&lt;/code&gt; 运算结果为 &lt;code&gt;float&lt;/code&gt;；&lt;code&gt;int&lt;/code&gt; 与 &lt;code&gt;complex&lt;/code&gt; 得 &lt;code&gt;complex&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;math 模块（常用）&lt;/h2&gt;
&lt;p&gt;标准库 &lt;a href=&quot;https://docs.python.org/3/library/math.html&quot;&gt;math&lt;/a&gt; 提供&lt;strong&gt;实数&lt;/strong&gt;数学函数（多数要求 &lt;code&gt;float&lt;/code&gt;，返回 &lt;code&gt;float&lt;/code&gt;）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import math
math.sqrt(2)          # 1.414...
math.pi               # 常量
math.e
math.floor(3.7)       # 3
math.ceil(3.2)        # 4
math.fabs(-3)         # 3.0
math.log(100, 10)     # 2.0，默认自然对数 math.log(x)
math.sin(math.pi / 2) # 1.0
math.hypot(3, 4)      # 5.0，sqrt(x*x + y*y)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;math.inf&lt;/code&gt;、&lt;code&gt;math.nan&lt;/code&gt; 对应浮点无穷与非数。&lt;code&gt;nan&lt;/code&gt; 与任何值（包括自身）比较都不为真，用 &lt;code&gt;math.isnan(x)&lt;/code&gt; 判断。&lt;/p&gt;
&lt;h2&gt;random 模块（常用）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/random.html&quot;&gt;random&lt;/a&gt; 提供&lt;strong&gt;伪随机&lt;/strong&gt;数（非密码学安全；安全场景用 &lt;code&gt;secrets&lt;/code&gt;）。另有分布采样如 &lt;code&gt;gauss&lt;/code&gt;、&lt;code&gt;uniform&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import random
random.random()       # [0.0, 1.0) 均匀 float
random.randint(1, 6)  # 闭区间 [1, 6] 整数
random.randrange(0, 10, 2)  # 0,2,4,6,8
random.choice([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;])
items = [1, 2, 3, 4]
random.shuffle(items) # 原地打乱
random.sample(range(100), 5)  # 无重复抽样
random.seed(42)       # 可复现（调试）；生产环境慎固定种子
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;字符串：不可变文本序列&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;str&lt;/code&gt; 是 Unicode 码点序列（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str&quot;&gt;Text Sequence Type&lt;/a&gt;），&lt;strong&gt;不可变&lt;/strong&gt;。引号成对即可：&lt;code&gt;&apos;&lt;/code&gt;、&lt;code&gt;&quot;&lt;/code&gt;、&lt;code&gt;&apos;&apos;&apos;&lt;/code&gt;、&lt;code&gt;&quot;&quot;&quot;&lt;/code&gt;；内容相同时等价。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;s = &quot;Python&quot;
# s[0] = &quot;p&quot;        # TypeError
s = &quot;python&quot;        # 新对象
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;len(s)&lt;/code&gt; 返回字符个数。&lt;a href=&quot;https://docs.python.org/3/howto/unicode.html&quot;&gt;Unicode HOWTO&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;索引与切片&lt;/h2&gt;
&lt;p&gt;下标从 &lt;strong&gt;0&lt;/strong&gt; 起；负下标从末尾计：&lt;code&gt;-1&lt;/code&gt; 是最后一个。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;s = &quot;Python&quot;
s[0]                # &apos;P&apos;
s[-1]               # &apos;n&apos;
s[1:4]              # &apos;yth&apos;，左闭右开
s[:3]               # &apos;Pyt&apos;
s[3:]               # &apos;hon&apos;
s[::2]              # &apos;Pto&apos;，步长 2
s[::-1]             # &apos;nohtyP&apos;，反转
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;切片&lt;strong&gt;总是&lt;/strong&gt;产生新 &lt;code&gt;str&lt;/code&gt;，不修改原串。越界单下标 &lt;code&gt;IndexError&lt;/code&gt;；切片边界可宽松（超出当作端点）。&lt;/p&gt;
&lt;h2&gt;转义与 raw 字符串&lt;/h2&gt;
&lt;p&gt;反斜杠 &lt;code&gt;\&lt;/code&gt; 引入转义（&lt;a href=&quot;https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals&quot;&gt;String and Bytes literals&lt;/a&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;\n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\t&lt;/code&gt;&lt;/td&gt;
&lt;td&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;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\&apos;&lt;/code&gt; &lt;code&gt;\&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;引号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\uXXXX&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unicode 码点（16 位）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\UXXXXXXXX&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unicode 码点（32 位）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;line1\nline2&quot;)
print(r&quot;C:\new\test&quot;)   # raw：不处理转义，\\ 仍保留
# r&quot;C:\new&quot;  末尾 \ 可能引发语法问题，注意结尾反斜杠
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;路径、正则模式常用 &lt;code&gt;r&quot;...&quot;&lt;/code&gt;；raw 字面量不能以奇数个 &lt;code&gt;\&lt;/code&gt; 结尾。&lt;/p&gt;
&lt;h2&gt;拼接与重复&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hello, &quot; + &quot;World&quot;  # 连接
&quot;*&quot; * 30              # 重复 30 次
# &quot;a&quot; + 1             # TypeError，需 str(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大列表拼串时，&lt;code&gt;&quot;&quot;.join(iterable)&lt;/code&gt; 往往比循环 &lt;code&gt;+&lt;/code&gt; 高效。&lt;/p&gt;
&lt;h2&gt;格式化：%、str.format、f-string&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;%&lt;/code&gt; 与 &lt;code&gt;str.format&lt;/code&gt; 仍可用；f-string（&lt;a href=&quot;https://peps.python.org/pep-0498/&quot;&gt;PEP 498&lt;/a&gt;，3.6+）把表达式写进字面量。&lt;/p&gt;
&lt;h3&gt;% 格式化（旧式）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;%.2f %s&quot; % (3.14159, &quot;pi&quot;)     # &apos;3.14 pi&apos;
&quot;%d&quot; % 42
&quot;%(name)s&quot; % {&quot;name&quot;: &quot;Alice&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;映射与 &lt;code&gt;%&lt;/code&gt; 运算符见 &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting&quot;&gt;printf-style String Formatting&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;str.format&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;{} + {} = {}&quot;.format(1, 2, 3)
&quot;{1} {0}&quot;.format(&quot;world&quot;, &quot;hello&quot;)
&quot;{name}: {age}&quot;.format(name=&quot;Bob&quot;, age=20)
&quot;{:.2f}&quot;.format(3.14159)
&quot;{:&amp;gt;10}&quot;.format(&quot;右对齐&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;格式规格见 &lt;a href=&quot;https://docs.python.org/3/library/string.html#formatstrings&quot;&gt;Format String Syntax&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;f-string（推荐）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;name = &quot;Alice&quot;
age = 30
f&quot;{name} is {age} years old&quot;
f&quot;{3.14159:.2f}&quot;
f&quot;{2 + 3}&quot;
f&quot;{name!r}&quot;          # 等价于 repr(name)
f&quot;{name.lower()=}&quot;   # 3.8+ 调试
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;花括号内可以是表达式；&lt;strong&gt;不能&lt;/strong&gt;嵌套同一引号未转义的花括号。3.12 起允许更自由的引号嵌套与多行（&lt;a href=&quot;https://docs.python.org/3/whatsnew/3.12.html&quot;&gt;What&apos;s New in 3.12&lt;/a&gt;）。&lt;/p&gt;
&lt;h2&gt;常用 str 方法&lt;/h2&gt;
&lt;h3&gt;split 与 join&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;a,b,c&quot;.split(&quot;,&quot;)           # [&apos;a&apos;, &apos;b&apos;, &apos;c&apos;]
&quot;a  b  c&quot;.split()             # 默认按任意空白切
&quot;,&quot;.join([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;])     # &apos;a,b,c&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;strip 系列&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;  hello  &quot;.strip()           # &apos;hello&apos;
&quot;xxxhelloxxx&quot;.strip(&quot;x&quot;)      # &apos;hello&apos;
&quot;  hi&quot;.lstrip()
&quot;hi  &quot;.rstrip()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;replace&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;hello&quot;.replace(&quot;l&quot;, &quot;L&quot;)     # &apos;heLLo&apos;
&quot;hello&quot;.replace(&quot;l&quot;, &quot;L&quot;, 1)  # 只换 1 次
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;find / index&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;python&quot;.find(&quot;th&quot;)           # 2，找不到 -1
&quot;python&quot;.index(&quot;th&quot;)          # 2，找不到 ValueError
&quot;python&quot;.count(&quot;o&quot;)           # 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;startswith / endswith&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;hello.py&quot;.startswith(&quot;hello&quot;)
&quot;hello.py&quot;.endswith(&quot;.py&quot;)
&quot;hello.py&quot;.removesuffix(&quot;.py&quot;)  # 3.9+，&apos;hello&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;大小写与判断&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hello&quot;.lower()
&quot;Hello&quot;.upper()
&quot;hello world&quot;.title()
&quot;123&quot;.isdigit()
&quot;abc&quot;.isalpha()
&quot;  &quot;.isspace()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;encode&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&quot;中文&quot;.encode(&quot;utf-8&quot;)        # bytes
b&quot;\xe4\xb8\xad&quot;.decode(&quot;utf-8&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;encode&lt;/code&gt;/&lt;code&gt;decode&lt;/code&gt; 可用 &lt;code&gt;errors=&lt;/code&gt;（如 &lt;code&gt;strict&lt;/code&gt;、&lt;code&gt;replace&lt;/code&gt;、&lt;code&gt;ignore&lt;/code&gt;）；编码名见 &lt;a href=&quot;https://docs.python.org/3/library/codecs.html&quot;&gt;codecs&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;字符串与 bytes&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;str&lt;/code&gt; 是文本，&lt;code&gt;bytes&lt;/code&gt; 是字节序列（0–255）。网络、文件二进制读写要在二者间&lt;strong&gt;显式&lt;/strong&gt;编解码，Python 3 &lt;strong&gt;不会&lt;/strong&gt;自动混用。&lt;code&gt;b&quot;...&quot;&lt;/code&gt; 字面量只能写 ASCII 或转义；&lt;code&gt;bytes&lt;/code&gt; 下标得到的是 &lt;strong&gt;int&lt;/strong&gt;。需要原地改用 &lt;code&gt;bytearray&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;text = &quot;你好&quot;
data = text.encode(&quot;utf-8&quot;)
text2 = data.decode(&quot;utf-8&quot;)
type(data)          # bytes
ord(&quot;中&quot;)           # 码点
chr(20013)          # &apos;中&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：math 模块函数表&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/math.html&quot;&gt;math — Mathematical functions&lt;/a&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;pi&lt;/code&gt;, &lt;code&gt;e&lt;/code&gt;, &lt;code&gt;tau&lt;/code&gt;, &lt;code&gt;inf&lt;/code&gt;, &lt;code&gt;nan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ceil(x)&lt;/code&gt;, &lt;code&gt;floor(x)&lt;/code&gt;, &lt;code&gt;trunc(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;取整方向不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fabs(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;绝对值（float）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;factorial(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;n!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gcd(a, b)&lt;/code&gt;, &lt;code&gt;lcm(a, b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;最大公约数 / 最小公倍数（3.9+ lcm）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sqrt(x)&lt;/code&gt;, &lt;code&gt;pow(x, y)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;平方根 / x^y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exp(x)&lt;/code&gt;, &lt;code&gt;log(x[, base])&lt;/code&gt;, &lt;code&gt;log10(x)&lt;/code&gt;, &lt;code&gt;log2(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指数与对数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sin&lt;/code&gt;, &lt;code&gt;cos&lt;/code&gt;, &lt;code&gt;tan&lt;/code&gt;, &lt;code&gt;asin&lt;/code&gt;, &lt;code&gt;acos&lt;/code&gt;, &lt;code&gt;atan&lt;/code&gt;, &lt;code&gt;atan2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;三角&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;degrees(x)&lt;/code&gt;, &lt;code&gt;radians(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;弧度 ↔ 角度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hypot(x, y)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sqrt(x²+y²)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isfinite(x)&lt;/code&gt;, &lt;code&gt;isinf(x)&lt;/code&gt;, &lt;code&gt;isnan(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浮点检测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copysign(x, y)&lt;/code&gt;, &lt;code&gt;fmod(x, y)&lt;/code&gt;, &lt;code&gt;remainder(x, y)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;符号与余数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;附录：random 模块函数表&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/random.html&quot;&gt;random — Generate pseudo-random numbers&lt;/a&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;seed(a=None, version=2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;初始化生成器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;random()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;[0.0, 1.0) float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;uniform(a, b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;[a, b] 均匀 float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;randint(a, b)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;[a, b] 整数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;randrange(start, stop[, step])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;半开区间整数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;choice(seq)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;随机元素&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;choices(population, weights=None, k=1)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可重复抽样&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sample(population, k)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;无重复抽样&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shuffle(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;原地洗牌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;getrandbits(k)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;k 位随机整数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gauss(mu, sigma)&lt;/code&gt;, &lt;code&gt;normalvariate&lt;/code&gt;, &lt;code&gt;expovariate&lt;/code&gt; 等&lt;/td&gt;
&lt;td&gt;常见分布&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;附录：str 常用方法表&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#string-methods&quot;&gt;Text Sequence Type — str&lt;/a&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;capitalize()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;首字母大写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;casefold()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;强大小写折叠（比较用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;center(width[, fillchar])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;居中填充&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;count(sub[, start[, end]])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;子串出现次数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;encode(encoding=&apos;utf-8&apos;, errors=&apos;strict&apos;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;→ bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;endswith(suffix[, start[, end]])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;后缀判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;expandtabs(tabsize=8)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tab → 空格&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;find(sub[, start[, end]])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查找，失败 -1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format(*args, **kwargs)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;格式化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format_map(mapping)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;映射格式化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;index(sub[, start[, end]])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查找，失败 ValueError&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isalnum()&lt;/code&gt;, &lt;code&gt;isalpha()&lt;/code&gt;, &lt;code&gt;isdigit()&lt;/code&gt;, &lt;code&gt;isspace()&lt;/code&gt; …&lt;/td&gt;
&lt;td&gt;字符类判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;join(iterable)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ljust&lt;/code&gt;, &lt;code&gt;rjust&lt;/code&gt;, &lt;code&gt;zfill&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对齐与填零&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lower()&lt;/code&gt;, &lt;code&gt;upper()&lt;/code&gt;, &lt;code&gt;swapcase()&lt;/code&gt;, &lt;code&gt;title()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;大小写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lstrip&lt;/code&gt;, &lt;code&gt;rstrip&lt;/code&gt;, &lt;code&gt;strip([chars])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;去空白或字符集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;replace(old, new[, count])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;替换&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;removeprefix&lt;/code&gt;, &lt;code&gt;removesuffix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.9+ 去前后缀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;split(sep=None, maxsplit=-1)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;拆分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rsplit&lt;/code&gt;, &lt;code&gt;splitlines&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;右拆 / 按行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;startswith(prefix[, start[, end]])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;前缀判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;partition(sep)&lt;/code&gt;, &lt;code&gt;rpartition(sep)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;三分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;maketrans&lt;/code&gt;, &lt;code&gt;translate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符映射&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex&quot;&gt;Numeric Types — int, float, complex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str&quot;&gt;Text Sequence Type — str&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting&quot;&gt;printf-style String Formatting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/introduction.html#numbers&quot;&gt;An Informal Introduction to Python — Numbers, Strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/introduction.html#strings&quot;&gt;Using Python as a Calculator — Strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/string.html#formatstrings&quot;&gt;Format String Syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/math.html&quot;&gt;math — Mathematical functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/random.html&quot;&gt;random — Generate pseudo-random numbers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/lexical_analysis.html#literals&quot;&gt;Lexical analysis — Literals&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PEP：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0498/&quot;&gt;PEP 498 — Literal String Interpolation (f-strings)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0515/&quot;&gt;PEP 515 — Underscores in Numeric Literals&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-number.html&quot;&gt;菜鸟教程 · Number&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-string.html&quot;&gt;菜鸟教程 · 字符串&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-string-format.html&quot;&gt;菜鸟教程 · 格式化&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>MySQL学习笔记 (2)</title><link>https://blog.chuwu.top/posts/sql/mysql2/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql2/</guid><description>数据类型、日期时间、CAST、字符串函数</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/data-types.html&quot;&gt;数据类型&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;数据类型&lt;/h2&gt;
&lt;p&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;CHAR(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;定长字符串&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VARCHAR(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;变长字符串，最长 &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INTEGER&lt;/code&gt; / &lt;code&gt;INT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;整数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SMALLINT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;较小整数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BIGINT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;较大整数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NUMERIC(p,s)&lt;/code&gt; / &lt;code&gt;DECIMAL(p,s)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;精确小数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REAL&lt;/code&gt; / &lt;code&gt;DOUBLE PRECISION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;浮点数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DATE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TIME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TIMESTAMP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日期 + 时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BOOLEAN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;真 / 假&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;金额用 &lt;code&gt;NUMERIC&lt;/code&gt;，例如 &lt;code&gt;NUMERIC(12, 2)&lt;/code&gt; 表示最多 12 位数字，其中 2 位小数。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CHAR&lt;/code&gt; 不足长度时会补空格。空字符串 &lt;code&gt;&apos;&apos;&lt;/code&gt; 和 &lt;code&gt;NULL&lt;/code&gt; 不是一回事。&lt;/p&gt;
&lt;h2&gt;日期时间&lt;/h2&gt;
&lt;p&gt;日期和时间可以写成：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DATE &apos;2026-09-01&apos;
TIME &apos;14:30:00&apos;
TIMESTAMP &apos;2026-09-01 14:30:00&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前日期和时间：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;取出年份、月份：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EXTRACT(YEAR FROM hire_date)
EXTRACT(MONTH FROM hire_date)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;布尔&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;BOOLEAN&lt;/code&gt; 的值是 &lt;code&gt;TRUE&lt;/code&gt;、&lt;code&gt;FALSE&lt;/code&gt;，也可以是 NULL。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM employee WHERE is_active = TRUE;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;CAST&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CAST&lt;/code&gt; 用来转换类型：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CAST(emp_id AS CHAR(10))
CAST(&apos;2026-09-01&apos; AS DATE)
CAST(3.14 AS NUMERIC(4, 2))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;COALESCE(a, b, …)&lt;/code&gt; 返回第一个不是 NULL 的值。&lt;/p&gt;
&lt;h2&gt;字符串&lt;/h2&gt;
&lt;p&gt;连接字符串用 &lt;code&gt;CONCAT&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT CONCAT(last_name, &apos;, &apos;, first_name) AS full_name
FROM employee;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果某一段是 NULL，整个 &lt;code&gt;CONCAT&lt;/code&gt; 的结果也是 NULL。可以用 &lt;code&gt;COALESCE&lt;/code&gt; 把 NULL 换成空字符串：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CONCAT(last_name, &apos;, &apos;, COALESCE(middle_name, &apos;&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&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;CHAR_LENGTH(s)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SUBSTRING(s FROM start FOR len)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;截取，起点从 1 开始&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UPPER(s)&lt;/code&gt; / &lt;code&gt;LOWER(s)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;大小写&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;SUBSTRING(&apos;abcdef&apos; FROM 2 FOR 3)  -- 结果是 bcd
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/data-types.html&quot;&gt;MySQL 26.7 · Data Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/date-and-time-types.html&quot;&gt;MySQL 26.7 · Date and Time Types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/cast-functions.html#function_cast&quot;&gt;MySQL 26.7 · CAST&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/string-functions.html&quot;&gt;MySQL 26.7 · String Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/comparison-operators.html#function_coalesce&quot;&gt;MySQL 26.7 · COALESCE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (2)</title><link>https://blog.chuwu.top/posts/python/python2/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python2/</guid><description>变量与赋值、可变与不可变、六种内置类型、bool 与 int、type 与 id、类型转换、算术/比较/赋值/位/逻辑/成员/身份运算符、优先级</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;变量与赋值&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;x = 10
x = &quot;hello&quot;   # 合法：同一个变量可以先后指向不同类型
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python 中的变量不需要声明类型。同一个变量可以先后指向不同类型的对象。&lt;code&gt;=&lt;/code&gt; 将变量名指向一个对象。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a, b = 1, 2
a, b = b, a          # 交换
x = y = []           # 两个变量指向同一个列表，修改其中一个，另一个也会变化
x, y = [], []        # 两个独立的空列表
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;+=&lt;/code&gt;、&lt;code&gt;-=&lt;/code&gt; 等是增强赋值运算符。对可变对象，增强赋值可能原地修改对象。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0 &amp;lt; x &amp;lt; 10&lt;/code&gt; 可以这么写，等价于 &lt;code&gt;0 &amp;lt; x and x &amp;lt; 10&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;可变与不可变&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html&quot;&gt;Built-in Types&lt;/a&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&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;int&lt;/code&gt; &lt;code&gt;float&lt;/code&gt; &lt;code&gt;complex&lt;/code&gt; &lt;code&gt;bool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt; &lt;code&gt;bytes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dict&lt;/code&gt; &lt;code&gt;set&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tuple&lt;/code&gt;（容器本身不可变；元素若是 list 仍可改内容）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bytearray&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;不可变对象的内容不能原地修改；重新赋值会创建新对象。可变对象可以原地修改，通过其他变量也能看到变化。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;s = &quot;hello&quot;
# s[0] = &quot;H&quot;        # TypeError：str 不可变
s = &quot;Hello&quot;         # 新字符串，变量 s 指向新对象

lst = [1, 2, 3]
lst.append(4)       # 原地改，id(lst) 不变
other = lst
other.append(5)
print(lst)          # [1, 2, 3, 4, 5] —— 同一对象
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;tuple&lt;/code&gt; 本身不可变，但其中的可变元素（如 list）仍可以修改内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;t = ([1, 2], 3)
t[0].append(3)      # 合法
# t[0] = [9]        # TypeError：不能替换 tuple 的元素
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;六种内置类型（总览）&lt;/h2&gt;
&lt;p&gt;Python 常用内置类型如下（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html&quot;&gt;Built-in Types&lt;/a&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;strong&gt;数字&lt;/strong&gt; &lt;code&gt;int&lt;/code&gt; / &lt;code&gt;float&lt;/code&gt; / &lt;code&gt;complex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;42&lt;/code&gt; &lt;code&gt;3.14&lt;/code&gt; &lt;code&gt;1+2j&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;任意精度整数、浮点、复数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;字符串&lt;/strong&gt; &lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&apos;hi&apos;&lt;/code&gt; &lt;code&gt;&quot;你好&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不可变文本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;列表&lt;/strong&gt; &lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 2, 3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;有序、可变&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;元组&lt;/strong&gt; &lt;code&gt;tuple&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(1, 2)&lt;/code&gt; &lt;code&gt;(1,)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;有序、不可变；单元素要逗号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;字典&lt;/strong&gt; &lt;code&gt;dict&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&apos;a&apos;: 1}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;键值对；空的是 &lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;集合&lt;/strong&gt; &lt;code&gt;set&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{1, 2, 3}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素不重复；空集合写 &lt;code&gt;set()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;此外还有 &lt;code&gt;bool&lt;/code&gt;、&lt;code&gt;NoneType&lt;/code&gt;（唯一值 &lt;code&gt;None&lt;/code&gt;）、&lt;code&gt;bytes&lt;/code&gt; / &lt;code&gt;bytearray&lt;/code&gt; 等。&lt;/p&gt;
&lt;p&gt;用内置函数探测类型：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type(42)            # &amp;lt;class &apos;int&apos;&amp;gt;
type([]) is list    # True
isinstance(3.0, int)  # False
isinstance(True, int) # True
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;bool 是 int 的子类&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;True&lt;/code&gt; / &lt;code&gt;False&lt;/code&gt; 是 &lt;code&gt;bool&lt;/code&gt; 类型的两个实例；&lt;code&gt;bool&lt;/code&gt; &lt;strong&gt;继承自&lt;/strong&gt; &lt;code&gt;int&lt;/code&gt;（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#boolean-values&quot;&gt;Boolean Type&lt;/a&gt;）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;True == 1           # True
False == 0          # True
True + True         # 2
int(True)           # 1
isinstance(False, int)  # True
type(True) is int   # False —— 类型仍是 bool
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此 &lt;code&gt;bool&lt;/code&gt; 可以参与算术。&lt;code&gt;True is 1&lt;/code&gt; 为 &lt;code&gt;False&lt;/code&gt;。空列表、空字符串在 &lt;code&gt;if&lt;/code&gt; 中视为假，见 &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#truth-value-testing&quot;&gt;Truth Value Testing&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;type 与 id&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;type(obj)&lt;/code&gt;&lt;/strong&gt;：返回对象的类型（类）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;id(obj)&lt;/code&gt;&lt;/strong&gt;：在 CPython 中通常是对象内存地址的整数，&lt;strong&gt;同一时刻&lt;/strong&gt;同一对象 id 相同；对象被回收后 id 可能复用。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;a = [1, 2]
b = a
c = [1, 2]
print(id(a) == id(b))   # True —— 同一对象
print(a is b)           # True
print(a is c)           # False —— 值相等，对象不同
print(a == c)           # True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;is&lt;/code&gt; 比较对象身份（是否为同一个对象），&lt;code&gt;==&lt;/code&gt; 比较值是否相等。判断是否为 &lt;code&gt;None&lt;/code&gt; 应使用 &lt;code&gt;x is None&lt;/code&gt;。小整数和字符串驻留可能导致 &lt;code&gt;is&lt;/code&gt; 碰巧为真，这是实现细节。&lt;/p&gt;
&lt;p&gt;:::caution
相等的整数或元组上 &lt;code&gt;is&lt;/code&gt; 有时为真，那是 &lt;strong&gt;CPython 小整数缓存等实现细节&lt;/strong&gt;。&lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#is-not&quot;&gt;Comparisons&lt;/a&gt; 的语义是：&lt;code&gt;is&lt;/code&gt; 只判断「是不是同一个对象」，相等用 &lt;code&gt;==&lt;/code&gt;。不要把 &lt;code&gt;a is b&lt;/code&gt; 当成 &lt;code&gt;a == b&lt;/code&gt; 的快捷写法。
:::&lt;/p&gt;
&lt;h2&gt;类型转换&lt;/h2&gt;
&lt;h3&gt;显式转换&lt;/h3&gt;
&lt;p&gt;内置构造函数即转换函数（&lt;a href=&quot;https://docs.python.org/3/library/functions.html&quot;&gt;Built-in Functions&lt;/a&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int(&quot;42&quot;)           # 42
int(&quot;1010&quot;, 2)      # 二进制字符串 → 10
float(&quot;3.14&quot;)
str(123)
list(&quot;abc&quot;)         # [&apos;a&apos;, &apos;b&apos;, &apos;c&apos;]
tuple([1, 2])
bool(0)             # False；非零数为 True
bool(&quot;&quot;)            # False；非空串为 True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;转换失败抛 &lt;code&gt;ValueError&lt;/code&gt;；具体规则以各类型文档为准。另外还有 &lt;code&gt;chr&lt;/code&gt; / &lt;code&gt;ord&lt;/code&gt; / &lt;code&gt;repr&lt;/code&gt; 等。&lt;strong&gt;不要&lt;/strong&gt;用 &lt;code&gt;eval&lt;/code&gt; 去「转换」不可信字符串。&lt;/p&gt;
&lt;h3&gt;隐式转换&lt;/h3&gt;
&lt;p&gt;混合数值运算时，Python 按 &lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex&quot;&gt;Numeric Types&lt;/a&gt; &lt;strong&gt;拓宽&lt;/strong&gt;类型。记忆口诀 &lt;code&gt;bool → int → float → complex&lt;/code&gt; 只描述运算结果类型；&lt;code&gt;bool&lt;/code&gt; 本身仍是 &lt;code&gt;int&lt;/code&gt; 的子类（上一节）。&lt;strong&gt;不会&lt;/strong&gt;把数字和字符串自动相加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;3 + 4.5             # 7.5，int 与 float 运算得 float
# &quot;3&quot; + 4           # TypeError
&quot;3&quot; + str(4)        # &quot;34&quot;，需显式转
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;布尔上下文（&lt;code&gt;if&lt;/code&gt; / &lt;code&gt;while&lt;/code&gt; / &lt;code&gt;and&lt;/code&gt; / &lt;code&gt;or&lt;/code&gt;）里会调用对象的&lt;strong&gt;真值测试&lt;/strong&gt;，不是把 &lt;code&gt;int&lt;/code&gt; 转成 &lt;code&gt;bool&lt;/code&gt; 再存回变量。&lt;/p&gt;
&lt;h2&gt;del 语句&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#the-del-statement&quot;&gt;&lt;code&gt;del&lt;/code&gt;&lt;/a&gt; 是语句，不是函数。常见用法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x = 1
del x              # 删除变量，再访问 x 会 NameError
lst = [1, 2, 3]
del lst[0]         # 删下标 0，后面元素前移 → [2, 3]
del lst[1:]        # 删切片，lst 变成 [2]
d = {&quot;a&quot;: 1}
del d[&quot;a&quot;]         # 删键 &quot;a&quot;；键不存在则 KeyError
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;bytes&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#binary-sequence-types&quot;&gt;Binary Sequence Types&lt;/a&gt;：&lt;code&gt;bytes&lt;/code&gt; 不可变，元素是 0–255 的整数；&lt;code&gt;bytearray&lt;/code&gt; 可变。字面量 &lt;code&gt;b&quot;hello&quot;&lt;/code&gt;（内容须为 ASCII 或转义）。文本 ↔ 二进制：&lt;code&gt;str.encode(encoding)&lt;/code&gt; 得到 &lt;code&gt;bytes&lt;/code&gt;，&lt;code&gt;bytes.decode(encoding)&lt;/code&gt; 还原为 &lt;code&gt;str&lt;/code&gt;，编码对不上会 &lt;code&gt;UnicodeError&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;b = b&quot;hi&quot;
b[0]                # 104，不是 &apos;h&apos;
bytearray(b&quot;hi&quot;)[0] = 72
&quot;你好&quot;.encode(&quot;utf-8&quot;)   # b&apos;\xe4\xbd\xa0\xe5\xa5\xbd&apos;
b&quot;hi&quot;.decode(&quot;ascii&quot;)    # &apos;hi&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;算术运算符&lt;/h2&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;+&lt;/code&gt; &lt;code&gt;-&lt;/code&gt; &lt;code&gt;*&lt;/code&gt; &lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;加 减 乘 真除&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt; 总是 float（3/2 → 1.5）&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;/td&gt;
&lt;td&gt;向负无穷取整；&lt;code&gt;-7//3&lt;/code&gt; → &lt;code&gt;-3&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;/td&gt;
&lt;td&gt;与地板除配套：&lt;code&gt;a == (a//b)*b + (a%b)&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;/td&gt;
&lt;td&gt;右结合：&lt;code&gt;2**3**2&lt;/code&gt; → &lt;code&gt;2**(3**2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;+x&lt;/code&gt; &lt;code&gt;-x&lt;/code&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;pre&gt;&lt;code&gt;7 // 3              # 2
-7 // 3             # -3
7 % 3               # 1
2 ** 10             # 1024
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对非数字类型，&lt;code&gt;+&lt;/code&gt; 可能被重载（如 str 拼接、list 合并）；其他算术若未定义则 &lt;code&gt;TypeError&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;比较运算符&lt;/h2&gt;
&lt;p&gt;链式比较：&lt;code&gt;a &amp;lt; b &amp;lt;= c&lt;/code&gt; 等价于 &lt;code&gt;a &amp;lt; b and b &amp;lt;= c&lt;/code&gt;，且 &lt;strong&gt;&lt;code&gt;b&lt;/code&gt; 只求值一次&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;==&lt;/code&gt; &lt;code&gt;!=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;相等 / 不等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&lt;/code&gt; &lt;code&gt;&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;=&lt;/code&gt; &lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;大小（同类型或可比协议）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;不同类型比较是否合法、如何比，以 &lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#comparisons&quot;&gt;Comparisons&lt;/a&gt; 与具体类型为准；不要依赖 Python 2 的旧规则。&lt;/p&gt;
&lt;h2&gt;赋值与增强赋值&lt;/h2&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;x = expr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;名字绑定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x += y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x = x.__iadd__(y)&lt;/code&gt; 或回退到 &lt;code&gt;x = x + y&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x //= y&lt;/code&gt; &lt;code&gt;x **= y&lt;/code&gt; 等&lt;/td&gt;
&lt;td&gt;同理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对&lt;strong&gt;不可变&lt;/strong&gt;对象，&lt;code&gt;+=&lt;/code&gt; 通常创建新对象再绑定；对 &lt;strong&gt;list&lt;/strong&gt; 等，&lt;code&gt;+=&lt;/code&gt; 往往&lt;strong&gt;原地&lt;/strong&gt;扩展（&lt;code&gt;extend&lt;/code&gt;）。若需要新列表，用 &lt;code&gt;x = x + y&lt;/code&gt; 或切片复制，别假设所有类型行为一致。&lt;/p&gt;
&lt;p&gt;海象运算符 &lt;code&gt;:=&lt;/code&gt;（&lt;a href=&quot;https://peps.python.org/pep-0572/&quot;&gt;PEP 572&lt;/a&gt;）在表达式内赋值。&lt;/p&gt;
&lt;h2&gt;逻辑运算符&lt;/h2&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;and&lt;/code&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;or&lt;/code&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;not&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;逻辑非&lt;/td&gt;
&lt;td&gt;返回 &lt;code&gt;True&lt;/code&gt;/&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;0 and 99            # 0（不是 False，是操作数本身）
&quot;&quot; or &quot;default&quot;     # &quot;default&quot;
not []              # True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;逻辑运算返回的是&lt;strong&gt;操作数对象&lt;/strong&gt;，不一定是 &lt;code&gt;bool&lt;/code&gt;；条件语句里再按真值规则解释。&lt;/p&gt;
&lt;h2&gt;成员与身份运算符&lt;/h2&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;in&lt;/code&gt; / &lt;code&gt;not in&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;成员测试（序列、映射、集合）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;is&lt;/code&gt; / &lt;code&gt;is not&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否同一对象（比较 &lt;code&gt;id&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;&quot;a&quot; in &quot;abc&quot;        # True
1 in {1, 2}         # True
x is None
x is not y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;==&lt;/code&gt; 与 &lt;code&gt;is&lt;/code&gt; 勿混：小整数缓存等实现细节&lt;strong&gt;不应&lt;/strong&gt;依赖 &lt;code&gt;a is b&lt;/code&gt; 代替 &lt;code&gt;a == b&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;位运算符&lt;/h2&gt;
&lt;p&gt;作用于整数二进制位（&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#bitwise-operations-on-integer-types&quot;&gt;Bitwise operations&lt;/a&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;&amp;amp;&lt;/code&gt; &lt;code&gt;|&lt;/code&gt; &lt;code&gt;^&lt;/code&gt;&lt;/td&gt;
&lt;td&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;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;左移、右移&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;0b1010 &amp;amp; 0b1100    # 0b1000 → 8
1 &amp;lt;&amp;lt; 4              # 16
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;bool&lt;/code&gt; 参与位运算会先当 &lt;code&gt;0&lt;/code&gt;/&lt;code&gt;1&lt;/code&gt; 用。读标志位、权限掩码时会碰到。&lt;/p&gt;
&lt;h2&gt;运算符优先级&lt;/h2&gt;
&lt;p&gt;表达式求值顺序见 &lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#operator-precedence&quot;&gt;Operator precedence&lt;/a&gt;。记不住时加括号。官方从高到低（同级除 &lt;code&gt;**&lt;/code&gt; 外从左到右；&lt;code&gt;**&lt;/code&gt; 右结合，且&lt;strong&gt;高于&lt;/strong&gt;左侧的一元 &lt;code&gt;+&lt;/code&gt;/&lt;code&gt;-&lt;/code&gt;/&lt;code&gt;~&lt;/code&gt;，所以 &lt;code&gt;-2**2&lt;/code&gt; 是 &lt;code&gt;-4&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;/td&gt;
&lt;td&gt;&lt;code&gt;(…)&lt;/code&gt; &lt;code&gt;x[i]&lt;/code&gt; &lt;code&gt;x()&lt;/code&gt; &lt;code&gt;x.attr&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;幂&lt;/td&gt;
&lt;td&gt;&lt;code&gt;**&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一元算术 / 位&lt;/td&gt;
&lt;td&gt;&lt;code&gt;+x&lt;/code&gt; &lt;code&gt;-x&lt;/code&gt; &lt;code&gt;~x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;乘除模&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt; &lt;code&gt;@&lt;/code&gt; &lt;code&gt;/&lt;/code&gt; &lt;code&gt;//&lt;/code&gt; &lt;code&gt;%&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;加减&lt;/td&gt;
&lt;td&gt;&lt;code&gt;+&lt;/code&gt; &lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;移位&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;位与&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;位异或&lt;/td&gt;
&lt;td&gt;&lt;code&gt;^&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;位或&lt;/td&gt;
&lt;td&gt;&lt;code&gt;|&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;比较、成员、身份&lt;/td&gt;
&lt;td&gt;&lt;code&gt;==&lt;/code&gt; &lt;code&gt;in&lt;/code&gt; &lt;code&gt;is&lt;/code&gt; 等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;逻辑非&lt;/td&gt;
&lt;td&gt;&lt;code&gt;not x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;逻辑与&lt;/td&gt;
&lt;td&gt;&lt;code&gt;and&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;逻辑或&lt;/td&gt;
&lt;td&gt;&lt;code&gt;or&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;条件表达式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x if c else y&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lambda&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lambda&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;海象&lt;/td&gt;
&lt;td&gt;&lt;code&gt;:=&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;2 + 3 * 4           # 14，不是 20
(not False) and True
2 ** 3 ** 2         # 512，即 2 ** (3 ** 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：内置类型速查&lt;/h2&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;type(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;isinstance(x, cls)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否该类型（含子类）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对象标识&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;len(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;长度（有 &lt;code&gt;__len__&lt;/code&gt; 的对象）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hash(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;哈希值（可哈希对象）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;参数形式以 &lt;a href=&quot;https://docs.python.org/3/library/functions.html&quot;&gt;Built-in Functions&lt;/a&gt; 为准。另见 &lt;code&gt;round()&lt;/code&gt; &lt;code&gt;abs()&lt;/code&gt; &lt;code&gt;divmod()&lt;/code&gt;。&lt;strong&gt;&lt;code&gt;eval&lt;/code&gt; 会执行代码，不要对不可信输入使用。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;常见构造函数：| 函数 | 作用 |
| --- | --- |
| &lt;code&gt;int&lt;/code&gt; &lt;code&gt;float&lt;/code&gt; &lt;code&gt;complex&lt;/code&gt; | 数值 |
| &lt;code&gt;str&lt;/code&gt; &lt;code&gt;repr&lt;/code&gt; &lt;code&gt;ascii&lt;/code&gt; | 文本 / 可打印表示 |
| &lt;code&gt;chr&lt;/code&gt; / &lt;code&gt;ord&lt;/code&gt; | 码点 ↔ 单字符 |
| &lt;code&gt;bin&lt;/code&gt; &lt;code&gt;oct&lt;/code&gt; &lt;code&gt;hex&lt;/code&gt; | 整数 → 带前缀的进制字符串 |
| &lt;code&gt;list&lt;/code&gt; &lt;code&gt;tuple&lt;/code&gt; &lt;code&gt;set&lt;/code&gt; &lt;code&gt;frozenset&lt;/code&gt; | 从可迭代对象构造 |
| &lt;code&gt;dict&lt;/code&gt; | 从键值对可迭代对象或关键字参数构造 |
| &lt;code&gt;bytes&lt;/code&gt; &lt;code&gt;bytearray&lt;/code&gt; &lt;code&gt;memoryview&lt;/code&gt; | 二进制视图 |
| &lt;code&gt;bool&lt;/code&gt; | 真值测试 |&lt;/p&gt;
&lt;h2&gt;附录：运算符一览&lt;/h2&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;code&gt;+&lt;/code&gt; &lt;code&gt;-&lt;/code&gt; &lt;code&gt;*&lt;/code&gt; &lt;code&gt;/&lt;/code&gt; &lt;code&gt;//&lt;/code&gt; &lt;code&gt;%&lt;/code&gt; &lt;code&gt;**&lt;/code&gt; &lt;code&gt;@&lt;/code&gt;（矩阵乘，NumPy 等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;比较&lt;/td&gt;
&lt;td&gt;&lt;code&gt;==&lt;/code&gt; &lt;code&gt;!=&lt;/code&gt; &lt;code&gt;&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;&lt;/code&gt; &lt;code&gt;&amp;gt;=&lt;/code&gt; &lt;code&gt;&amp;lt;=&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;赋值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;=&lt;/code&gt; &lt;code&gt;+=&lt;/code&gt; &lt;code&gt;-=&lt;/code&gt; … &lt;code&gt;:=&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;逻辑&lt;/td&gt;
&lt;td&gt;&lt;code&gt;and&lt;/code&gt; &lt;code&gt;or&lt;/code&gt; &lt;code&gt;not&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;位&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; &lt;code&gt;|&lt;/code&gt; &lt;code&gt;^&lt;/code&gt; &lt;code&gt;~&lt;/code&gt; &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成员&lt;/td&gt;
&lt;td&gt;&lt;code&gt;in&lt;/code&gt; &lt;code&gt;not in&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;身份&lt;/td&gt;
&lt;td&gt;&lt;code&gt;is&lt;/code&gt; &lt;code&gt;is not&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/introduction.html&quot;&gt;An Informal Introduction to Python&lt;/a&gt; — 数字、字符串入门示例&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html&quot;&gt;Built-in Types&lt;/a&gt; — 类型分类、可变/不可变、真值测试&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html&quot;&gt;Built-in Functions&lt;/a&gt; — &lt;code&gt;int&lt;/code&gt; / &lt;code&gt;float&lt;/code&gt; / &lt;code&gt;str&lt;/code&gt; / &lt;code&gt;bool&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#operator-precedence&quot;&gt;Operator precedence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#assignment-statements&quot;&gt;Assignment statements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/expressions.html#comparisons&quot;&gt;Comparisons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#truth-value-testing&quot;&gt;Truth Value Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#the-del-statement&quot;&gt;The del statement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/stdtypes.html#binary-sequence-types&quot;&gt;Binary Sequence Types&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PEP：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0572/&quot;&gt;PEP 572 — Assignment Expressions&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-data-type.html&quot;&gt;菜鸟教程 · 数据类型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-type-conversion.html&quot;&gt;菜鸟教程 · 数据类型转换&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-basic-operators.html&quot;&gt;菜鸟教程 · 运算符&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>MySQL学习笔记 (1)</title><link>https://blog.chuwu.top/posts/sql/mysql1/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/sql/mysql1/</guid><description>SQL 简介、登录、语句、术语、E-R 图、注释、NULL</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 MySQL 26.7。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/&quot;&gt;参考手册&lt;/a&gt;
:::&lt;/p&gt;
&lt;h2&gt;SQL 是什么&lt;/h2&gt;
&lt;p&gt;SQL 指结构化查询语言，全称 Structured Query Language。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL 用来访问和处理数据库。&lt;/li&gt;
&lt;li&gt;SQL 可以查询、插入、更新和删除数据。&lt;/li&gt;
&lt;li&gt;SQL 可以创建数据库和表。&lt;/li&gt;
&lt;li&gt;SQL 由 ANSI / ISO 标准化。现行标准是 &lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075&lt;/a&gt;（SQL:2023）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本机是 &lt;strong&gt;MySQL Community Server 26.7.0&lt;/strong&gt;。版本号是日历制：&lt;code&gt;年.月.补丁&lt;/code&gt;。&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/mysql-nutshell.html&quot;&gt;版本说明&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不同数据库对 SQL 的支持不完全一样，但 &lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt;、&lt;code&gt;CREATE TABLE&lt;/code&gt; 这些命令用法相近。&lt;/p&gt;
&lt;h2&gt;SQL 能做什么&lt;/h2&gt;
&lt;ul&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;li&gt;在数据库中创建视图&lt;/li&gt;
&lt;li&gt;设置表的权限&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;RDBMS&lt;/h2&gt;
&lt;p&gt;RDBMS 指关系型数据库管理系统（Relational Database Management System）。&lt;/p&gt;
&lt;p&gt;数据存放在表里。表由列和行组成：一列是一个字段，一行是一条记录。&lt;/p&gt;
&lt;p&gt;MySQL、PostgreSQL、SQLite 都属于 RDBMS。&lt;/p&gt;
&lt;h2&gt;登录&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;mysql -u root -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以写成 &lt;code&gt;mysql -V&lt;/code&gt;（大写 V）。远程连接加上 &lt;code&gt;-h 主机&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;SQL 语句&lt;/h2&gt;
&lt;p&gt;大部分工作都由 SQL 语句完成。语句通常以分号结束。&lt;/p&gt;
&lt;p&gt;下面的语句从 &lt;code&gt;employee&lt;/code&gt; 表选取 &lt;code&gt;last_name&lt;/code&gt; 和 &lt;code&gt;hire_date&lt;/code&gt; 列：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT last_name, hire_date
FROM   employee
WHERE  dept_no = &apos;D01&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SQL 对大小写不敏感：&lt;code&gt;SELECT&lt;/code&gt; 与 &lt;code&gt;select&lt;/code&gt; 相同。&lt;/p&gt;
&lt;p&gt;字符串用单引号。字符串里的单引号要写两个：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT &apos;O&apos;&apos;Brien&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;表名、列名建议用小写字母、数字和下划线，不要用空格。&lt;/p&gt;
&lt;h2&gt;一些最重要的 SQL 命令&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SELECT&lt;/code&gt; - 从数据库中提取数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UPDATE&lt;/code&gt; - 更新数据库中的数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE&lt;/code&gt; - 从数据库中删除数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INSERT INTO&lt;/code&gt; - 向数据库中插入新数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATE SCHEMA&lt;/code&gt; - 创建新数据库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATE TABLE&lt;/code&gt; - 创建新表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ALTER TABLE&lt;/code&gt; - 修改表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DROP TABLE&lt;/code&gt; - 删除表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATE INDEX&lt;/code&gt; - 创建索引&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DROP INDEX&lt;/code&gt; - 删除索引&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按功能也可以分成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DDL&lt;/strong&gt;（数据定义）：&lt;code&gt;CREATE&lt;/code&gt; / &lt;code&gt;ALTER&lt;/code&gt; / &lt;code&gt;DROP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DML&lt;/strong&gt;（数据操纵）：&lt;code&gt;SELECT&lt;/code&gt; / &lt;code&gt;INSERT&lt;/code&gt; / &lt;code&gt;UPDATE&lt;/code&gt; / &lt;code&gt;DELETE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DCL&lt;/strong&gt;（数据控制）：&lt;code&gt;GRANT&lt;/code&gt; / &lt;code&gt;REVOKE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事务&lt;/strong&gt;：&lt;code&gt;START TRANSACTION&lt;/code&gt; / &lt;code&gt;COMMIT&lt;/code&gt; / &lt;code&gt;ROLLBACK&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&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;数据库（DB）&lt;/strong&gt;：有组织、可共享的数据集合。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库管理系统（DBMS）&lt;/strong&gt;：管理数据库的软件，例如 MySQL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库系统（DBS）&lt;/strong&gt;：数据库、DBMS、应用程序和数据库管理员合在一起。&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;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;td&gt;列加上行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&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;/td&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;/td&gt;
&lt;td&gt;某一格里的值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&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;strong&gt;主键&lt;/strong&gt;：用来标识一行，不能重复，也不能是 NULL。&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;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;h2&gt;E-R 图&lt;/h2&gt;
&lt;p&gt;E-R 图用来画实体和它们之间的联系，再对应到表。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/E-R%E5%9B%BE1.webp&quot; alt=&quot;E-R 图&quot; /&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;li&gt;&lt;strong&gt;联系&lt;/strong&gt;：菱形，边上标注 &lt;code&gt;1:1&lt;/code&gt;、&lt;code&gt;1:n&lt;/code&gt;、&lt;code&gt;m:n&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：学生、课程、教师、院系。多对多关系用一张单独的表来存放。&lt;/p&gt;
&lt;p&gt;逻辑模型还有层次、网状、关系三种。关系数据库用二维表表示实体和联系：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E9%80%BB%E8%BE%91%E6%A8%A1%E5%9E%8B.webp&quot; alt=&quot;逻辑模型&quot; /&gt;&lt;/p&gt;
&lt;p&gt;表头是列名，一行是一条记录，格子里的值必须符合该列的类型。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E8%A1%A8%E6%A0%BC%E7%A4%BA%E4%BE%8B.webp&quot; alt=&quot;表格示例&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;注释&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;-- 单行注释（-- 后面要有空格）
SELECT 1;  -- 行尾注释

/* 多行注释 */
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;NULL&lt;/h2&gt;
&lt;p&gt;NULL 表示缺少值，不是 &lt;code&gt;0&lt;/code&gt;，也不是空字符串 &lt;code&gt;&apos;&apos;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;判断是否为 NULL，要用 &lt;code&gt;IS NULL&lt;/code&gt; / &lt;code&gt;IS NOT NULL&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT * FROM employee WHERE salary IS NULL;
SELECT * FROM employee WHERE salary IS NOT NULL;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;code&gt;WHERE salary = NULL&lt;/code&gt; 不会找出空值。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/compatibility.html&quot;&gt;MySQL 26.7 · SQL Standards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/sql-statements.html&quot;&gt;MySQL 26.7 · SQL Statement Syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/language-structure.html&quot;&gt;MySQL 26.7 · Language Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/working-with-null.html&quot;&gt;MySQL 26.7 · Working with NULL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/26.7/en/mysql-nutshell.html&quot;&gt;MySQL 26.7 · What Is New&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/76583.html&quot;&gt;ISO/IEC 9075（SQL:2023）&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Python 札记 (1)</title><link>https://blog.chuwu.top/posts/python/python1/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/python/python1/</guid><description>解释器、print、缩进、注释、编码与标识符</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
基于 Python 3。
:::&lt;/p&gt;
&lt;h2&gt;解释器&lt;/h2&gt;
&lt;p&gt;在终端输入 &lt;code&gt;python3&lt;/code&gt;（Windows 常用 &lt;code&gt;py&lt;/code&gt;）进入交互式编程，提示符为 &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print(&quot;Hello, Python!&quot;)
Hello, Python!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;退出使用 &lt;code&gt;quit()&lt;/code&gt;。Unix 上也可用 &lt;code&gt;Ctrl+D&lt;/code&gt;，Windows 上可用 &lt;code&gt;Ctrl+Z&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;将代码保存为 &lt;code&gt;hello.py&lt;/code&gt; 后执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 hello.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还可以使用 &lt;code&gt;python -c&lt;/code&gt;、&lt;code&gt;python -m&lt;/code&gt;。以 &lt;code&gt;python 文件.py&lt;/code&gt; 运行时，文件开头的 &lt;code&gt;#!/usr/bin/env python3&lt;/code&gt; 会被忽略。[^shebang]&lt;/p&gt;
&lt;p&gt;详见 &lt;a href=&quot;https://docs.python.org/3/tutorial/interpreter.html&quot;&gt;Using the Python Interpreter&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;print&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;Hello, Python!&quot;)
print(1, 2, 3, sep=&quot;@&quot;)  # 1@2@3
print(&quot;a&quot;, end=&quot; &quot;)
print(&quot;b&quot;)               # a b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;print&lt;/code&gt; 默认以空格分隔参数，并以换行结尾。&lt;code&gt;sep&lt;/code&gt; 指定分隔符，&lt;code&gt;end&lt;/code&gt; 指定结尾。&lt;a href=&quot;https://docs.python.org/3/library/functions.html#print&quot;&gt;print()&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;input(&quot;提示&quot;)&lt;/code&gt; 读取一行输入，返回字符串。&lt;/p&gt;
&lt;h2&gt;缩进&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;if True:
    print(&quot;True&quot;)
else:
    print(&quot;False&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python 使用缩进表示代码块，不使用 &lt;code&gt;{}&lt;/code&gt;。&lt;a href=&quot;https://peps.python.org/pep-0008/#indentation&quot;&gt;PEP 8&lt;/a&gt; 建议使用 &lt;strong&gt;4 个空格&lt;/strong&gt;，不要与 Tab 混用，否则会触发 &lt;code&gt;TabError&lt;/code&gt;。缩进不一致会触发 &lt;code&gt;IndentationError&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt;、&lt;code&gt;for&lt;/code&gt;、&lt;code&gt;def&lt;/code&gt; 等语句以冒号结尾，其后缩进的语句构成一个代码块。空代码块使用 &lt;code&gt;pass&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;多行&lt;/h2&gt;
&lt;p&gt;圆括号、方括号、花括号内可以直接换行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;total = [
    &quot;item_one&quot;,
    &quot;item_two&quot;,
    &quot;item_three&quot;,
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;行末也可以使用 &lt;code&gt;\&lt;/code&gt; 续行。&lt;/p&gt;
&lt;h2&gt;注释&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 整行注释
print(&quot;Hello, Python!&quot;)  # 行尾注释
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;#&lt;/code&gt; 之后到行末为注释。字符串中的 &lt;code&gt;#&lt;/code&gt; 不是注释。[^comment]&lt;/p&gt;
&lt;p&gt;三引号 &lt;code&gt;&apos;&apos;&apos;&lt;/code&gt; / &lt;code&gt;&quot;&quot;&quot;&lt;/code&gt; 用来表示字符串。单独出现的三引号字符串常被用作多行注释，但不能嵌套。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def add(a, b):
    &quot;&quot;&quot;返回两数之和。&quot;&quot;&quot;
    return a + b

print(add.__doc__)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数、模块或类的体中第一条语句如果是字符串，该字符串会保存到 &lt;code&gt;__doc__&lt;/code&gt;，称为文档字符串。&lt;a href=&quot;https://peps.python.org/pep-0257/&quot;&gt;PEP 257&lt;/a&gt; 建议使用 &lt;code&gt;&quot;&quot;&quot;&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;编码&lt;/h2&gt;
&lt;p&gt;默认情况下，Python 3 源文件以 &lt;strong&gt;UTF-8&lt;/strong&gt; 编码，可以直接使用中文：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(&quot;你好&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通常无需编写编码声明。若要指定其他编码，声明必须单独占一行，位于文件第一行；若第一行是 &lt;code&gt;#!&lt;/code&gt;，则放在第二行（&lt;a href=&quot;https://peps.python.org/pep-0263/&quot;&gt;PEP 263&lt;/a&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# -*- coding: utf-8 -*-
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;标识符&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;age = 25
user_name = &quot;Alice&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一个字符必须是字母或下划线，其余可以是字母、数字或下划线。标识符区分大小写，不能使用保留关键字（如 &lt;code&gt;class&lt;/code&gt;、&lt;code&gt;if&lt;/code&gt;）。Python 3 允许使用中文、&lt;code&gt;π&lt;/code&gt; 等 Unicode 字符。可用 &lt;code&gt;keyword.iskeyword()&lt;/code&gt; 判断是否为关键字。[^kw]&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0008/&quot;&gt;PEP 8&lt;/a&gt;：变量和函数使用 &lt;code&gt;snake_case&lt;/code&gt;，类名使用 &lt;code&gt;PascalCase&lt;/code&gt;。单下划线开头（如 &lt;code&gt;_total&lt;/code&gt;）通常表示内部使用；全大写（如 &lt;code&gt;MAX_SIZE&lt;/code&gt;）通常表示常量。双下划线开头会触发名称改写。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;附录：保留关键字&lt;/h2&gt;
&lt;p&gt;当前版本的关键字列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import keyword
print(keyword.kwlist)
&lt;/code&gt;&lt;/pre&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;code&gt;True&lt;/code&gt; &lt;code&gt;False&lt;/code&gt; &lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;逻辑&lt;/td&gt;
&lt;td&gt;&lt;code&gt;and&lt;/code&gt; &lt;code&gt;or&lt;/code&gt; &lt;code&gt;not&lt;/code&gt; &lt;code&gt;is&lt;/code&gt; &lt;code&gt;in&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;条件&lt;/td&gt;
&lt;td&gt;&lt;code&gt;if&lt;/code&gt; &lt;code&gt;elif&lt;/code&gt; &lt;code&gt;else&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;循环&lt;/td&gt;
&lt;td&gt;&lt;code&gt;for&lt;/code&gt; &lt;code&gt;while&lt;/code&gt; &lt;code&gt;break&lt;/code&gt; &lt;code&gt;continue&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;异常&lt;/td&gt;
&lt;td&gt;&lt;code&gt;try&lt;/code&gt; &lt;code&gt;except&lt;/code&gt; &lt;code&gt;finally&lt;/code&gt; &lt;code&gt;raise&lt;/code&gt; &lt;code&gt;assert&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;函数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;def&lt;/code&gt; &lt;code&gt;return&lt;/code&gt; &lt;code&gt;lambda&lt;/code&gt; &lt;code&gt;yield&lt;/code&gt; &lt;code&gt;pass&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类&lt;/td&gt;
&lt;td&gt;&lt;code&gt;class&lt;/code&gt; &lt;code&gt;del&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模块&lt;/td&gt;
&lt;td&gt;&lt;code&gt;import&lt;/code&gt; &lt;code&gt;from&lt;/code&gt; &lt;code&gt;as&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;作用域&lt;/td&gt;
&lt;td&gt;&lt;code&gt;global&lt;/code&gt; &lt;code&gt;nonlocal&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;异步&lt;/td&gt;
&lt;td&gt;&lt;code&gt;async&lt;/code&gt; &lt;code&gt;await&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;资源&lt;/td&gt;
&lt;td&gt;&lt;code&gt;with&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;3.9 起 &lt;code&gt;match&lt;/code&gt; / &lt;code&gt;case&lt;/code&gt; / &lt;code&gt;type&lt;/code&gt; 是 soft keyword，只在特定语法位置保留。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;del&lt;/code&gt; 既是关键字，也是&lt;a href=&quot;https://docs.python.org/3/reference/simple_stmts.html#the-del-statement&quot;&gt;删除语句&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;官方文档（&lt;a href=&quot;https://docs.python.org/zh-cn/3/&quot;&gt;中文版&lt;/a&gt;）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/tutorial/interpreter.html&quot;&gt;Using the Python Interpreter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/lexical_analysis.html&quot;&gt;Lexical analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/reference/compound_stmts.html&quot;&gt;Compound statements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/keyword.html&quot;&gt;keyword&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#print&quot;&gt;print()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/3/howto/unicode.html&quot;&gt;Unicode HOWTO&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PEP：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0008/&quot;&gt;PEP 8 — Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0257/&quot;&gt;PEP 257 — Docstring Conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0263/&quot;&gt;PEP 263 — Defining Python Source Code Encodings&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;菜鸟教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-basic-syntax.html&quot;&gt;菜鸟教程 · 基础语法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-comment.html&quot;&gt;菜鸟教程 · 注释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.runoob.com/python3/python3-interpreter.html&quot;&gt;菜鸟教程 · 解释器&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;[^shebang]: Unix 可执行脚本依赖 shebang；Windows 主要靠文件关联和 &lt;code&gt;py&lt;/code&gt; 启动器。
[^kw]: 硬关键字当变量名是 &lt;code&gt;SyntaxError&lt;/code&gt;。
[^comment]: 词法分析里注释从 &lt;code&gt;#&lt;/code&gt; 到物理行结束，不含字符串内的井号。&lt;/p&gt;
</content:encoded></item><item><title>Hello 2026！</title><link>https://blog.chuwu.top/posts/2025-12-31/hello_2026/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2025-12-31/hello_2026/</guid><description>又过了一年，来到了2025的最后一天，Hello 2026！</description><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&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;总之，2026年我会继续努力，努力成为一个更好的人。&lt;/p&gt;
&lt;p&gt;希望大家都好!&lt;/p&gt;
&lt;p&gt;爱你，也爱自己。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;:::tip
下面是原图
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/Snow.webp&quot; alt=&quot;Snow&quot; /&gt;
&lt;img src=&quot;./images/Snow2.webp&quot; alt=&quot;Snow2&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>CAN 通信协议</title><link>https://blog.chuwu.top/posts/2025-11-03/can/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2025-11-03/can/</guid><description>CAN 通信协议不完全指北, 包括物理层特征、协议核心机制、帧结构、编程开发</description><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;hr /&gt;
&lt;h2&gt;CAN Protocols - BOSCH (控制器局域网络协议)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CAN 通信, 全称: &lt;strong&gt;控制器局域网 (Controller Area Network)&lt;/strong&gt;, 是一种功能丰富的车用总线标准, 有效支持分布式控制系统的串行通信网络.&lt;/li&gt;
&lt;li&gt;CAN 数据使用&lt;strong&gt;帧结构&lt;/strong&gt;进行传输.&lt;/li&gt;
&lt;li&gt;CAN 的物理层: &lt;strong&gt;CAN-H, CAN-L&lt;/strong&gt;, 一般是&lt;strong&gt;差分信号&lt;/strong&gt;, 根据两根线上的电位差来判断总线电平, 总线电平分为&lt;strong&gt;显性电平&lt;/strong&gt;和&lt;strong&gt;隐性电平&lt;/strong&gt;, 二者必居其一, 发送方通过使总线电平发生变化, 将消息发送给接收方.&lt;/li&gt;
&lt;li&gt;CAN 总线两端有两个 $120\Omega$ 的&lt;strong&gt;终端电阻&lt;/strong&gt;, 用作阻抗匹配, 抑制信号反射.&lt;/li&gt;
&lt;li&gt;CAN &lt;strong&gt;非破坏性仲裁机制（基于标识符优先级）&lt;/strong&gt;: 多个同时的回复不会造成乱码, 高优先级消息通过, 低优先级消息被忽略.&lt;/li&gt;
&lt;li&gt;CAN &lt;strong&gt;过滤器&lt;/strong&gt;: 对特定信息进行过滤, 只接收指定的有效信息.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;特性&lt;/h2&gt;
&lt;ol&gt;
&lt;li&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;/li&gt;
&lt;li&gt;&lt;strong&gt;非破坏性仲裁&lt;/strong&gt;: 通过 &lt;strong&gt;标识符（ID）优先级&lt;/strong&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;ul&gt;
&lt;li&gt;&lt;strong&gt;无地址信息&lt;/strong&gt;: 报文基于内容 (ID) 发送, 而非地址.&lt;/li&gt;
&lt;li&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;高性能传输:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;通信速率快&lt;/strong&gt;: 最高可达 $1\text{ Mbps}$ (短距离).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信距离远&lt;/strong&gt;: 速率降低时, 最远可达 $10\text{ KM}$.&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;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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&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;连接节点数量:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;连接节点多&lt;/strong&gt;: 理论上无限制, 但实际数量受限于通信速率、总线延迟和电气负载.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;物理层特征与时序同步&lt;/h2&gt;
&lt;p&gt;CAN 协议经过 ISO 标准化后有两个标准: ISO11898 标准和 ISO11519-2 标准. 其中 ISO11898 是针对通信速率为 $125\text{ Kbps}\sim 1\text{ Mbps}$ 的高速通信标准, 而 ISO11519-2 是针对通信速率为 $125\text{ Kbps}$ 以下的低速通信标准. 这里使用 ISO11898 标准, $450\text{ Kbps}$ 的通信速率.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/CAN%E7%89%A9%E7%90%86%E5%B1%82%E7%89%B9%E5%BE%81.webp&quot; alt=&quot;CAN 物理层特征&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;位时序 (Bit Timing)&lt;/h3&gt;
&lt;p&gt;位时序是实现 CAN 网络同步的核心机制. 它将一个&lt;strong&gt;位时间 (Bit Time)&lt;/strong&gt; 分解为 4 个时间段, 每个时间段由若干个&lt;strong&gt;时间量子 (Time Quantum, Tq)&lt;/strong&gt; 构成. 通过设定位时序, 可以实现多个单元同时采样, 并任意设定采样点. 由发送单元在非同步的情况下发送的每秒钟的位数称为&lt;strong&gt;位速率 (Bit Rate)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个位时间由以下 4 个段组成:&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;Tq 数范围&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;同步段 (SS: Synchronization Segment):&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;多个连接在总线上的单元通过此段实现时序调整, 同步进行接收和发送的工作. 由隐性到显性或由显性到隐性电平的&lt;strong&gt;边沿&lt;/strong&gt;最好出现在此段中.&lt;/td&gt;
&lt;td&gt;恒定为 &lt;strong&gt;1Tq&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;传播时间段 (PTS: Propagation Time Segment):&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用于吸收网络上的&lt;strong&gt;物理延迟&lt;/strong&gt; (包括发送单元的输出延迟、总线上传播延迟、接收单元的输入延迟) 的段.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1~8Tq&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;相位缓冲段 1 (PBS1: Phase Buffer Segment 1):&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;当信号边沿不能被包含于 SS 段中时, 可在此段进行补偿.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1~8Tq&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;相位缓冲段 2 (PBS2: Phase Buffer Segment 2):&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用于吸收细微的&lt;strong&gt;时钟误差&lt;/strong&gt;. 可通过对该段&lt;strong&gt;加减 SJW&lt;/strong&gt; (再同步补偿宽度) 来吸收误差.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2~8Tq&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键概念:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;再同步补偿宽度 (SJW: reSynchronization Jump Width):&lt;/strong&gt; SJW 是用于补偿因时钟频率偏差、传送延迟等导致的同步误差的最大值. 其 Tq 数范围为 &lt;strong&gt;1~4Tq&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;采样点 (Sampling Point):&lt;/strong&gt; 位于 &lt;strong&gt;PBS1 结束处&lt;/strong&gt;. 它是指读取总线电平, 并将读到的电平作为位值的点.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E4%BD%8D%E7%9A%84%E6%9E%84%E6%88%90.webp&quot; alt=&quot;位的构成&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::tip
上图的采样点, 是指读取总线电平, 并将读到的电平作为位值的点. 位置在 PBS1 结束处. 根据这个位时序, 可以计算 CAN 通信的波特率.
:::&lt;/p&gt;
&lt;h2&gt;协议核心机制&lt;/h2&gt;
&lt;h3&gt;CAN 总线仲裁机制&lt;/h3&gt;
&lt;p&gt;CAN 总线仲裁机制是一种基于&lt;strong&gt;标识符优先级&lt;/strong&gt;的&lt;strong&gt;非破坏性仲裁&lt;/strong&gt;机制, 确保高优先级消息能够优先使用总线.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 仲裁基础&lt;/strong&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;2. 优先级确定&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基于标识符 (ID):&lt;/strong&gt; 消息的&lt;strong&gt;标识符优先级&lt;/strong&gt;由其在仲裁段中的&lt;strong&gt;标识符 (ID)&lt;/strong&gt; 决定. ID 并不是设备的地址, 而是消息内容的标识和优先级.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优先级规则:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;显性电平 (Dominant/逻辑 0):&lt;/strong&gt; 具有优先权, 它会覆盖 &lt;strong&gt;隐性电平 (Recessive/逻辑 1).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ID 值越低 (即 ID 前导的显性电平越多):&lt;/strong&gt; 消息的优先级就越高.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 仲裁过程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E4%BB%B2%E8%A3%81%E8%BF%87%E7%A8%8B.webp&quot; alt=&quot;仲裁过程&quot; /&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;ul&gt;
&lt;li&gt;当一个单元发送&lt;strong&gt;显性电平 (Dominant)&lt;/strong&gt;, 且总线上也为显性电平, 则该单元继续发送.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续输出显性电平最多的单元&lt;/strong&gt;将获胜, 并获得总线的控制权.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仲裁失利 (退出):&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;当一个单元发送&lt;strong&gt;隐性电平 (Recessive/逻辑 1)&lt;/strong&gt;, 但同时检测到总线上是&lt;strong&gt;显性电平 (Dominant/逻辑 0)&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip
上图中, 单元 1 和单元 2 同时开始向总线发送数据, 开始部分他们的数据格式是一样的, 故无法区分优先级, 直到 T 时刻, 单元 1 输出隐性电平, 而单元 2 输出显性电平, 此时单元 1 仲裁失利, 立刻转入接收状态工作, 不再与单元 2 竞争, 而单元 2 则顺利获得总线使用权, 继续发送自己的数据. 这就实现了仲裁, 让连续发送显性电平多的单元获得总线使用权.
:::&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 结果&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仲裁段结束后, 总线上只有仲裁获胜 (标识符优先级最高) 的消息得以继续完整传输, 确保了实时性和高效性.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;消息过滤机制 (Filter)&lt;/h3&gt;
&lt;p&gt;CAN 过滤器是 CAN 控制器硬件的重要组成部分, 其核心作用在于对总线上的&lt;strong&gt;报文 ID&lt;/strong&gt; 进行高效筛选, 决定哪些报文需要被接收和处理, 哪些报文应该被丢弃.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 目的&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;减轻 CPU 负担:&lt;/strong&gt; 硬件过滤器在接收消息进入 FIFO (接收缓冲区) 之前就完成 ID 匹配, 避免 CPU 被大量无关数据中断和处理, 从而专注于业务逻辑.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高效率:&lt;/strong&gt; 确保节点只接收与其功能相关的消息, 实现了高效的数据管理.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 工作原理：筛选模式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CAN 过滤器通过两个核心参数: &lt;strong&gt;过滤器标识符寄存器 (ID Register)&lt;/strong&gt; 和 &lt;strong&gt;过滤器屏蔽寄存器 (Mask Register)&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;strong&gt;标识符列表模式 (List Mode)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;屏蔽寄存器中的位&lt;strong&gt;全部设置为不关心 (0)&lt;/strong&gt;. 过滤器寄存器中存储的是&lt;strong&gt;完整的目标 ID&lt;/strong&gt;. 只有当接收到的报文 ID 与过滤器 ID &lt;strong&gt;完全匹配&lt;/strong&gt;时才会被接收.&lt;/td&gt;
&lt;td&gt;需要精确接收少数几个固定 ID 的报文时.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;屏蔽模式 (Mask Mode)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;屏蔽寄存器中的位用于指定 ID 中&lt;strong&gt;哪些位必须匹配&lt;/strong&gt; (设置为 1), &lt;strong&gt;哪些位可以忽略&lt;/strong&gt; (设置为 0). 接收到的报文 ID 只有在&quot;必须匹配&quot;的位上与过滤器 ID 相符时才会被接收.&lt;/td&gt;
&lt;td&gt;需要接收某一&lt;strong&gt;范围 ID&lt;/strong&gt; 的报文时, 或者需要区分标准帧和扩展帧时.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;3. 硬件实现（以 STM32 bxCAN 为例）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在如 STM32 等微控制器中, CAN 控制器通常集成多达 &lt;strong&gt;28 个&lt;/strong&gt;（或更多）独立的过滤器组，这些过滤器组可以配置为:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;16 位模式:&lt;/strong&gt; 每个过滤器组可配置为两个 16 位的过滤器（可以容纳 11 位标准帧 ID 和部分功能位）.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;32 位模式:&lt;/strong&gt; 每个过滤器组可配置为一个 32 位的过滤器（可以容纳 29 位扩展帧 ID）.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每个过滤器最终都会将匹配成功的报文路由到指定的&lt;strong&gt;接收 FIFO&lt;/strong&gt;（通常是 FIFO0 或 FIFO1）中, 等待 CPU 读取.&lt;/p&gt;
&lt;h2&gt;帧结构&lt;/h2&gt;
&lt;h3&gt;CAN 协议的五种帧类型&lt;/h3&gt;
&lt;p&gt;CAN 协议通过以下 &lt;strong&gt;5 种类型&lt;/strong&gt;的帧进行通信:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据帧 (Data Frame):&lt;/strong&gt; 用于发送单元向接收单元传送数据. (有数据段)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遥控帧 (远程帧)  (Remote Frame):&lt;/strong&gt; 用于接收单元向具有相同 ID 的发送单元请求数据. (无数据段)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误帧 (Error Frame):&lt;/strong&gt; 用于当检测出错误时向其他单元通知错误.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过载帧 (Overload Frame):&lt;/strong&gt; 用于接收单元通知其尚未做好接收准备.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;帧间隔 (Interframe Space):&lt;/strong&gt; 用于将数据帧及遥控帧与前面的帧分离开来.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其中, &lt;strong&gt;数据帧&lt;/strong&gt;和&lt;strong&gt;遥控帧&lt;/strong&gt;有&lt;strong&gt;标准格式&lt;/strong&gt; (11 位标识符 ID) 和&lt;strong&gt;扩展格式&lt;/strong&gt; (29 位 ID) 两种标识符长度.&lt;/p&gt;
&lt;h3&gt;数据帧 (Data Frame) 结构&lt;/h3&gt;
&lt;p&gt;CAN 数据帧是协议中最核心的帧类型, 它由以下 &lt;strong&gt;7 个段&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;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;帧起始 (Start of Frame, SOF)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;表示数据帧开始的段.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;仲裁段 (Arbitration Field)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;表示该帧优先级的段, 包含报文的标识符 (ID), 用于总线仲裁.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;控制段 (Control Field)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;表示数据段的&lt;strong&gt;字节数&lt;/strong&gt;及保留位的段.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;数据段 (Data Field)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数据的内容, 一帧可发送 &lt;strong&gt;0 到 8 个字节&lt;/strong&gt;的数据.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CRC 段 (CRC Field)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用于检查帧的传输错误的段.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ACK 段 (Acknowledge Field)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用于表示确认正常接收的段. 接收到正确消息的单元在此段发送显性电平, 通知发送单元正常接收.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;帧结束 (End of Frame, EOF)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;表示数据帧结束的段.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E6%95%B0%E6%8D%AE%E5%B8%A7%E7%9A%84%E6%9E%84%E6%88%90.webp&quot; alt=&quot;数据帧的构成&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::tip
图中 D 表示显性电平, R 表示隐性电平 (下同)
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;帧起始 (Start of Frame, SOF):&lt;/strong&gt; 标准帧和扩展帧都是由 1 个位的显性电平表示帧起始.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仲裁段 (Arbitration Field):&lt;/strong&gt; 仲裁段, 表示数据优先级的段, 标准帧和扩展帧格式在本段有所区别.
&lt;img src=&quot;./images/%E4%BB%B2%E8%A3%81%E6%AE%B5.webp&quot; alt=&quot;仲裁段&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;标准格式的 ID 有 11 个位. 从 ID28 到 ID18 被依次发送. 禁止高 7 位都为隐性 (禁止设定: ID=1111111XXXX).&lt;/li&gt;
&lt;li&gt;扩展格式的 ID 有 29 个位. 基本 ID 从 ID28 到 ID18, 扩展 ID 由 ID17 到 ID0 表示. 基本 ID 和标准格式的 ID 相同. 禁止高 7 位都为隐性 (禁止设定: 基本 ID=1111111XXXX). 其中 RTR 位用于标识是否是远程帧 (0, 数据帧; 1, 远程帧), IDE 位为标识符选择位 (0, 使用标准标识符; 1, 使用扩展标识符), SRR 位为代替远程请求位, 为隐性位, 它代替了标准帧中的 RTR 位.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制段 (Control Field):&lt;/strong&gt; 由 6 个位构成, 表示数据段的字节数. 标准帧和扩展帧的控制段稍有不同.
&lt;img src=&quot;./images/%E6%8E%A7%E5%88%B6%E6%AE%B5.webp&quot; alt=&quot;控制段&quot; /&gt;
r0 和 r1 为保留位, 必须全部以显性电平发送, 但是接收端可以接收显性、隐性及任意组合的电平. DLC 段为数据长度表示段, 高位在前, DLC 段有效值为 0~8, 但是接收方接收到 9~15 的时候并不认为是错误.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据段 (Data Field):&lt;/strong&gt; 从最高位 (MSB) 开始输出, 标准帧和扩展帧在这个段的定义都是一样的.
&lt;img src=&quot;./images/%E6%95%B0%E6%8D%AE%E6%AE%B5.webp&quot; alt=&quot;数据段&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CRC 段 (CRC Field):&lt;/strong&gt; 用于检查帧的传输错误的段. 由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符 (用于分隔的位) 组成, 标准帧和扩展帧在这个段的格式也是相同的.
&lt;img src=&quot;./images/CRC%E6%AE%B5.webp&quot; alt=&quot;CRC 段&quot; /&gt;
此段 CRC 的值计算范围包括: 帧起始、仲裁段、控制段、数据段. 接收方以同样的算法计算 CRC 值并进行比较, 不一致时会通报错误.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACK 段 (Acknowledge Field):&lt;/strong&gt; 用于表示确认正常接收的段. 由 ACK 槽 (ACK Slot) 和 ACK 界定符 2 个位组成. 标准帧和扩展帧在这个段的格式也是相同的.
&lt;img src=&quot;./images/ACK%E6%AE%B5.webp&quot; alt=&quot;ACK 段&quot; /&gt;
发送单元的 ACK, 发送 2 个位的隐性位, 而接收到正常消息的单元在 ACK 槽 (ACK Slot) 发送显性位, 通知发送单元正常接收结束, 这个过程叫发送 ACK/返回 ACK. 发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中, 接收到正常消息的单元 (发送单元不发送 ACK). 所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;帧结束 (End of Frame, EOF):&lt;/strong&gt; 标准帧和扩展帧在这个段格式一样, 由 7 个位的隐性位组成.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;编程开发&lt;/h2&gt;
&lt;p&gt;CAN 协议的编程开发主要围绕微控制器（如 STM32）内部的 CAN 控制器模块（例如 &lt;strong&gt;bxCAN&lt;/strong&gt;）进行. 开发的核心在于&lt;strong&gt;初始化&lt;/strong&gt;和&lt;strong&gt;配置&lt;/strong&gt;控制器, 使其能够正确地与物理总线同步, 并高效地处理报文.&lt;/p&gt;
&lt;h3&gt;硬件初始化与总线配置&lt;/h3&gt;
&lt;p&gt;这是 CAN 通信开始前必须完成的基础工作, 主要使用 &lt;code&gt;CAN_InitTypeDef&lt;/code&gt; 结构体进行配置.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;时钟与 GPIO 配置:&lt;/strong&gt; 使能 CAN 控制器（如 CAN1）及相关 GPIO 口的时钟, 并配置 CAN_TX 和 CAN_RX 引脚（例如 STM32 需要配置 APB1 时钟）.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CAN 控制器初始化:&lt;/strong&gt; 设置 CAN 工作模式、自动重传、离线管理等功能, 并配置&lt;strong&gt;位时序（Bit Timing）确定所需的通信波特率&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;void CAN_Config(void)
{
    // 1. 配置 GPIO 时钟和引脚 (略)
    // 2. 配置 CAN 时钟 (略)

    CAN_InitTypeDef CAN_InitStructure;

    // CAN 模块工作参数配置
    CAN_InitStructure.CAN_TTCM = DISABLE;          // 非时间触发通信模式
    CAN_InitStructure.CAN_ABOM = ENABLE;           // 自动离线管理
    CAN_InitStructure.CAN_AWUM = ENABLE;           // 自动唤醒模式
    CAN_InitStructure.CAN_NART = DISABLE;          // 自动重传
    CAN_InitStructure.CAN_RFLM = DISABLE;          // 不锁定 FIFO
    CAN_InitStructure.CAN_TXFP = DISABLE;          // 优先级由 ID 决定

    // 工作模式选择:
    // CAN_Mode_Normal (正常模式) 或 CAN_Mode_LoopBack (回环模式)
    CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; // 示例使用回环模式进行自测

    // 位时序配置 (例如: 波特率 500Kbps)
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;        // 再同步跳转宽度 1Tq
    CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;        // 时间段 1: 8Tq
    CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;        // 时间段 2: 7Tq
    CAN_InitStructure.CAN_Prescaler = 6;           // 预分频器 (决定 Tq 长度)

    CAN_Init(CAN1, &amp;amp;CAN_InitStructure);
    // ... 后续进行过滤器配置 ...
    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); // 开启 FIFO0 接收中断
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;消息过滤机制配置&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;CAN_FilterInitTypeDef&lt;/code&gt; 结构体配置硬件过滤器, 确保接收效率.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;过滤器初始化:&lt;/strong&gt; 设置过滤器号、规模、工作模式和帧类型.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ID 和屏蔽器设置:&lt;/strong&gt; 确定接收规则（标识符列表模式或屏蔽模式）.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FIFO 绑定:&lt;/strong&gt; 指定匹配成功的报文进入哪个&lt;strong&gt;接收邮箱（FIFO0 或 FIFO1）&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// 承接上一段代码，设置过滤器结构体
CAN_FilterInitTypeDef CAN_FilterInitStructure;

CAN_FilterInitStructure.CAN_FilterNumber = 0;           // 过滤器 0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 屏蔽模式 (用于接收某一范围 ID)
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; // 32 位规模

// 过滤器 ID 寄存器: 设定目标 ID
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0120;      
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;       

// 过滤器屏蔽寄存器: 决定 ID 中哪些位必须匹配
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFF0;  
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; // 匹配消息放入 FIFO0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;      // 激活过滤器
CAN_FilterInit(&amp;amp;CAN_FilterInitStructure);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;数据发送流程&lt;/h3&gt;
&lt;p&gt;数据发送通过配置 &lt;code&gt;CanTxMsg&lt;/code&gt; 结构体和调用 &lt;code&gt;CAN_Transmit()&lt;/code&gt; 函数实现.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置发送参数:&lt;/strong&gt; 确定 ID、帧类型、数据长度（DLC, 0~8）和实际数据.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发送请求:&lt;/strong&gt; 写入空闲的发送邮箱并设置发送请求标志.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;void CAN_Send_Msg(u8 *buf, u8 len)
{
    CanTxMsg TxMessage;
    TxMessage.StdId = 0x12;              // 消息 ID
    TxMessage.ExtId = 0x00;
    TxMessage.IDE = CAN_Id_Standard;     // 标准帧
    TxMessage.RTR = CAN_RTR_Data;        // 数据帧 (非遥控帧)
    TxMessage.DLC = len;                 // 数据长度 (0-8)

    for (int i = 0; i &amp;lt; len; i++)
        TxMessage.Data[i] = buf[i];

    CAN_Transmit(CAN1, &amp;amp;TxMessage);      // 写入发送邮箱并设置发送请求
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;数据接收流程&lt;/h3&gt;
&lt;p&gt;数据接收通常通过中断方式实现, 需要配置 NVIC 并在中断服务函数（ISR）中调用 &lt;code&gt;CAN_Receive()&lt;/code&gt; 读取报文.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// CAN FIFO0 接收中断服务函数 (STM32F103 的中断向量)
void USB_LP_CAN1_RX0_IRQHandler(void)
{
    CanRxMsg RxMessage;
    if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET) // 检查 FIFO0 中是否有新消息
    {
        CAN_Receive(CAN1, CAN_FIFO0, &amp;amp;RxMessage); // 读取消息到 RxMessage 结构体

        // 在这里处理接收到的数据, 例如:
        // u32 id = RxMessage.StdId;
        // u8 data0 = RxMessage.Data[0];
        
        // 示例：将接收到的数据在 LCD 上显示 (参考文档中的逻辑)
        // LCD_ShowxNum(..., RxMessage.Data[i], ...); 
    }
    CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); // 清除中断标志位
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;模式选择&lt;/h3&gt;
&lt;p&gt;在开发和测试中, 不同的工作模式用于不同的目的:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;回环模式（LoopBack Mode）:&lt;/strong&gt; 主要用于&lt;strong&gt;自测试&lt;/strong&gt;和&lt;strong&gt;调试&lt;/strong&gt;. 在这种模式下, CAN 控制器将自己发送的消息当作接收消息立即回传给自己, 不涉及外部 CAN 收发器和物理总线.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正常模式（Normal Mode）:&lt;/strong&gt; 用于&lt;strong&gt;正常通信&lt;/strong&gt;, 此时 CAN 控制器将数据发送到总线, 并与其他节点进行交互.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静默模式（Silent Mode）:&lt;/strong&gt; 主要用于&lt;strong&gt;总线监测&lt;/strong&gt;和诊断.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;参考:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://cc.bjtu.edu.cn:81/meol/common/script/preview/download_preview.jsp?fileid=3057069&amp;amp;resid=372513&amp;amp;lid=25587&amp;amp;preview=preview&quot;&gt;STM32F1开发指南-库函数版本_V3.3&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://doc.embedfire.com/products/link/zh/latest/tutorial/ebf_stm32_stdlib_tutorial.html&quot;&gt;零死角玩转stm32&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://zh.wikipedia.org/zh-cn/%E6%8E%A7%E5%88%B6%E5%99%A8%E5%8D%80%E5%9F%9F%E7%B6%B2%E8%B7%AF&quot;&gt;Wikipedia-控制器區域網路&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>NEC 红外协议笔记</title><link>https://blog.chuwu.top/posts/2025-10-28/nec/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2025-10-28/nec/</guid><description>NEC 红外协议指北，包括编解码过程、帧结构、示例等</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;NEC Protocol - 日电&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NEC 红外协议是一种广泛应用于家用电器遥控器的红外通信协议。&lt;/li&gt;
&lt;li&gt;红外对射无法穿过障碍物：红外通信是视距 (Line of Sight) 通信，会被大部分非透明障碍物阻挡。&lt;/li&gt;
&lt;li&gt;目前广泛使用的是：NEC Protocol的PWM（脉冲宽度调制）和Philips RC-5 Protocol的PPM（脉冲位置调制）。
&lt;ul&gt;
&lt;li&gt;PWM：红外载波的占空比表示‘0’和‘1’。发射时间固定，通过改变不发射载波的时间改变占空比。&lt;/li&gt;
&lt;li&gt;PPM：发射载波的位置表示‘0’和‘1’。发射载波到不发射载波位‘0’，反之位‘1’。发射载波和不发射载波的时间相同，均为0.889ms，每位时间固定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;一、核心编码规则&lt;/h2&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;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;560 µs 高（载波） + 560 µs 低&lt;/td&gt;
&lt;td&gt;≈ 1.125 ms&lt;/td&gt;
&lt;td&gt;短间隔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;560 µs 高（载波） + 1690 µs 低&lt;/td&gt;
&lt;td&gt;≈ 2.25 ms&lt;/td&gt;
&lt;td&gt;长间隔&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“高电平” = 发射 38kHz 载波（burst）&lt;/li&gt;
&lt;li&gt;“低电平” = 停止载波（静默）&lt;/li&gt;
&lt;li&gt;所有数据位均以 &lt;strong&gt;560 µs 高电平&lt;/strong&gt; 开始，通过后续低电平长度区分 0/1
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;二、完整帧结构（32位数据）&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E7%BA%A2%E5%A4%96NEC%E5%8D%8F%E8%AE%AE%E7%BC%96%E7%A0%81%E8%AF%B4%E6%98%8E.webp&quot; alt=&quot;红外 NEC 协议编码说明&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段（中文）&lt;/th&gt;
&lt;th&gt;FIELD (English)&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;Leader Pulse / Sync Header&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;9ms + 4.5ms&lt;/td&gt;
&lt;td&gt;帧起始标志&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;地址码&lt;/td&gt;
&lt;td&gt;Address Code&lt;/td&gt;
&lt;td&gt;8位&lt;/td&gt;
&lt;td&gt;0x12&lt;/td&gt;
&lt;td&gt;设备地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;地址反码&lt;/td&gt;
&lt;td&gt;Address Inverse&lt;/td&gt;
&lt;td&gt;8位&lt;/td&gt;
&lt;td&gt;0xED (= ~0x12)&lt;/td&gt;
&lt;td&gt;地址校验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;控制码&lt;/td&gt;
&lt;td&gt;Command Code&lt;/td&gt;
&lt;td&gt;8位&lt;/td&gt;
&lt;td&gt;0x45&lt;/td&gt;
&lt;td&gt;按键命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;控制反码&lt;/td&gt;
&lt;td&gt;Command Inverse&lt;/td&gt;
&lt;td&gt;8位&lt;/td&gt;
&lt;td&gt;0xBA (= ~0x45)&lt;/td&gt;
&lt;td&gt;命令校验&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note
总数据位：8 + 8 + 8 + 8 = &lt;strong&gt;32位&lt;/strong&gt;&lt;br /&gt;
校验规则：&lt;code&gt;Address ^ AddressInverse == 0xFF&lt;/code&gt;，&lt;code&gt;Command ^ CommandInverse == 0xFF&lt;/code&gt;
:::&lt;/p&gt;
&lt;h3&gt;示例题①&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E7%A4%BA%E4%BE%8B%E9%A2%981.webp&quot; alt=&quot;示例题1&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段名称&lt;/th&gt;
&lt;th&gt;NEC 值 (LSB First)&lt;/th&gt;
&lt;th&gt;十六进制值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Address Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0000 0000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x00&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address Inverse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1111 1111&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xFF&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0100 0101&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x45&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command Inverse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1011 1010&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xBA&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;过程：&lt;br /&gt;
&lt;code&gt;start&lt;/code&gt;: 9ms + 4.5ms&lt;br /&gt;
&lt;code&gt;Address Code&lt;/code&gt;: 00000000 → 00000000 (00)&lt;br /&gt;
&lt;code&gt;Address Inverse1&lt;/code&gt;: 11111111 → 11111111 (FF)&lt;br /&gt;
&lt;code&gt;Command Code&lt;/code&gt; (原始波形 MSB First → NEC 值 LSB First): 10100010 (A2) → 01000101 (45)&lt;br /&gt;
&lt;code&gt;Command Inverse&lt;/code&gt; (原始波形 MSB First → NEC 值 LSB First): 01011101 (5D) → 10111010 (BA)&lt;/p&gt;
&lt;h3&gt;示例题②&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E7%A4%BA%E4%BE%8B%E9%A2%982.webp&quot; alt=&quot;示例题2&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段名称&lt;/th&gt;
&lt;th&gt;NEC 值 (LSB First)&lt;/th&gt;
&lt;th&gt;十六进制值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Address Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0000 0000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x00&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address Inverse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1111 1111&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xFF&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0011 0000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x30&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command Inverse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1100 1111&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0xCF&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;过程：&lt;br /&gt;
&lt;code&gt;start&lt;/code&gt;: 9ms + 4.5ms&lt;br /&gt;
&lt;code&gt;Address Code&lt;/code&gt;: 00000000 → 00000000 (00)&lt;br /&gt;
&lt;code&gt;Address Inverse1&lt;/code&gt;: 11111111 → 11111111 (FF)&lt;br /&gt;
&lt;code&gt;Command Code&lt;/code&gt; (原始波形 MSB First → NEC 值 LSB First): 00110000 (30) → 00001100 (0C)&lt;br /&gt;
&lt;code&gt;Command Inverse&lt;/code&gt; (原始波形 MSB First → NEC 值 LSB First): 1100 1111 (CF) → 11110011 (F3)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、位序规则：LSB First（低位在前）&lt;/h2&gt;
&lt;p&gt;所有字节（地址码、控制码等）均按 &lt;strong&gt;LSB First&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;th&gt;权重（2ⁿ）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;第1位（最先发送）&lt;/td&gt;
&lt;td&gt;bit0&lt;/td&gt;
&lt;td&gt;最低位（LSB）&lt;/td&gt;
&lt;td&gt;(2^0 = 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第2位&lt;/td&gt;
&lt;td&gt;bit1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^1 = 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第3位&lt;/td&gt;
&lt;td&gt;bit2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^2 = 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第4位&lt;/td&gt;
&lt;td&gt;bit3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^3 = 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第5位&lt;/td&gt;
&lt;td&gt;bit4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^4 = 16)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第6位&lt;/td&gt;
&lt;td&gt;bit5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^5 = 32)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第7位&lt;/td&gt;
&lt;td&gt;bit6&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^6 = 64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第8位（最后发送）&lt;/td&gt;
&lt;td&gt;bit7&lt;/td&gt;
&lt;td&gt;最高位（MSB）&lt;/td&gt;
&lt;td&gt;(2^7 = 128)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;所有字节（地址码、控制码等）均按 &lt;strong&gt;LSB First&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;th&gt;权重（2ⁿ）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;第1位（最先收到）&lt;/td&gt;
&lt;td&gt;bit0&lt;/td&gt;
&lt;td&gt;最低位（LSB）&lt;/td&gt;
&lt;td&gt;(2^0 = 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第2位&lt;/td&gt;
&lt;td&gt;bit1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^1 = 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第3位&lt;/td&gt;
&lt;td&gt;bit2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^2 = 4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第4位&lt;/td&gt;
&lt;td&gt;bit3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^3 = 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第5位&lt;/td&gt;
&lt;td&gt;bit4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^4 = 16)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第6位&lt;/td&gt;
&lt;td&gt;bit5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^5 = 32)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第7位&lt;/td&gt;
&lt;td&gt;bit6&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(2^6 = 64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第8位（最后收到）&lt;/td&gt;
&lt;td&gt;bit7&lt;/td&gt;
&lt;td&gt;最高位（MSB）&lt;/td&gt;
&lt;td&gt;(2^7 = 128)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::tip
示例：发送序列 &lt;code&gt;01000101&lt;/code&gt; → 8位字节转换成16进制数 &lt;code&gt;0x45&lt;/code&gt;
示例：接收序列 &lt;code&gt;10100010&lt;/code&gt; → 组合为 &lt;code&gt;bit7~bit0 = 01000101 = 0x45&lt;/code&gt;
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E7%BA%A2%E5%A4%96%E6%8E%A5%E6%94%B6%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B%E5%9B%BE.webp&quot; alt=&quot;红外接收程序流程图&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;四、NEC Protocol的 PWM （脉冲宽度调制）和 Philips RC-5 Protocol 的 PPM （脉冲位置调制）&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;NEC 协议（PWM 标准）&lt;/th&gt;
&lt;th&gt;Philips RC-5 协议（PPM 标准）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;编码类型&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;脉冲宽度调制（PWM）&amp;lt;br&amp;gt;（通过改变无载波时间改变占空比）&lt;/td&gt;
&lt;td&gt;脉冲位置调制（PPM）&amp;lt;br&amp;gt;（通过高低电平相位位置区分 0/1）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;载波频率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;38 kHz（典型）&lt;/td&gt;
&lt;td&gt;36 kHz（典型）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;逻辑“0”表示&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;560 µs 载波 + 560 µs 无载波&lt;/td&gt;
&lt;td&gt;889 µs 低电平 + 889 µs 高电平&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;逻辑“1”表示&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;560 µs 载波 + 1690 µs 无载波&lt;/td&gt;
&lt;td&gt;889 µs 高电平 + 889 µs 低电平&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;位时长&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不固定（=1.12 ms 或 2.25 ms）&lt;/td&gt;
&lt;td&gt;固定（≈1.778 ms）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;帧结构&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;引导码 + 地址码（16位）+ 命令码（16位）&lt;/td&gt;
&lt;td&gt;起始位（S）+ 场位（F）+ 控制位（C）+ 系统码（5位）+ 命令码（6位）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;位发送顺序&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LSB First（先发低位）&lt;/td&gt;
&lt;td&gt;MSB First（先发高位）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;重复按键机制&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;全码后发送简码（9ms + 2.25ms + 结束位），周期约 108ms&lt;/td&gt;
&lt;td&gt;控制位（C）翻转，其余不变，无简码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;校验方式&lt;/strong&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;strong&gt;典型芯片&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WD6122、uPD6121&lt;/td&gt;
&lt;td&gt;SAA3010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;应用场景&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;电视、空调、机顶盒等家电&lt;/td&gt;
&lt;td&gt;Philips 音响、老式电视等&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;五、编程实现&lt;/h2&gt;
&lt;h3&gt;1. 数据类型与存储策略&lt;/h3&gt;
&lt;p&gt;虽然协议由 4 个 8 位字段组成，但在编程中通常将其“拼装”为 32 位整数进行处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本单元&lt;/strong&gt;：&lt;code&gt;uint8_t&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;：将 4 个 &lt;code&gt;uint8_t&lt;/code&gt; 拼装成 1 个 &lt;code&gt;uint32_t&lt;/code&gt;，再统一进行位发送循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接收时&lt;/strong&gt;：先接收 32 个位存入 &lt;code&gt;uint32_t&lt;/code&gt;，接收完毕后再拆解为 4 个 &lt;code&gt;uint8_t&lt;/code&gt; 校验和处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 接收端拆解示例 (假设 rx_data 为接收到的 uint32_t 完整帧)
uint8_t address = (uint8_t)(rx_data &amp;amp; 0xFF);
uint8_t command = (uint8_t)((rx_data &amp;gt;&amp;gt; 16) &amp;amp; 0xFF);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 校验机制&lt;/h3&gt;
&lt;p&gt;NEC 协议通过“原码 + 反码”进行错误检测。接收端的标准校验逻辑如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;校验公式&lt;/strong&gt;：&lt;code&gt;(原始值 ^ 反码值) == 0xFF&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;只有当地址码与命令码都通过校验时，才视为有效的帧。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 校验逻辑示例
if ( (address ^ address_inv == 0xFF) &amp;amp;&amp;amp; (command ^ command_inv == 0xFF) ) {
    // 通过校验，执行命令
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 接收端的逻辑反相&lt;/h3&gt;
&lt;p&gt;接收端输出电平与发射端的载波逻辑是相反 (Active Low) 的：&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;th&gt;软件解码逻辑&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;有载波&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;发射 38kHz 脉冲&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;低电平 (LOW)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;对应协议中的“高”时长&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;无载波&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;静默&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;高电平 (HIGH)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;对应协议中的“低”时长&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;编程关键&lt;/strong&gt;：软件解码时，需测量的是&lt;strong&gt;引脚低电平&lt;/strong&gt;的持续时间（判断是否为 560µs 载波）和随后的&lt;strong&gt;引脚高电平&lt;/strong&gt;持续时间（据此判断是逻辑 &lt;code&gt;0&lt;/code&gt; 还是 &lt;code&gt;1&lt;/code&gt;）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4. 时序测量方式&lt;/h3&gt;
&lt;p&gt;由于 NEC 协议对微秒级时序敏感，推荐使用硬件资源进行测量：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定时器输入捕获 (Input Capture)&lt;/strong&gt;。由硬件自动记录引脚跳变时刻，精度最高，CPU 占用最少。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部中断 (GPIO Interrupt)&lt;/strong&gt;。在引脚跳变时触发中断记录时间，精度较好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轮询 (Polling)&lt;/strong&gt;。容易受其他程序干扰导致时序测量误差，造成解码失败。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 状态机实现&lt;/h3&gt;
&lt;p&gt;NEC 协议的接收端通常采用状态机结构，按顺序处理引导码、地址码、命令码、命令反码共 4 个字段。每个字段的接收过程中，根据引脚电平变化（高/低）切换状态，记录静默时间（载波时间固定为 560 µs）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;六、关键注意事项 (源自网络，注意甄别)&lt;/h2&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;strong&gt;38 kHz&lt;/strong&gt;（由 455 kHz 晶振 ÷12 得到）&lt;/li&gt;
&lt;li&gt;推荐占空比：&lt;strong&gt;1:3&lt;/strong&gt;（高电平占 1/4 周期），但 1:1 或 1:2 在多数接收头下也能工作。&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;ul&gt;
&lt;li&gt;&lt;strong&gt;必须包含结束位&lt;/strong&gt;：全码和简码末尾均需发送 &lt;strong&gt;0.56 ms 载波&lt;/strong&gt;，否则部分设备无法识别。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16 位地址码顺序&lt;/strong&gt;：先发&lt;strong&gt;低字节&lt;/strong&gt;，再发&lt;strong&gt;高字节&lt;/strong&gt;，每个字节内部仍为 LSB First。&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;ul&gt;
&lt;li&gt;按键长按时，&lt;strong&gt;首帧发全码&lt;/strong&gt;，后续每 &lt;strong&gt;108 ms&lt;/strong&gt; 发送一次简码：&lt;br /&gt;
&lt;code&gt;9 ms 载波 + 2.25 ms 无载波 + 0.56 ms 载波（结束位）&lt;/code&gt;&lt;/li&gt;
&lt;li&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;ul&gt;
&lt;li&gt;两次全码之间建议间隔 &lt;strong&gt;≥110 ms&lt;/strong&gt;，避免接收端因繁忙而丢帧。&lt;/li&gt;
&lt;li&gt;连续快速发送多帧容易导致第二帧失效，应该要加入合适的延时。&lt;/li&gt;
&lt;li&gt;Sony、机顶盒等二次译码 MCU 在 65 ms 内就准备接收下一帧；做万能遥控可把“全码间隔”做成 60–130 ms 可配置，否则会出现“第二键无响应”。&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;ul&gt;
&lt;li&gt;一体化红外接收头输出波形与发射端&lt;strong&gt;逻辑相反&lt;/strong&gt;（载波时输出低电平），解码前需注意是否需软件取反。&lt;/li&gt;
&lt;li&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;ul&gt;
&lt;li&gt;部分品牌（如美的、新科）可能会用 NEC 的变种协议：帧长可能达 120 ms 甚至 500 ms。&lt;/li&gt;
&lt;li&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;硬件设计建议&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;红外发射管驱动电流建议 ≥100 mA，推荐使用恒流电路（如射极跟随器）以维持发射强度稳定。&lt;/li&gt;
&lt;li&gt;接收头电源引脚需加 &lt;strong&gt;≥22 µF 滤波电容&lt;/strong&gt;，必要时串接 330 Ω 电阻抑制电源干扰。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/mylinux/p/5084264.html&quot;&gt;NEC协议&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://blog.csdn.net/wuhenyouyuyouyu/article/details/105900088&quot;&gt;红外遥控编码与解码&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://zhuanlan.zhihu.com/p/627341600&quot;&gt;STM32F103正点原子学习笔记系列——REMOTE&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.sbprojects.net/knowledge/ir/nec.php&quot;&gt;SB-Projects NEC Protocol&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://blog.embeddedexpert.io/?p=1138&quot;&gt;NEC Protocol Decoding with STM32&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://doc.yonyoucloud.com/doc/wiki/project/mcu-tutorial-three/nec-protocol-infrared-remote-controller.html&quot;&gt;NEC 协议红外遥控器&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Numpy学习笔记(2)</title><link>https://blog.chuwu.top/posts/numpy/numpy2/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/numpy/numpy2/</guid><description>数组访问、形状操作与展平规则、数组组合、数组分割</description><pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
本笔记基于 Jupyter Lab
:::&lt;/p&gt;
&lt;p&gt;:::tip
均从第0个元素开始表述（第0行 / 第0列）
:::&lt;/p&gt;
&lt;h2&gt;数组访问&lt;/h2&gt;
&lt;h3&gt;一维数组&lt;/h3&gt;
&lt;h4&gt;整数与切片索引&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr = np.arange(10)
print(&apos;整数索引结果为：&apos;, arr[5]) # 索引从 0 开始；也支持负数，`-1` 表示数组最后一个元素
print(&apos;切片结果为：&apos;, arr[2:7]) # 左闭右开，获取从 `start` 到 `end` 的子数组
print(&apos;省略起始索引结果为：&apos;, arr[:5]) # 默认从数组开头开始，获取到索引为 `end-1` 的元素
print(&apos;省略结束索引结果为：&apos;, arr[5:]) # 默认获取到数组末尾，包含索引为 `start` 的元素
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;带步长的切片索引&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;arr[2:4] = 100, 101
print(&apos;索引结果为：&apos;, arr) # 左闭右开，切片修改数组元素

print(&apos;正步长索引结果为：&apos;, arr[::2]) # 左闭右开，每隔 2 个元素取一个，组成子数组
print(&apos;负步长索引结果为：&apos;, arr[5:1:-1]) # 反向切片，步长为 -1，数组倒序（开始索引必须大于结束索引）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;多维数组&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr = np.array([[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11]])
print(&apos;创建的二维数组为：\n&apos;, arr)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;单维度切片索引&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arr[行索引, 列起始索引:列结束索引] 或 arr[行起始索引:行结束索引, 列索引]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;单维度切片索引结果为：&apos;, arr[0, 3:5]) # 左闭右开，索引第0行中第3、4列的元素
print(&apos;索引结果为：&apos;, arr[:, 2]) # 索引第2列的元素
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;多维度切片索引&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arr[行起始索引:行结束索引, 列起始索引:列结束索引]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;多维度切片索引结果为：&apos;, arr[1:, 2:]) # 索引第1行及之后行中第2列到最后列的元素
print(&apos;索引结果为：&apos;, arr[:, 1:4]) # 左闭右开，选取所有行中，列索引从 1 到 3 的元素
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;整数序列切片索引&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arr[(行索引序列), (列索引序列)]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;整数序列索引结果为：&apos;, arr[(0, 1, 2), (1, 2, 3)]) # 左闭右开，索引第0、1、2行中，第1、2、3列的元素
print(&apos;索引结果为：&apos;, arr[1:, (0, 2, 3)]) # 左闭右开，索引第1行及之后行中，第0、2、3列的元素
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;布尔数组切片索引&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arr[布尔数组, 列索引]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mask = np.array([1, 0, 1], dtype=np.bool_) # [True, False, True]
print(&apos;布尔数组索引结果为：&apos;, arr[mask, 2]) # 索引第0、2行中第2列的元素
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;形状操作与展平规则&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr = np.arange(12)  # 创建一维数组
print(&apos;创建的一维数组为：&apos;, arr) # [0 1 2 3 4 5 6 7 8 9 10 11]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;改变数组形状&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;数组.reshape(shape)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;新的数组形状为：\n&apos;, arr.reshape(3, 4))  # 设置数组的形状为 3x4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查看数组维数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;数组.ndim / 数组.reshape(shape).ndim&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;数组维数为：&apos;, arr.ndim) # 查看数组的维数（轴数）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;数组展平&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将多维数组展平为一维数组&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr = np.arange(12).reshape(3, 4)
print(&apos;创建的二维数组为：\n&apos;, arr) # [[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11]]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;数组.ravel()&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 返回原数组的视图（修改展平后的数组可能会影响原数组）
print(&apos;数组展平为：&apos;, arr.ravel()) # [ 0  1  2  3  4  5  6  7  8  9 10 11]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;数组.flatten()&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 返回原数组的副本（修改展平后的数组不会影响原数组）
# 支持指定展平顺序（默认按行序展平）
print(&apos;横向展平为：&apos;, arr.flatten()) # [ 0  1  2  3  4  5  6  7  8  9 10 11]
print(&apos;纵向展平为：&apos;, arr.flatten(&apos;F&apos;)) # [ 0  4  8  1  5  9  2  6 10  3  7 11]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数组组合&lt;/h2&gt;
&lt;h3&gt;数组元素运算&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;格式示例&lt;/strong&gt;：&lt;code&gt;新数组 = 原数组 * 数值&lt;/code&gt;（或 &lt;code&gt;原数组 + 数值&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;th&gt;运算逻辑&lt;/th&gt;
&lt;th&gt;&lt;code&gt;arr1 = np.array([1, 2, 3, 4])&lt;/code&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;code&gt;新数组 = 原数组 + 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素加指定数值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 + 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[3, 4, 5, 6]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;减法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 - 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素减指定数值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 - 1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[0, 1, 2, 3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;乘法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 * 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素乘指定数值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 * 3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[3, 6, 9, 12]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;除法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 / 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素除以指定数值（结果为浮点）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 / 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[0.5, 1.0, 1.5, 2.0]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;整除&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 // 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素整除指定数值（丢弃小数）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 // 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[0, 1, 1, 2]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;取余&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 % 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素对指定数值取余&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 % 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 0, 1, 0]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;幂运算&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 ** 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素的指定次幂&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 ** 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 4, 9, 16]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大于比较（布尔）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 &amp;gt; 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素与数值比较，返回布尔值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 &amp;gt; 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[False, False, True, True]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;小于比较（布尔）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 &amp;lt; 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素与数值比较，返回布尔值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 &amp;lt; 3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[True, True, False, False]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;等于比较（布尔）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 == 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素与数值比较，返回布尔值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 == 4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[False, False, False, True]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;不等于比较（布尔）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 原数组 != 数值&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;每个元素与数值比较，返回布尔值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 != 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[True, False, True, True]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;数组与数组的逐元素运算（形状需相同）&lt;/h4&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;code&gt;arr1 = np.array([1,2,3]), arr2 = np.array([4,5,6])&lt;/code&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;code&gt;新数组 = 数组A + 数组B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对应位置元素相加&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 + arr2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[5, 7, 9]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数组减法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 数组A - 数组B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对应位置元素相减&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 - arr2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[-3, -3, -3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数组乘法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 数组A * 数组B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对应位置元素相乘（非矩阵乘法）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 * arr2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[4, 10, 18]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数组除法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;新数组 = 数组A / 数组B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对应位置元素相除（结果为浮点）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;arr1 / arr2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[0.25, 0.4, 0.5]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;&lt;code&gt;np.hstack&lt;/code&gt; 横向组合数组&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;要求待组合的数组在除水平方向外的其他维度上形状一致&lt;/li&gt;
&lt;li&gt;&lt;code&gt;np.hstack((数组1, 数组2, ...))&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
print(&apos;横向组合后的数组为：\n&apos;, np.hstack((arr1, arr2)))
#横向组合后的数组为：
 #[[ 1  2  3  7  8  9]
 #[ 4  5  6 10 11 12]]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;np.vstack&lt;/code&gt; 纵向组合数组&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;要求待组合的数组在除垂直方向外的其他维度上形状一致&lt;/li&gt;
&lt;li&gt;&lt;code&gt;np.vstack((数组1, 数组2, ...))&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;纵向组合后的数组为：\n&apos;, np.vstack((arr1, arr2)))
#纵向组合后的数组为：
 #[[ 1  2  3]
 #[ 4  5  6]
 #[ 7  8  9]
 #[10 11 12]]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;np.concatenate&lt;/code&gt; 组合数组&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;np.concatenate((数组1, 数组2, ...), axis=轴编号)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;待组合的数组，在除 &lt;code&gt;axis&lt;/code&gt; 指定的维度外的其他所有维度上，形状必须完全一致
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;axis&lt;/code&gt; 用于指定数组组合的方向维度
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;axis=1&lt;/code&gt; ，&lt;strong&gt;横向组合&lt;/strong&gt;（水平方向，列维度方向），与 &lt;code&gt;np.hstack&lt;/code&gt; 类似&lt;/li&gt;
&lt;li&gt;&lt;code&gt;axis=0&lt;/code&gt; ，&lt;strong&gt;纵向组合&lt;/strong&gt;（垂直方向，行维度方向），与 &lt;code&gt;np.vstack&lt;/code&gt; 类似&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;横向组合后的数组为：\n&apos;, np.concatenate((arr1, arr2), axis=1))
#横向组合后的数组为：
 #[[ 1  2  3  7  8  9]
 #[ 4  5  6 10 11 12]]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;纵向组合后的数组为：\n&apos;, np.concatenate((arr1, arr2), axis=0))
#纵向组合后的数组为：
 #[[ 1  2  3]
 #[ 4  5  6]
 #[ 7  8  9]
 #[10 11 12]]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数组分割&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;arr = np.arange(16).reshape(4, 4)
print(&apos;创建的二维数组为：\n&apos;, arr)
#创建的二维数组为：
 #[[ 0  1  2  3]
 #[ 4  5  6  7]
 #[ 8  9 10 11]
 #[12 13 14 15]]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;np.hsplit&lt;/code&gt; 横向分割数组&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;按照列的维度，将数组平均分割成指定的份数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;np.hsplit(数组, 分割份数)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;横向分割后的数组为：\n&apos;, np.hsplit(arr, 2))
#横向分割后的数组为：
# [array([[ 0,  1],
#       [ 4,  5],
#       [ 8,  9],
#       [12, 13]]), array([[ 2,  3],
#       [ 6,  7],
#       [10, 11],
#       [14, 15]])]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;np.vsplit&lt;/code&gt; 纵向分割数组&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;按照行的维度，将数组平均分割成指定的份数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;np.vsplit(数组, 分割份数)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;纵向分割后的数组为：\n&apos;, np.vsplit(arr, 2))
#纵向分割后的数组为：
# [array([[ 0,  1,  2,  3],
#       [ 4,  5,  6,  7]]), array([[ 8,  9, 10, 11],
#       [12, 13, 14, 15]])]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;np.split&lt;/code&gt; 分割数组&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;np.split(数组, 分割份数, axis=轴编号)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;axis&lt;/code&gt; 用于指定数组分割的方向维度
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;axis=1&lt;/code&gt; ，&lt;strong&gt;横向分割&lt;/strong&gt;（水平方向，列维度方向），与 &lt;code&gt;np.hsplit&lt;/code&gt; 类似&lt;/li&gt;
&lt;li&gt;&lt;code&gt;axis=0&lt;/code&gt; ，&lt;strong&gt;纵向分割&lt;/strong&gt;（垂直方向，行维度方向），与 &lt;code&gt;np.vsplit&lt;/code&gt; 类似&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;横向分割后的数组为：\n&apos;, np.split(arr, 2, axis=1))
#横向分割后的数组为：
# [array([[ 0,  1],
#       [ 4,  5],
#       [ 8,  9],
#       [12, 13]]), array([[ 2,  3],
#       [ 6,  7],
#       [10, 11],
#       [14, 15]])]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;print(&apos;纵向分割后的数组为：\n&apos;, np.split(arr, 2, axis=0))
#纵向分割后的数组为：
# [array([[ 0,  1,  2,  3],
#       [ 4,  5,  6,  7]]), array([[ 8,  9, 10, 11],
#       [12, 13, 14, 15]])]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://numpy.com.cn/doc/stable/user/index.html&quot;&gt;NumPy 中文文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Numpy学习笔记(1)</title><link>https://blog.chuwu.top/posts/numpy/numpy1/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/numpy/numpy1/</guid><description>轴的概念、数组属性、数组创建、数组数据类型、生成随机数</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
本笔记基于 Jupyter Lab
:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Numpy 是一个开源的 Python 库，它提供了高性能的数组对象，以及数学函数，用于操作这些数组, 广泛应用于科学和工程领域。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::important
导入Numpy
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种约定允许使用简短易识别的前缀 (np.) 访问 NumPy 功能，同时将 NumPy 功能与同名其他功能区分开来。&lt;/p&gt;
&lt;h2&gt;轴（Axis）的基本概念&lt;/h2&gt;
&lt;p&gt;在 NumPy 中，轴（&lt;code&gt;axis&lt;/code&gt;）是描述数组维度方向的核心概念，&lt;strong&gt;编号从 0 开始&lt;/strong&gt;，从“最外层”到“最内层”。&lt;br /&gt;
&lt;strong&gt;规律&lt;/strong&gt;：轴编号 = 维度层级，轴 0 为最外层，编号越大，操作越聚焦内层结构。&lt;/p&gt;
&lt;h3&gt;一维数组（1D Array）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;轴 0（&lt;code&gt;axis=0&lt;/code&gt;）&lt;/strong&gt;：唯一维度方向（如直线延伸）。
&lt;ul&gt;
&lt;li&gt;示例：&lt;code&gt;[1,2,3,4]&lt;/code&gt;，轴 0 表示从第一个到最后一个元素的方向。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;二维数组（2D Array）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;轴 0（&lt;code&gt;axis=0&lt;/code&gt;）&lt;/strong&gt;：垂直方向（行维度）。
&lt;ul&gt;
&lt;li&gt;示例：&lt;code&gt;[[1,2],[3,4]]&lt;/code&gt;，沿轴 0 求和：&lt;code&gt;[1+3, 2+4] = [4,6]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轴 1（&lt;code&gt;axis=1&lt;/code&gt;）&lt;/strong&gt;：水平方向（列维度）。
&lt;ul&gt;
&lt;li&gt;示例：&lt;code&gt;[[1,2],[3,4]]&lt;/code&gt;，沿轴 1 求和：&lt;code&gt;[1+2, 3+4] = [3,7]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;三维数组（3D Array）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;轴 0（&lt;code&gt;axis=0&lt;/code&gt;）&lt;/strong&gt;：二维数组的堆叠方向（深度）。
&lt;ul&gt;
&lt;li&gt;示例：&lt;code&gt;[[[1,2],[3,4]], [[5,6],[7,8]]]&lt;/code&gt;，沿轴 0 求和：&lt;code&gt;[[1+5,2+6],[3+7,4+8]] = [[6,8],[10,12]]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轴 1（&lt;code&gt;axis=1&lt;/code&gt;）&lt;/strong&gt;：二维数组内部的垂直方向（行维度）。
&lt;ul&gt;
&lt;li&gt;示例：上述数组，沿轴 1 求和：&lt;code&gt;[[1+3,2+4], [5+7,6+8]] = [[4,6],[12,14]]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轴 2（&lt;code&gt;axis=2&lt;/code&gt;）&lt;/strong&gt;：二维数组内部的水平方向（列维度）。
&lt;ul&gt;
&lt;li&gt;示例：上述数组，沿轴 2 求和：&lt;code&gt;[[1+2,3+4], [5+6,7+8]] = [[3,7],[11,15]]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;数组属性&lt;/h2&gt;
&lt;p&gt;NumPy 的数组类名为 ndarray。它也以别名 array 著称。
:::warning
请注意，numpy.array 与标准 Python 库中的 array.array 类不同，后者只处理一维数组，功能较少。
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr = np.array([[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]])
print(arr)          # 输出数组，注意格式：中括号，元素间无逗号（区别于列表）
print(arr.ndim)     # 数组的轴（维度）数量
print(arr.shape)    # 数组的维度，整数元组表示每个维度的大小
print(arr.size)     # 数组的元素总数，等于 shape 中元素的乘积
print(arr.dtype)    # 数组中元素的类型，可为标准 Python 类型或 NumPy 类型
print(arr.itemsize) # 数组中每个元素的字节大小，等同于 dtype.itemsize
print(arr.data)     # 包含数组实际元素的缓冲区，通常通过索引访问元素
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：
&lt;img src=&quot;./images/%E6%95%B0%E7%BB%84%E5%B1%9E%E6%80%A7.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;数组创建&lt;/h2&gt;
&lt;h3&gt;使用 &lt;code&gt;array&lt;/code&gt; 函数创建&lt;/h3&gt;
&lt;p&gt;从普通的 Python 列表或元组创建数组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
a = np.array([2, 3, 4])
print(a)          # array([2, 3, 4])
print(a.dtype)    # dtype(&apos;int64&apos;)

b = np.array([1.2, 3.5, 5.1])
print(b.dtype)    # dtype(&apos;float64&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;np.array(object, dtype=None, copy=True, order=&apos;K&apos;, subok=False, ndmin=0)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;object&lt;/code&gt;：输入数据，可以是列表、元组或其他数组。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dtype&lt;/code&gt;：数组元素的数据类型，可选。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;copy&lt;/code&gt;：是否复制输入数据，默认为 &lt;code&gt;True&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;order&lt;/code&gt;：存储顺序，&lt;code&gt;C&lt;/code&gt; 表示行优先，&lt;code&gt;F&lt;/code&gt; 表示列优先。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subok&lt;/code&gt;：默认返回基础类的数组，若为 &lt;code&gt;True&lt;/code&gt; 则返回子类。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ndmin&lt;/code&gt;：指定返回数组的最小维数。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：调用 &lt;code&gt;array&lt;/code&gt; 时需提供单一序列作为参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a = np.array([1, 2, 3, 4])  # 正确
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将序列的序列转换为二维数组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;b = np.array([(1.5, 2, 3), (4, 5, 6)])
print(b)
# array([[1.5, 2. , 3. ],
#        [4. , 5. , 6. ]])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显式指定数组类型：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;c = np.array([[1, 2], [3, 4]], dtype=complex)
print(c)
# array([[1.+0.j, 2.+0.j],
#        [3.+0.j, 4.+0.j]])
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;重设数组的 &lt;code&gt;shape&lt;/code&gt; 属性&lt;/h3&gt;
&lt;p&gt;可以通过修改数组的 &lt;code&gt;shape&lt;/code&gt; 属性来重设数组的形状，而无需创建新数组。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
arr.shape = (2, 3)  # 将一维数组重设为二维数组
print(arr)
# 输出：
# array([[1, 2, 3],
#        [4, 5, 6]])
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用占位符函数创建&lt;/h3&gt;
&lt;p&gt;创建具有初始占位符内容的数组：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;np.zeros((3, 4))
# array([[0., 0., 0., 0.],
#        [0., 0., 0., 0.],
#        [0., 0., 0., 0.]])

np.ones((2, 3, 4), dtype=np.int16)
# array([[[1, 1, 1, 1],
#         [1, 1, 1, 1],
#         [1, 1, 1, 1]],
#
#        [[1, 1, 1, 1],
#         [1, 1, 1, 1],
#         [1, 1, 1, 1]]], dtype=int16)

np.empty((2, 3))
# array([[...],  # 内容可能因内存状态而异（随机）
#        [...]])

np.eye(3)
# array([[1., 0., 0.],
#        [0., 1., 0.],
#        [0., 0., 1.]])

np.diag([1, 2, 3])
# array([[1, 0, 0],
#        [0, 2, 0],
#        [0, 0, 3]])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
其余占位符函数不再列举，请参阅&lt;a href=&quot;https://numpy.com.cn/doc/stable/reference/routines.array-creation.html&quot;&gt;数组创建例程&lt;/a&gt;
:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;np.zeros(shape, dtype=float, order=&apos;C&apos;)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shape&lt;/code&gt;：数组的形状，必须指定。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dtype&lt;/code&gt;：数组元素的数据类型，默认为 &lt;code&gt;float&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;order&lt;/code&gt;：存储顺序，&lt;code&gt;C&lt;/code&gt; 表示行优先，&lt;code&gt;F&lt;/code&gt; 表示列优先。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;np.ones(shape, dtype=None, order=&apos;C&apos;)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参数与 &lt;code&gt;np.zeros&lt;/code&gt; 相同。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;np.empty(shape, dtype=float, order=&apos;C&apos;)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参数与 &lt;code&gt;np.zeros&lt;/code&gt; 相同。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;np.eye(N, M=None, k=0, dtype=&amp;lt;class &apos;float&apos;&amp;gt;, order=&apos;C&apos;)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;N&lt;/code&gt;：行数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M&lt;/code&gt;：列数，默认为 &lt;code&gt;N&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;k&lt;/code&gt;：对角线的索引，默认为 &lt;code&gt;0&lt;/code&gt;（主对角线）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;np.diag(v, k=0)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;v&lt;/code&gt;：输入数组。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;k&lt;/code&gt;：对角线的索引，默认为 &lt;code&gt;0&lt;/code&gt;（主对角线）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;创建数字序列的数组&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;arange&lt;/code&gt; 函数：&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;np.arange(10, 30, 5)
# array([10, 15, 20, 25])

np.arange(0, 2, 0.3)
# array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;np.arange(start, stop, step)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt;：起始值（包含），若省略则默认为 &lt;code&gt;0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop&lt;/code&gt;：终止值（不包含），必须指定。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;step&lt;/code&gt;：步长，若省略则默认为 &lt;code&gt;1&lt;/code&gt;；步长可为整数或浮点数，用于控制相邻元素的间隔。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;linspace&lt;/code&gt; 函数：&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;from numpy import pi
np.linspace(0, 2, 9)
# array([0.  , 0.25, 0.5 , 0.75, 1.  , 1.25, 1.5 , 1.75, 2.  ])
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt;：序列的起始值。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop&lt;/code&gt;：序列的终止值。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;num&lt;/code&gt;：生成的样本数，默认为 &lt;code&gt;50&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;endpoint&lt;/code&gt;：是否包含终止值，默认为 &lt;code&gt;True&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;retstep&lt;/code&gt;：是否返回样本间距，默认为 &lt;code&gt;False&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dtype&lt;/code&gt;：输出数组的数据类型。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;axis&lt;/code&gt;：结果中样本的轴，默认为 &lt;code&gt;0&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;code&gt;logspace&lt;/code&gt; 函数&lt;/h4&gt;
&lt;p&gt;生成对数刻度的数值序列。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;arr = np.logspace(1, 3, num=5)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt;：对数刻度的起始值。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stop&lt;/code&gt;：对数刻度的终止值。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;num&lt;/code&gt;：生成的样本数，默认为 &lt;code&gt;50&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;base&lt;/code&gt;：对数的底数，默认为 &lt;code&gt;10&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::note
&lt;code&gt;arange&lt;/code&gt; 函数和 &lt;code&gt;linspace&lt;/code&gt; 函数的区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;arange&lt;/code&gt; 函数生成的序列包含起始值，不包含终止值，步长可以是整数或浮点数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;linspace&lt;/code&gt; 函数生成的序列包含起始值，默认也包含终止值，样本数可以自定义。
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;数组数据类型&lt;/h2&gt;
&lt;p&gt;常见的数据类型包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;int&lt;/code&gt;：整数类型，如 &lt;code&gt;np.int8&lt;/code&gt;、&lt;code&gt;np.int16&lt;/code&gt;、&lt;code&gt;np.int32&lt;/code&gt;、&lt;code&gt;np.int64&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;float&lt;/code&gt;：浮点类型，如 &lt;code&gt;np.float32&lt;/code&gt;、&lt;code&gt;np.float64&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bool&lt;/code&gt;：布尔类型，&lt;code&gt;np.bool_&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;complex&lt;/code&gt;：复数类型，如 &lt;code&gt;np.complex64&lt;/code&gt;、&lt;code&gt;np.complex128&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据类型转换示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
print(&apos;转换结果为：&apos;, np.float64(42))   # 整数转换为浮点数（精确转换）
print(&apos;转换结果为：&apos;, np.int8(42.0))   # 浮点数转换为整数（截断小数取整）
print(&apos;转换结果为：&apos;, np.bool_(42))   # 整数转换为布尔值（非零整数均为 True）
print(&apos;转换结果为：&apos;, np.bool_(0))    # 整数转换为布尔值（0 为 False）
print(&apos;转换结果为：&apos;, np.float64(True))  # 布尔值转换为浮点数
print(&apos;转换结果为：&apos;, np.float64(False)) # 布尔值转换为浮点数
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;np.dtype&lt;/code&gt; 函数&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;np.dtype&lt;/code&gt; 用于定义数组元素的数据类型，支持标准 Python 类型和 NumPy 类型。&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;np.dtype&lt;/code&gt; 的参数&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;dtype&lt;/code&gt;&lt;/strong&gt;：数据类型，可以是 NumPy 类型（如 &lt;code&gt;np.int32&lt;/code&gt;）或标准 Python 类型（如 &lt;code&gt;int&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;byteorder&lt;/code&gt;&lt;/strong&gt;：字节顺序，可选值为 &lt;code&gt;&amp;gt;&lt;/code&gt;（大端）或 &lt;code&gt;&amp;lt;&lt;/code&gt;（小端）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;align&lt;/code&gt;&lt;/strong&gt;：是否对齐字段，默认为 &lt;code&gt;False&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;subdtype&lt;/code&gt;&lt;/strong&gt;：子类型，用于描述数组的维度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;创建数据类型&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
# 定义一个数组并指定数据类型
arr = np.array([1, 2, 3], dtype=np.float64)
print(arr)
# array([1., 2., 3.])
print(arr.dtype)
# dtype(&apos;float64&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;查看已有数组类型&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
arr = np.array([1, 2, 3], dtype=np.float32)
print(&quot;数组数据类型：&quot;, np.dtype(arr.dtype))
# dtype(&apos;float32&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;自定义数据类型&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np
# 定义一个自定义数据类型
df = np.dtype([(&apos;name&apos;, &apos;U10&apos;), (&apos;quantity&apos;, &apos;i4&apos;), (&apos;price&apos;, &apos;f4&apos;)])
itemz = np.array([(&apos;tomatoes&apos;, 42, 4.14), (&apos;cabbages&apos;, 13, 1.72)], dtype=df)
print(&apos;数组为：&apos;, itemz)
print(&apos;自定义数据为：&apos;, itemz.dtype)
# array([(&apos;tomatoes&apos;, 42, 4.14), (&apos;cabbages&apos;, 13, 1.72)],
#       dtype=[(&apos;name&apos;, &apos;&amp;lt;U10&apos;), (&apos;quantity&apos;, &apos;&amp;lt;i4&apos;), (&apos;price&apos;, &apos;&amp;lt;f4&apos;)])
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;生成随机数&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;np.random.random&lt;/code&gt; 函数&lt;/h3&gt;
&lt;p&gt;生成 [0, 1) 区间的均匀分布随机数。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rand_array = np.random.random((3, 2))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;size&lt;/code&gt;：指定生成数组的形状，类型为 &lt;code&gt;int&lt;/code&gt; 或 &lt;code&gt;tuple&lt;/code&gt;，如 &lt;code&gt;(2, 3)&lt;/code&gt; 表示 2x3 的数组。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;np.random.rand&lt;/code&gt; 函数&lt;/h3&gt;
&lt;p&gt;生成 [0, 1) 区间的均匀分布随机数，支持直接传递形状参数。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rand_array = np.random.rand(3, 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;shape&lt;/code&gt;：指定生成数组的形状，类型为 &lt;code&gt;int&lt;/code&gt; 或 &lt;code&gt;tuple&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;np.random.randn&lt;/code&gt; 函数&lt;/h3&gt;
&lt;p&gt;生成标准正态分布（均值为 0，标准差为 1）的随机数。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rand_normal = np.random.randn(3, 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;shape&lt;/code&gt;：指定生成数组的形状，类型为 &lt;code&gt;int&lt;/code&gt; 或 &lt;code&gt;tuple&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;np.random.randint&lt;/code&gt; 函数&lt;/h3&gt;
&lt;p&gt;生成指定范围内的随机整数。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rand_int = np.random.randint(10, 50, size=(3, 2), dtype=int)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：&lt;code&gt;low, high=None, size=None&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;low&lt;/code&gt;：随机整数的下界（包含）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;high&lt;/code&gt;：随机整数的上界（不包含）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;size&lt;/code&gt;：生成数组的形状。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dtype&lt;/code&gt;：输出数组的数据类型，默认为 &lt;code&gt;int&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://numpy.com.cn/doc/stable/user/index.html&quot;&gt;NumPy 中文文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>浅谈 TCP 窗口优化</title><link>https://blog.chuwu.top/posts/2025-10-02/tcp-window-optimization/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2025-10-02/tcp-window-optimization/</guid><description>谈谈 TCP 窗口优化</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;TCP 窗口优化&lt;/h1&gt;
&lt;p&gt;不论宽带速度（例 500Mbps 或 1000Mbps），连接到一些海外服务器或物理距离遥远的数据中心或机房时，下载或传输速度有时特别的慢，与测试结果不符，&lt;br /&gt;
很大程度上是高网络延迟（RTT）与 TCP 协议的固有设计共同作用的结果。&lt;/p&gt;
&lt;h2&gt;1. 高延迟下的 TCP 吞吐量陷阱&lt;/h2&gt;
&lt;p&gt;所有基于 TCP 的网络传输（如网页浏览、文件下载、VPN 连接等）都依赖于一个叫作 TCP 窗口的机制。窗口的作用是限制发送方在收到接收方确认之前可以发送的数据量。&lt;/p&gt;
&lt;h3&gt;为什么高延迟是性能杀手？&lt;/h3&gt;
&lt;p&gt;根据 TCP 的设计，数据吞吐量受到以下公式的严格限制：&lt;/p&gt;
&lt;p&gt;$吞吐量 ≤ 窗口大小 / 往返时间 (RTT)$&lt;/p&gt;
&lt;p&gt;在跨越国家或大洲的长距离连接中，RTT 动辄超过 150 毫秒。而原始的 TCP 窗口大小只有 65535 字节（64 KiB - 1）。这意味着我们的发送方在发出少量数据后，必须等待漫长的时间（一个 RTT 周期）才能得到确认并发送下一批数据，导致带宽大量闲置。&lt;/p&gt;
&lt;h3&gt;长距离连接对窗口的需求：带宽时延积 (BDP)&lt;/h3&gt;
&lt;p&gt;为了完全跑满我们的带宽，TCP 窗口的大小必须能覆盖网络管道的实际容量，这被称为带宽时延积 (BDP)：&lt;/p&gt;
&lt;p&gt;$BDP = 带宽 × RTT$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际计算示例&lt;/strong&gt;：假设我们的宽带是 1 Gbps，而连接到北美西海岸服务器的 RTT 是 150 毫秒 (0.15 秒)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原始窗口（65535 字节）的最大理论吞吐量仅约为 3.49 Mbit/秒。&lt;/li&gt;
&lt;li&gt;根据 BDP 计算，我们需要的最优 TCP 窗口大小约为 18.75 MB。只有当窗口能扩展到 18.75 MB 时，我们才有机会跑满 1 Gbps 的带宽。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Windows 的解法：窗口自动调优&lt;/h2&gt;
&lt;p&gt;好消息是，微软早就意识到了这个问题。自 Windows Vista 以来，Windows 系统默认启用了一项名为 &lt;strong&gt;“TCP 自动调优接收窗口”（Receive Window Auto-Tuning）&lt;/strong&gt; 的功能。&lt;/p&gt;
&lt;h3&gt;自动调优的作用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;启用窗口缩放&lt;/strong&gt;：它利用 TCP 窗口缩放扩展（Window Scaling），打破了 64KB 的原始限制，允许窗口大小动态扩展到数 MB 甚至更高（最高可达 1 GiB）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态匹配 BDP&lt;/strong&gt;：Windows 系统会持续监测当前的网络 RTT 和应用程序的数据处理速度，智能地将 TCP 窗口大小调整到尽可能接近 BDP 的最优值。（当然是理论上）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;如何检查自动调优状态？&lt;/h3&gt;
&lt;p&gt;我们可以通过 PowerShell 或 CMD 运行以下命令，查看我们的 TCP 全局参数。请关注 “Receive Window Auto-Tuning Level” 的值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 在 Windows 10/11 的 PowerShell 或 CMD 中执行
netsh interface tcp show global
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果其值为 &lt;code&gt;normal&lt;/code&gt;，则表示自动调优已开启并处于正常工作状态。如果是 &lt;code&gt;disabled&lt;/code&gt;，执行下面的命令。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启用自动调优（仅在确认被禁用时使用）
netsh interface tcp set global autotuninglevel=normal
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. RFC 1323 TCP 扩展&lt;/h2&gt;
&lt;p&gt;RFC 1323（TCP Extensions for High Performance）是 TCP 的经典标准。定义了三个关键扩展，让 TCP 在高带宽、高时延（高 BDP）的情况保持一定的性能。&lt;/p&gt;
&lt;h3&gt;窗口缩放（Window Scaling）：&lt;/h3&gt;
&lt;p&gt;原始 TCP 的窗口字段只有 16 位，最多 65535 字节，在高 BDP 场景下（如 1Gbps 带宽 + 150ms RTT）根本不够用——窗口太小，数据流动缓慢。RFC 1323 引入窗口缩放选项，将窗口定义扩展到 32 位（约 4GB），通过一个缩放因子（scale factor，0-14，对应 2^0 到 2^14 倍）在 SYN 包中协商。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;协商机制&lt;/strong&gt;：连接建立时（SYN 段），发送方在 TCP 选项中声明 Window Scale（WSOPT，Kind=3，Length=3，Shift.cnt=缩放值）。接收方如果支持，也在 SYN-ACK 中回应相同的选项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能益处&lt;/strong&gt;：拿我们上面的示例来说（BDP=18.75MB），如果 Shift.cnt=14（16384 倍），16 位字段只需 1146（18.75MB / 16384）就可以覆盖整个Tunnel，避免带宽闲置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;：用 Wireshark 抓包查看 SYN 包的选项字段是否有 WSOPT ，确认缩放是否生效。&lt;/p&gt;
&lt;h3&gt;TCP 时间戳（Timestamps）：&lt;/h3&gt;
&lt;p&gt;高延迟网络下，RTT 估算不准会导致拥塞控制失灵，窗口调整迟钝。RFC 1323 的时间戳选项（TSOPT，Kind=8）在每个段中嵌入 32 位时间戳（TSval）和回显值（TSecr），用于两个目的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RTT 测量（RTTM）&lt;/strong&gt;：接收方回显发送方的 TSval，发送方计算精确 RTT（不受重传干扰），优化窗口增长和重传超时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;序列号包装保护（PAWS）&lt;/strong&gt;：在高吞吐量的情况下，32 位序列号容易wrap around，通过时间戳检查，过时的包会被丢弃，保证序列正常。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt;：时间戳虽然增加了 12 字节的开销，但感觉是利大于弊 —— Red Hat 等系统默认启用，能更好地估算 RTT ， Windows 也默认支持。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;时间戳可能泄露系统时钟，但 RFC 建议随机偏移来防止时序攻击，要自己考量&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;路径 MTU 发现（Path MTU Discovery）&lt;/h3&gt;
&lt;p&gt;虽然不是 RFC 1323 核心，但1323更新了 RFC 1191 的 PMTUD，支持了 DF（Don&apos;t Fragment）位和 ICMP 反馈，动态寻找链路里最大的传输单元（MTU）。这防止了分片开销，在高延迟链路中减少重传的次数。当我们用 VPN ， MTU 也不会乱序匹配，这确保了包大小自适应，避免“黑洞”路由出现。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RFC 1323 已于 2015 年被 RFC 7323 更新（obsoleted），但核心机制不变。 在 Windows 上，通过 netsh 命令来调整（比如打开 PMTUD）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;4. 还有什么要说的……&lt;/h2&gt;
&lt;h3&gt;常见瓶颈排查&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路由器/ISP 限制&lt;/strong&gt;：检查是否启用了 QoS 限制，或 ISP 的国际出口堵塞。可以用 &lt;code&gt;tracert google.com&lt;/code&gt; 看看高延迟的节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS&lt;/strong&gt;：测一下延迟，建议用低延迟的非运营商 DNS 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接方式&lt;/strong&gt;：优先用有线连接，减少 Wi-Fi 信号弱导致的衰减。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MTU&lt;/strong&gt;：默认 MTU 1500 适合大多数场景，但如果连续使用 VPN，可以试试修改：&lt;code&gt;netsh interface ipv4 set subinterface &quot;以太网&quot; mtu=1400 store=persistent&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;你在哪里&lt;/strong&gt;：地区的不同导致出口延迟不同，建议肉身横渡。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;额外优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;启用 CTCP（复合 TCP）&lt;/strong&gt;：增强拥塞控制：&lt;code&gt;netsh interface tcp set global congestionprovider=ctcp&lt;/code&gt;。在高带宽高延迟场景下更高效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;禁用 Nagle 算法&lt;/strong&gt;（游戏/Live）：&lt;code&gt;netsh interface tcp set global nagle=disabled&lt;/code&gt;。但这会增加小包开销，不适合文件传输，其实不太推荐。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VPN 优化&lt;/strong&gt;：如果经常用 VPN，选择 WireGuard 协议，会自动处理窗口缩放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;禁用代理（ProxyEnable）&lt;/strong&gt;：如果用不着代理服务器，那开启代理可能会增加额外延迟。通过注册表编辑器（regedit）导航到 &lt;code&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings&lt;/code&gt;，将 &lt;code&gt;ProxyEnable&lt;/code&gt; 的值设置为 &lt;code&gt;0&lt;/code&gt;（DWORD 类型）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;：&lt;br /&gt;
&lt;a href=&quot;https://www.ietf.org/rfc/rfc1323.txt&quot;&gt;ietf.org&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://knowledge.broadcom.com/external/article/167353/window-scaling-rfc-1323-support-on-the-e.html&quot;&gt;knowledge.broadcom.com&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ipapp/configuration/xe-16-12/iap-xe-16-12-book/iap-tcp.html&quot;&gt;cisco.com&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/description-tcp-features&quot;&gt;learn.microsoft.com&lt;/a&gt;
&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc7323.html&quot;&gt;rfc-editor.org&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>2025国庆</title><link>https://blog.chuwu.top/posts/2025-09-30/2025-national-day/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2025-09-30/2025-national-day/</guid><description>2025年的国庆假期到了</description><pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;又到国庆节了，终于放假了，但还是要学习&lt;/p&gt;
&lt;p&gt;出去吃了顿小巷子中的火锅，味道一般，但是每道菜的量好大啊&lt;/p&gt;
&lt;p&gt;讨厌调休&lt;/p&gt;
</content:encoded></item><item><title>苔痕的褶皱</title><link>https://blog.chuwu.top/posts/2025-02-05/moss-veined-folds/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2025-02-05/moss-veined-folds/</guid><description>苔痕的褶皱 - 也于是我迷失的记忆</description><pubDate>Wed, 05 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;苔痕的褶皱&lt;/h1&gt;
&lt;hr /&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;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;p&gt;如今的爷爷，不知何时也会和剥去米粒的稻谷一起飘然化作烟尘，我看不清楚。我能看到的只有他再也挺不起来的腰。&lt;/p&gt;
&lt;p&gt;由他保留着的、人家的那串钥匙都去哪里了呢。&lt;/p&gt;
&lt;p&gt;我家的房顶已经长满苔藓了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;附录&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;AI文本检测为0%
&lt;img src=&quot;./images/%E6%9C%B1%E9%9B%80AI%E7%94%9F%E6%88%90%E6%A3%80%E6%B5%8B.webp&quot; alt=&quot;朱雀AI生成检测&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>C语言考查笔记</title><link>https://blog.chuwu.top/posts/2023-11-23/c-access/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2023-11-23/c-access/</guid><description>初学C语言</description><pubDate>Thu, 23 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
&lt;strong&gt;考查目标&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;掌握 C 语言程序结构&lt;/li&gt;
&lt;li&gt;掌握 C 语言的基本数据类型及数据运算&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;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;1、C 语言程序的结构&lt;/h2&gt;
&lt;h3&gt;1.1 程序的构成, main 函数和其他函数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;程序的构成&lt;/strong&gt;: 一个 C 语言源程序由一个或多个源文件组成. 每个源文件可以由一个或多个函数组成.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主函数 (&lt;code&gt;main&lt;/code&gt; 函数)&lt;/strong&gt;: 一个源程序有且只能有一个 &lt;code&gt;main&lt;/code&gt; 函数, 它是主函数. 程序执行从 &lt;code&gt;main&lt;/code&gt; 开始, 并在 &lt;code&gt;main&lt;/code&gt; 中结束.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数组成&lt;/strong&gt;: 函数由两部分组成: 声明 (Declaration) 和定义 (Definition, 即函数体, 要执行的代码).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: &lt;code&gt;main&lt;/code&gt; 函数结构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# include &amp;lt;stdio.h&amp;gt; // 预处理命令, 载入头文件
int main() // 主函数
 
{
    printf(&quot;Hello World!&quot;); // 标准输出
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.2 头文件, 数据说明, 程序注释&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;头文件&lt;/strong&gt;: 预处理命令 (以 &lt;code&gt;#&lt;/code&gt; 开头) 通常应放在源文件或源程序的最前面.
&lt;ul&gt;
&lt;li&gt;例如, 使用 &lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/code&gt; 来获取标准输入输出函数.&lt;/li&gt;
&lt;li&gt;系统库中的头文件使用尖括号 &lt;code&gt;&amp;lt; &amp;gt;&lt;/code&gt; 引用; 本地目录中的头文件使用双引号 &lt;code&gt;&quot;&quot;&lt;/code&gt; 引用.&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;/ul&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;//&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多行注释（段注释符）&lt;/strong&gt;: 使用 &lt;code&gt;/* ... */&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意事项&lt;/strong&gt;: 多行注释不能嵌套, 否则会导致编译错误.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 变量定义与注释&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt; // 包含头文件

// 这是一个单行注释
/* 
多行注释:
用于注释跨多行的内容 
*/

const int MAX_LENGTH = 100; // 符号常量声明

int main() 
{
    int myNum = 15;   // 定义并初始化变量 myNum
    float myFloatNum; // 声明变量
    myFloatNum = 5.99; // 初始化变量

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 源程序的书写格式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语句结束符&lt;/strong&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;: C 语言区分大小写.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;书写规范&lt;/strong&gt;: 常用锯齿形书写格式. 建议花括号 &lt;code&gt;{}&lt;/code&gt; 对齐, 一行写一个语句, 使用 TAB 缩进, 有合适的空行, 以提升程序可读性.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2、数据类型及其运算&lt;/h2&gt;
&lt;h3&gt;2.1 C 语言的基本数据类型及定义方法&lt;/h3&gt;
&lt;p&gt;C 语言的数据类型可分为基本数据类型和派生 (扩展) 数据类型.&lt;/p&gt;
&lt;ul&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;int&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;int&lt;/code&gt;: 整型, 4 个字节 (32 位), 范围约为 -2,147,483,648 到 2,147,483,647.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;short&lt;/code&gt;: 短整型, 2 个字节 (16 位), 范围约为 -32,768 到 32,767.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;long&lt;/code&gt;: 长整型, 通常为 4 或 8 字节 (取决于系统和编译器). 范围约为 -2,147,483,648 到 2,147,483,647.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实型（浮点型）&lt;/strong&gt;: &lt;code&gt;float&lt;/code&gt; (单精度浮点型), &lt;code&gt;double&lt;/code&gt; (双精度浮点型), &lt;code&gt;long double&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;float&lt;/code&gt;: 4 个字节 (32 位), 精度约为 7 位十进制数.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;double&lt;/code&gt;: 8 个字节 (64 位), 精度约为 15-16 位十进制数.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;long double&lt;/code&gt;: 10、12 或 16 个字节, 具体取决于编译器, 精度更高.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字符型&lt;/strong&gt;: &lt;code&gt;char&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;char&lt;/code&gt;: 1 个字节 (8 位), 用于存储字符 (如字母、数字、标点符号等).&lt;/li&gt;
&lt;li&gt;字符型变量可以直接赋值字符常量 (如 &lt;code&gt;&apos;A&apos;&lt;/code&gt;, &lt;code&gt;&apos;1&apos;&lt;/code&gt;, &lt;code&gt;&apos;!&apos;&lt;/code&gt;), 也可以赋值对应的 ASCII 码值 (如 &lt;code&gt;65&lt;/code&gt;, &lt;code&gt;49&lt;/code&gt;, &lt;code&gt;33&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;布尔型&lt;/strong&gt;: &lt;code&gt;_Bool&lt;/code&gt; (&lt;code&gt;0&lt;/code&gt; 表示 &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt; 表示 &lt;code&gt;true&lt;/code&gt;).
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_Bool&lt;/code&gt; 类型占用 1 个字节 (8 位), 只能存储 &lt;code&gt;0&lt;/code&gt; 或 &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;布尔型变量通常用于条件判断和循环控制.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;派生/扩展类型&lt;/strong&gt;: 数组、指针、枚举 (&lt;code&gt;enum&lt;/code&gt;), 结构 (&lt;code&gt;struct&lt;/code&gt;), 联合 (&lt;code&gt;union&lt;/code&gt;) 等.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字符串&lt;/strong&gt;: 不是一种独立的数据类型, 通过字符数组或字符指针来实现. 以 \0 (空字符) 为结束标志.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 基本数据类型定义&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 定义并初始化整数变量
int myNum = 5;
// 定义并初始化浮点数变量
float myFloatNum = 5.99;
// 定义并初始化字符变量
char myLetter = &apos;D&apos;;
// 定义双精度浮点数
double myDouble = 3.2325467;
// 定义布尔型变量
_Bool myBool = 1;
// 定义并初始化字符串变量
char myString[] = &quot;Hello World!&quot;;
// 定义并初始化字符数组变量
char myCharArray[] = {&apos;H&apos;, &apos;e&apos;, &apos;l&apos;, &apos;l&apos;, &apos;o&apos;, &apos;\0&apos;};
// 定义并初始化指针变量
char *myPointer = &quot;Hello World!&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 C 语言运算符的种类、运算优先级和结合性&lt;/h3&gt;
&lt;p&gt;C 语言运算符的种类包括:&lt;/p&gt;
&lt;ul&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;*&lt;/code&gt; (乘), &lt;code&gt;/&lt;/code&gt; (除), &lt;code&gt;%&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;=&lt;/code&gt; (赋值), &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;-=&lt;/code&gt;, &lt;code&gt;*=&lt;/code&gt;, &lt;code&gt;/=&lt;/code&gt;, &lt;code&gt;%=&lt;/code&gt; 等. (a += b → a = a + b)
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自增运算符前置与后置的区别&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;++&lt;/code&gt; 和 &lt;code&gt;--&lt;/code&gt; 运算符放在变量前面 (如 &lt;code&gt;++i&lt;/code&gt;, &lt;code&gt;--i&lt;/code&gt;) 称为&lt;strong&gt;前置&lt;/strong&gt;, 先进行自增/自减操作, 再使用变量的值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;++&lt;/code&gt; 和 &lt;code&gt;--&lt;/code&gt; 运算符放在变量后面 (如 &lt;code&gt;i++&lt;/code&gt;, &lt;code&gt;i--&lt;/code&gt;) 称为&lt;strong&gt;后置&lt;/strong&gt;, 先使用变量的当前值, 再进行自增/自减操作&lt;/li&gt;
&lt;/ul&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;&amp;gt;&lt;/code&gt; (大于), &lt;code&gt;&amp;lt;&lt;/code&gt; (小于), &lt;code&gt;&amp;gt;=&lt;/code&gt; (大于或等于), &lt;code&gt;&amp;lt;=&lt;/code&gt; (小于或等于).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑运算符&lt;/strong&gt;: &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; (逻辑与), &lt;code&gt;||&lt;/code&gt; (逻辑或), &lt;code&gt;!&lt;/code&gt; (逻辑非). 优先级为 &lt;code&gt;!&lt;/code&gt; 优于 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 优于 &lt;code&gt;||&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;条件运算符&lt;/strong&gt;: &lt;code&gt;? :&lt;/code&gt;, 是 C 语言中唯一的三目运算符.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;位运算符&lt;/strong&gt;: 双目 &lt;code&gt;&amp;amp;&lt;/code&gt; (按位与), &lt;code&gt;|&lt;/code&gt; (按位或), &lt;code&gt;^&lt;/code&gt; (异或), &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; (左移), &lt;code&gt;&amp;gt;&amp;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;*&lt;/code&gt; (取内容/解引用), &lt;code&gt;&amp;amp;&lt;/code&gt; (取地址). 注意: &lt;code&gt;*&lt;/code&gt; 也可作乘法 (双目), &lt;code&gt;&amp;amp;&lt;/code&gt; 也可作按位与 (双目), 以具体用法为准.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求字节数运算符&lt;/strong&gt;: &lt;code&gt;sizeof&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 重要运算符的使用&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 算术运算符和前置/后置
int a = 5, b = 3;
int sum = a + b;        // 加法

// 前置和后置自增
int x = 10;
int y = ++x;  // x 先自增为 11, 然后赋值给 y, y = 11
int z = x++;  // x 的当前值 11 赋值给 z, 然后 x 自增为 12, z = 11

// 关系运算符
int result1 = (a &amp;gt; b);  // result1 = 1 (true)
int result2 = (a == b); // result2 = 0 (false)

// 逻辑运算符
// 可以对表达式、单个数字或变量进行逻辑运算
int result3 = (a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;lt; 10);  // result3 = 1 (true)
int result4 = (a &amp;lt; 0 || b &amp;gt; 10);  // result4 = 0 (false)
int result5 = !(a == b);          // result5 = 1 (true)
int result6 = !a || b;            // result6 = 1 (true), 因为 !a 为 0, 0 || 3 为真

// 条件运算符
int max = (a &amp;gt; b) ? a : b;  // 条件为真返回 a, max = 5

// 位运算符
int bitwise_and = a &amp;amp; b;   // 按位与: 对应位都为 1 时结果为 1, 否则为 0, 这里 5 &amp;amp; 3 = 1 (二进制: 101 &amp;amp; 011 = 001)
int bitwise_or = a | b;    // 按位或: 对应位有一个为 1 时结果为 1, 否则为 0, 这里 5 | 3 = 7 (二进制: 101 | 011 = 111)
int left_shift = a &amp;lt;&amp;lt; 1;   // 左移 1 位: 相当于乘以 2, 例如 5 &amp;lt;&amp;lt; 1 = 10 (二进制: 101 &amp;lt;&amp;lt; 1 = 1010)

// 指针运算符
int *ptr = &amp;amp;a;  // ptr 是一个指针变量, 它存储了变量 a 的内存地址
int value = *ptr;  // 通过指针获取 a 的值, value = 5

// sizeof 运算符
int size = sizeof(int);  // size = 4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 不同类型数据间的转换与运算&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动转换（隐式转换）——考试核心原则&lt;/strong&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;小整数先升级&lt;/strong&gt;: &lt;code&gt;char&lt;/code&gt;、&lt;code&gt;short&lt;/code&gt; 在运算前会先被&lt;strong&gt;提升为 &lt;code&gt;int&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浮点“吞”整数&lt;/strong&gt;: &lt;code&gt;float&lt;/code&gt; 或 &lt;code&gt;double&lt;/code&gt; 与整数运算时, 整数会被转换为浮点型; 其中 &lt;code&gt;float&lt;/code&gt; 参与运算通常会进一步提升为 &lt;code&gt;double&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复杂情况&lt;/strong&gt;: 有符号（如 &lt;code&gt;int&lt;/code&gt;）与无符号整型（如 &lt;code&gt;unsigned int&lt;/code&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;/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;/li&gt;
&lt;li&gt;运算过程中, 自动类型提升: 低精度数据类型向高精度数据类型转换.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 类型转换&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int a = 2, b = 5;
double x, y, z;

x = b / a;        // 隐式转换: b/a 先进行整型除法 (2), 然后赋值给 double 型 x, x = 2.0
y = (double)b / a; // 强制转换: 先将 b 转化为 double 型 (5.0), 然后进行浮点数除法, y = 2.5
z = (double)(b / a); // 强制转换: 先计算整型除法 (2), 然后将结果 2 转化为 double 型, z = 2.0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4 C 语言表达式类型和求值规则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;赋值表达式&lt;/strong&gt;: 将右侧的值赋给左侧的变量, 例如 &lt;code&gt;x = 5&lt;/code&gt;. 赋值号具有结合性, 如 &lt;code&gt;x=y=3&lt;/code&gt; 等价于 &lt;code&gt;y=3; x=y;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算术表达式&lt;/strong&gt;: 使用算术运算符连接常量和变量, 例如 &lt;code&gt;sum = x + y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关系表达式&lt;/strong&gt;: 使用关系运算符进行比较, 返回 1 (真) 或 0 (假).&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;&amp;amp;&amp;amp;&lt;/code&gt;, 如果左侧为假, 则不再计算右侧; 对于 &lt;code&gt;||&lt;/code&gt;, 如果左侧为真, 则不再计算右侧.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;条件表达式（三元运算符）&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;语法: &lt;code&gt;(条件表达式) ? 表达式1 : 表达式2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;求值规则: 如果条件表达式为真, 返回表达式 1 的值, 否则返回表达式 2 的值.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逗号表达式&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;语法: &lt;code&gt;表达式1, 表达式2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;求值规则: 先计算表达式 1, 再计算表达式 2, 并将表达式 2 的值作为整个表达式的结果.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 条件表达式（三元运算符）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int time = 20;

int main() {
    (time &amp;lt; 18) ? printf(&quot;再会!&quot;) : printf(&quot;晚上好!&quot;); // 输出 -&amp;gt; &quot;晚上好!&quot;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 逗号表达式&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int a = 2, b;

int main() {
    a = 3 * 5, a + 10; // a=15, 整个表达式结果是 15+10=25, 但后面的 a+10 未赋值, 丢弃
    b = (3 * 5, a + 10); // 使用括号, 3*5=15 (未赋值, 丢弃), 然后 a+10=25, b=25
    printf(&quot;a = %d, b = %d\n&quot;, a, b);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3、基本语句&lt;/h2&gt;
&lt;h3&gt;3.1 表达式语句, 空语句, 复合语句&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;code&gt;;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复合语句&lt;/strong&gt;: 将多个语句用花括号 &lt;code&gt;{}&lt;/code&gt; 括起来组成的一个语句. 通常用于 &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt; 等结构中, 作为循环体或条件体.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 输入输出函数的调用, 正确输入数据并正确设计输出格式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输出函数的调用&lt;/strong&gt;: 使用 &lt;code&gt;printf()&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;语法: &lt;code&gt;printf(&quot;格式控制字符串&quot;, 输出变量列表);&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输入函数的调用&lt;/strong&gt;: 使用 &lt;code&gt;scanf()&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;语法: &lt;code&gt;scanf(&quot;格式控制字符串&quot;, 输入变量地址列表);&lt;/code&gt;. 注意最后一个参数是变量的地址列表.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;格式说明符&lt;/strong&gt; (作用): 充当变量输出时的占位符, 用于指定变量的输出格式.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%d&lt;/code&gt; 或 &lt;code&gt;%i&lt;/code&gt;: &lt;code&gt;int&lt;/code&gt; 整数 (10 进制).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%u&lt;/code&gt;: 无符号十进制整数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%f&lt;/code&gt;: &lt;code&gt;float&lt;/code&gt; 浮点数 (小数形式).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%.2f&lt;/code&gt;: 浮点数保留2位小数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%lf&lt;/code&gt;: &lt;code&gt;double&lt;/code&gt; 高精度浮点数据.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%c&lt;/code&gt;: &lt;code&gt;char&lt;/code&gt; 字符.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%s&lt;/code&gt;: 字符串.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%.5s&lt;/code&gt;: 字符串最多输出5个字符&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出格式设计（宽度控制）&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;%md&lt;/code&gt; 或 &lt;code&gt;%-md&lt;/code&gt; 控制输出宽度 &lt;code&gt;m&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%md&lt;/code&gt;: 最少占 &lt;code&gt;m&lt;/code&gt; 个字符宽度, 默认右对齐.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%-md&lt;/code&gt;: 最少占 &lt;code&gt;m&lt;/code&gt; 个字符宽度, 左对齐.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 输入输出及格式控制&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main()
{
    int myNum;
    float f = 5.99;
    
    // 输出
    printf(&quot;Number = %d\n&quot;, (int)f); // 输出整数, 5
    printf(&quot;Value = %.2f\n&quot;, f); // 输出浮点数, 保留两位小数, 5.99
    
    // 输出格式控制（左对齐, 宽度为 9）
    int a1 = 20;
    printf(&quot;%-9d\n&quot;, a1); // 输出 20, 左对齐, 宽度为 9

    // 输入
    printf(&quot;请输入一个数字: \n&quot;);
    scanf(&quot;%d&quot;, &amp;amp;myNum); // 获取并保存用户输入的号码, 需要使用 &amp;amp; 引用运算符
    printf(&quot;您输入的数字: %d\n&quot;, myNum);
    
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4、选择结构程序设计&lt;/h2&gt;
&lt;h3&gt;4.1 用 if 语句实现选择结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;if 语句&lt;/strong&gt;: 用于根据条件执行代码块.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;if...else 语句&lt;/strong&gt;: 在 &lt;code&gt;if&lt;/code&gt; 条件不满足时执行 &lt;code&gt;else&lt;/code&gt; 代码块.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;else if 语句&lt;/strong&gt;: 用于检查多个条件.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: if-else if-else 结构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int time = 22;
if (time &amp;lt; 10) {
    printf(&quot;早上好!&quot;);
} else if (time &amp;lt; 20) {
    printf(&quot;再会!&quot;);
} else {
    printf(&quot;晚上好!&quot;); // 输出 -&amp;gt; &quot;晚上好!&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 用 switch 语句实现多分支选择结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;switch 语句&lt;/strong&gt;: 根据表达式的值跳转到匹配的 &lt;code&gt;case&lt;/code&gt; 标签.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;表达式类型&lt;/strong&gt;: &lt;code&gt;switch&lt;/code&gt; 表达式可以是整型、字符型和枚举型.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;break&lt;/code&gt; 语句&lt;/strong&gt;: 匹配到 &lt;code&gt;case&lt;/code&gt; 后执行相应代码, 并通过 &lt;code&gt;break&lt;/code&gt; 跳出 &lt;code&gt;switch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;default&lt;/code&gt; 语句&lt;/strong&gt;: 如果没有匹配到任何 &lt;code&gt;case&lt;/code&gt;, 则执行 &lt;code&gt;default&lt;/code&gt; 语句 (如果存在). &lt;code&gt;default&lt;/code&gt; 不是必需的.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;贯穿现象&lt;/strong&gt;: 如果没有 &lt;code&gt;break&lt;/code&gt;, 程序会继续执行下一个 &lt;code&gt;case&lt;/code&gt; 的代码. 这种特性被称为“贯穿” (fallthrough), 有时被故意用于让多个 &lt;code&gt;case&lt;/code&gt; 共享同一段执行代码.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: switch 结构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int day = 4;
switch (day) {
    case 3:
        printf(&quot;周三&quot;);
        break;
    case 4:
        printf(&quot;周四&quot;); // 匹配到 case 4
        break; // 跳出 switch
    default:
        printf(&quot;期待周末&quot;);
}
// 输出 -&amp;gt; &quot;周四&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 选择结构的嵌套&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;if&lt;/code&gt; 语句可以嵌套.&lt;/li&gt;
&lt;li&gt;嵌套时, 每一层 &lt;code&gt;if&lt;/code&gt; 都要和 &lt;code&gt;else&lt;/code&gt; 配套, 若没有 &lt;code&gt;else&lt;/code&gt;, 则需要将该层 &lt;code&gt;if&lt;/code&gt; 语句用 &lt;code&gt;{}&lt;/code&gt; 括起来.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: if 嵌套&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int time = 10;
if (time &amp;gt; 8) {
    // 嵌套一个 if
    if (time &amp;lt; 12) {
        printf(&quot;中午好!&quot;); // 输出 -&amp;gt; &quot;中午好!&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5、循环结构程序设计&lt;/h2&gt;
&lt;h3&gt;5.1 for 循环结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;for&lt;/code&gt; 循环结构包含三个表达式: 初始化语句 (表达式 1, 只执行一次), 循环条件表达式 (表达式 2, 每次循环前检查), 调整操作 (表达式 3, 循环体执行后执行).&lt;/li&gt;
&lt;li&gt;当条件表达式 (表达式 2) 为假时, &lt;code&gt;for&lt;/code&gt; 循环结束.&lt;/li&gt;
&lt;li&gt;三个表达式都不是必须的, 但分号不能省略. 如果表达式 2 为空, 则表示无限循环.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: for 循环&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int i;
for (i = 0; i &amp;lt; 5; i++) { // i=0 (初始化), i&amp;lt;5 (循环条件), i++ (调整操作)
    printf(&quot;%d\n&quot;, i);
}
// 输出 -&amp;gt; 0 1 2 3 4

// 省略表达式1（初始化在外部进行）
int i = 0;
for (; i &amp;lt; 5; i++) {
    printf(&quot;%d\n&quot;, i);
}

// 省略表达式3（调整操作在循环体内进行）
for (i = 0; i &amp;lt; 5;) {
    printf(&quot;%d\n&quot;, i);
    i++;
}

// 省略表达式2（无限循环）
for (i = 0; ; i++) {
    if (i &amp;gt;= 5) break;  // 需要用break来跳出循环
    printf(&quot;%d\n&quot;, i);
}

// 三个都省略（必须有办法跳出循环）
for (;;) {
    printf(&quot;无限循环&quot;);
    break;  // 必须有退出条件
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 while 和 do-while 循环结构&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特征&lt;/th&gt;
&lt;th&gt;&lt;code&gt;while&lt;/code&gt; 循环&lt;/th&gt;
&lt;th&gt;&lt;code&gt;do-while&lt;/code&gt; 循环&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;控制类型&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;入口控制循环 (Entry-Controlled)&lt;/td&gt;
&lt;td&gt;出口控制循环 (Exit-Controlled)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&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;td&gt;在循环体执行&lt;strong&gt;后&lt;/strong&gt;检查&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;执行保证&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;可能执行 &lt;strong&gt;0&lt;/strong&gt; 次或多次&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;至少&lt;/strong&gt;执行 &lt;strong&gt;1&lt;/strong&gt; 次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;语法结尾&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;}&lt;/code&gt; 后无分号&lt;/td&gt;
&lt;td&gt;&lt;code&gt;while(条件)&lt;/code&gt; 后&lt;strong&gt;有&lt;/strong&gt;分号&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;示例代码: while 循环&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int i = 0;
while (i &amp;lt; 5) {
    printf(&quot;%d\n&quot;, i); // 初始条件为假时，循环体不执行
    i++;
}
// 输出 -&amp;gt; 0 1 2 3 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: do-while 循环&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int i = 0;
do {
    printf(&quot;%d\n&quot;, i);
    i++;
} while (i &amp;lt; 5); // ← 注意：分号不能省略，这是必须的
// 输出 -&amp;gt; 0 1 2 3 4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 continue 语句和 break 语句&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;break&lt;/code&gt; 语句&lt;/strong&gt;: 跳出当前 &lt;code&gt;循环&lt;/code&gt; 或 &lt;code&gt;switch&lt;/code&gt; 语句, 执行后续代码.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;continue&lt;/code&gt; 语句&lt;/strong&gt;: 跳过当前循环的剩余语句, 直接进入下一次循环.&lt;/li&gt;
&lt;li&gt;通常与 &lt;code&gt;if&lt;/code&gt; 语句配合使用.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: break 语句&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int i;
for (i = 0; i &amp;lt; 10; i++) {
    if (i == 4) {
        break; // 当 i=4 时跳出循环
    }
    printf(&quot;%d\n&quot;, i);
}
// 输出 -&amp;gt; 0 1 2 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: continue 语句&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int i;
for (i = 0; i &amp;lt; 10; i++) {
    if (i == 4) {
        continue; // 当 i=4 时跳过本次循环的剩余部分 (即跳过 printf)
    }
    printf(&quot;%d\n&quot;, i);
}
// 输出 -&amp;gt; 0 1 2 3 5 6 7 8 9
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.4 循环的嵌套&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;p&gt;&lt;strong&gt;示例代码: 循环嵌套 (遍历二维数组)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int N = 5;
// 假设 A 是一个 N x N 的二维数组, 外部循环控制行, 内部循环控制列 
for(int i = 0; i &amp;lt; N; i++) 
{
    for(int j = 0; j &amp;lt; N; j++) 
    {
    printf(&quot;%d &quot;, A[i][j]); // 循环体语句, 访问 A[i][j]
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 循环嵌套 (九九乘法表)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (int i = 1; i &amp;lt;= 9; i++) { // 外层循环控制行
    for (int j = 1; j &amp;lt;= i; j++) { // 内层循环控制列
        printf(&quot;%d*%d=%2d &quot;, j, i, i*j); // %2d 表示右对齐，占两个宽度
    }
    printf(&quot;&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6、数组的定义和引用&lt;/h2&gt;
&lt;h3&gt;6.1 一维数组的定义、初始化和数组元素的引用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;: 一维数组的声明格式为 &lt;code&gt;类型标识符 数组名[n]&lt;/code&gt;, 其中 &lt;code&gt;n&lt;/code&gt; 是一个正整数常量, 表示数组的长度. (声明时指定长度不可省略, 但初始化时可省略长度由编译器自动推断.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引用&lt;/strong&gt;: 通过 &lt;code&gt;数组名[k]&lt;/code&gt; 引用数组元素, 下标 &lt;code&gt;k&lt;/code&gt; 的合法取值范围是从 &lt;code&gt;0&lt;/code&gt; 到 &lt;code&gt;n-1&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;[n]&lt;/code&gt;, 编译器会根据初始化列表的元素个数自动确定数组长度.&lt;/li&gt;
&lt;li&gt;可以只初始化部分元素, 未被初始化的元素将被自动赋值为 0.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 一维数组的定义和引用&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    // 定义并完全初始化
    int nums1[] = {10, 20, 30, 40};  // 自动推断长度为4
    
    // 定义固定长度数组（部分初始化）
    int nums2[5] = {1, 2};           // [1,2,0,0,0]
    
    // 访问元素
    printf(&quot;第一个元素: %d\n&quot;, nums1[0]);  // 输出: 10 
    // 修改元素
    nums1[0] = 100;
    printf(&quot;修改后: %d\n&quot;, nums1[0]);     // 输出: 100
    
    // 遍历数组（需获取长度）
    // 注意：此方法仅适用于函数内定义的局部数组，不适用于函数参数（参数会退化为指针）
    int length = sizeof(nums1) / sizeof(nums1[0]);
    printf(&quot;数组长度: %d\n&quot;, length);     // 输出: 4
    
    printf(&quot;遍历数组:&quot;);
    for(int i = 0; i &amp;lt; length; i++) {
        printf(&quot; %d&quot;, nums1[i]);         // 输出: 100 20 30 40
    }
    
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.2 二维数组的定义、初始化和数组元素的引用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;: 二维数组声明格式为 &lt;code&gt;类型标识符 变量名[m][n]&lt;/code&gt;, 声明一个 $m$ 行 $n$ 列的二维数组.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引用&lt;/strong&gt;: 通过 &lt;code&gt;变量名[i][j]&lt;/code&gt; 引用元素, 其中 $i$ 为行下标 (0 到 $m-1$), $j$ 为列下标 (0 到 $n-1$).&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;p&gt;&lt;strong&gt;示例代码: 二维数组的定义和引用&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    // 1. 定义并初始化二维数组（2行3列）
    int matrix[2][3] = { 
    // 2. int matrix2[][3] 省略行数, 自动推断为2行
        {1, 3, 5},   // 第一行
        {2, 6, 10}   // 第二行
    };
    
    // 3. 连续初始化方式
    int matrix3[2][3] = {1, 2, 3, 4, 5, 6}; // 等价于{{1,2,3},{4,5,6}}
    
    // 4. 访问元素：获取第二行第一列的元素（值为2）
    printf(&quot;matrix[1][0] = %d\n&quot;, matrix[1][0]);  // 输出: 2
    
    // 5. 修改元素：将第一行第二列的元素改为100
    matrix[0][1] = 100;
    printf(&quot;修改后: matrix[0][1] = %d\n&quot;, matrix[0][1]);  // 输出: 100
    
    // 6. 遍历二维数组
    // 注意：此方法仅适用于局部数组，不适用于函数参数
    int rows = sizeof(matrix) / sizeof(matrix[0]);     // 计算行数
    int cols = sizeof(matrix[0]) / sizeof(matrix[0][0]); // 计算列数
    
    printf(&quot;遍历matrix数组:&quot;);
    for(int i = 0; i &amp;lt; rows; i++) {
        for(int j = 0; j &amp;lt; cols; j++) {
            printf(&quot;%d\t&quot;, matrix[i][j]); // 使用制表符对齐
        }
        printf(&quot;&quot;); // 每行结束后换行
    }
    /* 输出:
        1       100     5
        2       6       10
    */
    
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 字符串与字符数组&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;字符串本质&lt;/strong&gt;: 在 C 语言中, 字符串是以 &lt;code&gt;\0&lt;/code&gt; 结尾的字符数组, 而不是一种单独的数据类型. &lt;code&gt;\0&lt;/code&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;pre&gt;&lt;code&gt;// 单引号定义并初始化字符
char c = &apos;a&apos;;
printf(&quot;%c\n&quot;, c); // 输出 &apos;a&apos;

// 双引号定义并初始化字符串 (会自动添加 \0)
char greetings[] = &quot;Hello World!&quot;;
printf(&quot;%s\n&quot;, greetings);

// 字符数组初始化 (手动添加, 显式包含 \0)
char greetings2[] = {&apos;H&apos;, &apos;e&apos;, &apos;l&apos;, &apos;l&apos;, &apos;\0&apos;};
printf(&quot;%s\n&quot;, greetings2); // 输出 &quot;Hell&quot;

// 访问/修改字符串中的字符
char greetings3[] = &quot;Hello&quot;;
printf(&quot;%c\n&quot;, greetings3[0]); // 访问第一个字符 &apos;H&apos;
greetings3[0] = &apos;J&apos;; // 修改第一个字符为 &apos;J&apos;
printf(&quot;%s\n&quot;, greetings3); // 输出 &quot;Jello&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.4 使用一维数组解决批量数据查找或排序等问题&lt;/h3&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;若数组有序, 采用折半查找 ( 二分查找 ), 效率更高&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 顺序查找&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// a 为数组, n 为长度, num 为待查找元素
int found = 0; // 标志变量, 是否找到
for (int i = 0; i &amp;lt; n; i++) { // 从头到尾遍历数组
    if (a[i] == num) { // 如果找到
        found = 1;
        break; // 跳出循环
    }
}
// found==1 表示找到, 否则未找到
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 折半查找 ( 数组有序 )&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// a 为有序数组, n 为长度, num 为待查找元素
int low = 0, high = n - 1, found = 0; // 初始化区间和标志
while (low &amp;lt;= high) { // 只要区间不为空
    int mid = (low + high) / 2; // 取中间下标
    if (a[mid] == num) { // 找到
        found = 1;
        break;
    }
    else if (num &amp;gt; a[mid])
        low = mid + 1; // 在右半区间查找
    else
        high = mid - 1; // 在左半区间查找
}
// found==1 表示找到, 否则未找到
&lt;/code&gt;&lt;/pre&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;p&gt;&lt;strong&gt;示例代码: 选择排序:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// a 为数组, n 为长度
for (int i = 0; i &amp;lt; n - 1; i++) { // 外层循环, 控制趟数
    for (int j = i + 1; j &amp;lt; n; j++) { // 内层循环, 找最小值
        if (a[j] &amp;lt; a[i]) { // 如果有更小的值
            int t = a[j]; a[j] = a[i]; a[i] = t; // 交换元素
        }
    }
}
// 排序后数组 a 升序排列
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 冒泡排序:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// a 为数组, n 为长度
for (int i = 0; i &amp;lt; n - 1; i++) { // 外层循环, 控制趟数
    for (int j = 0; j &amp;lt; n - 1 - i; j++) { // 内层循环, 相邻元素比较
        if (a[j] &amp;gt; a[j + 1]) { // 如果前面的比后面大
            int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; // 交换元素
        }
    }
}
// 排序后数组 a 升序排列
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 插入排序:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// a 为数组, n 为长度
for (int i = 1; i &amp;lt; n; i++) { // 从第二个元素开始
    int k = a[i]; // 待插入元素
    int j = i - 1; // 比较的元素下标
    while (j &amp;gt;= 0 &amp;amp;&amp;amp; k &amp;lt; a[j]) { // 向前查找插入位置
        a[j + 1] = a[j]; // 后移
        j--; // 继续向前比较
    }
    a[j + 1] = k; // 插入到合适位置
}
// 排序后数组 a 升序排列
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7、函数定义与调用&lt;/h2&gt;
&lt;h3&gt;7.1 库函数的正确调用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;C 语言的系统库中提供了几百个函数可供程序员直接使用.&lt;/li&gt;
&lt;li&gt;使用库函数时, 要包含相应的头文件. 例如:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;stdio.h&amp;gt;&lt;/code&gt;: &lt;code&gt;printf()&lt;/code&gt; (格式化输出), &lt;code&gt;scanf()&lt;/code&gt; (格式化输入) .&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;math.h&amp;gt;&lt;/code&gt;: &lt;code&gt;sqrt()&lt;/code&gt; (平方根), &lt;code&gt;pow()&lt;/code&gt; (幂运算), &lt;code&gt;fabs()&lt;/code&gt; (绝对值) .&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;stdlib.h&amp;gt;&lt;/code&gt;: &lt;code&gt;rand()&lt;/code&gt; (伪随机整数), &lt;code&gt;srand()&lt;/code&gt; (设置种子) .&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;string.h&amp;gt;&lt;/code&gt;: &lt;code&gt;strlen()&lt;/code&gt; (字符串长度), &lt;code&gt;strcpy()&lt;/code&gt; (字符串复制) .&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;time.h&amp;gt;&lt;/code&gt;: &lt;code&gt;time()&lt;/code&gt; (获取当前时间), &lt;code&gt;clock()&lt;/code&gt; (获取处理器时间) .&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 调用库函数&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;math.h&amp;gt; // 需要包含 math.h 头文件

int main()
{
    // 调用库函数 sqrt (平方根)
    printf(&quot;%f&quot;, sqrt(16)); // 输出 4.000000
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.2 用户自定义函数的定义、类型与返回值&lt;/h3&gt;
&lt;ul&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;类型标识符 函数名(形式参数列表)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数体&lt;/strong&gt;: 包含要执行的代码.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数类型与返回值&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;函数的类型 (即返回值的类型) 由函数头前的“类型标识符”指明.&lt;/li&gt;
&lt;li&gt;若没有返回值, 则使用 &lt;code&gt;void&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;函数返回值通过 &lt;code&gt;return&lt;/code&gt; 语句给出. 若函数无返回值, 可以不写 &lt;code&gt;return&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 自定义函数定义与返回值&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 函数定义: 返回 int 类型, 接受两个 int 参数
int myFunction(int x, int y) 
{
    return x + y; // 返回 x 和 y 的和
}

// 无返回值函数定义 (使用 void)
void greetUser(char name[]) 
{
    printf(&quot;Hello %s\n&quot;, name);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.3 函数的正确调用、参数的值传递&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;函数调用&lt;/strong&gt;: 语法为 &lt;code&gt;函数名(实际参数列表)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;形式参数 (形参)&lt;/strong&gt;: 在函数定义时列出的参数, 它们本质上是局部变量, 仅在函数体内有效. 例如 &lt;code&gt;void fun(int k)&lt;/code&gt; 中的 &lt;code&gt;k&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实际参数 (实参)&lt;/strong&gt;: 在函数调用时传入的值或表达式, 例如 &lt;code&gt;fun(i)&lt;/code&gt; 中的 &lt;code&gt;i&lt;/code&gt;, 实参可以是局部变量、全局变量、常量/表达式.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;值传递&lt;/strong&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;strong&gt;地址传递（数组）&lt;/strong&gt;: 将整个数组传递给被调函数时, 传递的是数组的首地址.
&lt;ul&gt;
&lt;li&gt;在函数中对形参数组的任何修改都会影响到实参数组.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 形参 (局部) 与实参的来源&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// fun 的 k 是形参（局部变量）
void fun(int k) {
    printf(&quot;fun received %d\n&quot;, k);
}

int main() {
    int i = 5; // main 内部的局部变量
    fun(i);    // i 作为实参传入
    fun(10);   // 常量 10 作为实参传入
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 函数调用与值传递&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 假设 myFunction 已定义为 int myFunction(int x, int y) { return x + y; }
int main() 
{
    // 调用函数并将结果打印
    printf(&quot;结果: %d&quot;, myFunction(5, 3)); // 传递 5 和 3 的值作为实参

    int result = myFunction(5, 3); // 将结果存储在变量中

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.4 函数的嵌套调用、递归调用&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;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 嵌套调用（简单加法）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int add(int a, int b);

int main() 
{
    printf(&quot;结果: %d&quot;, add(add(1, 2), 3)); // 嵌套调用 add 函数
    return 0;
}

int add(int a, int b) 
{
    return a + b;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 递归调用（简单递归求和）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int sum(int n);

int main() 
{
    printf(&quot;结果: %d&quot;, sum(5)); // 计算 1+2+3+4+5
    return 0;
}

int sum(int n) 
{
    if (n == 0) {
        return 0; // 基础情况
    } else {
        return n + sum(n - 1); // 递归调用自身
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.5 局部变量与全局变量&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;li&gt;&lt;strong&gt;外部变量声明&lt;/strong&gt;: 若要在其他文件中使用未定义的全局变量, 则需声明其为外部变量, 使用 &lt;code&gt;extern 数据类型名 变量名&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 局部变量与全局变量&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int k_global = 2; // 全局变量

int main() 
{
    int i = 5; // 局部变量
    int x; 
    x = i + k_global; 
    printf(&quot;x=%d\n&quot;, x); // 使用全局变量 k_global, x = 7

    {
        int k_global = 16; // 语句块内的局部变量 (与全局变量同名)
        x = i + k_global;
        printf(&quot;x=%d\n&quot;, x); // 优先使用局部变量, x = 5 + 16 = 21
    }
    
    x = i + k_global;
    printf(&quot;x=%d\n&quot;, x); // 语句块结束后, 恢复使用全局变量 k_global, x = 7

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例代码: 外部变量声明&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 示例：
// file1
int globalVar = 10; // 定义全局变量

// file2
#include &amp;lt;stdio.h&amp;gt;

extern int globalVar; // 声明外部变量
void printGlobalVar() {
    printf(&quot;%d\n&quot;, globalVar);
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Charlotte-Markdown</title><link>https://blog.chuwu.top/posts/2018-10-30/charlotte-markdown/</link><guid isPermaLink="true">https://blog.chuwu.top/posts/2018-10-30/charlotte-markdown/</guid><description>Charlotte-Markdown 是 Charlotte 主题的 Markdown 语法说明文档</description><pubDate>Tue, 30 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Charlotte-Markdown 使用说明&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本文直接参考&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt;的相关指南&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;s&gt;其实是为了防止未来的自己忘了该怎么写Post&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;封面： &lt;a href=&quot;https://www.pixiv.net/artworks/133535742&quot;&gt;Collector&lt;/a&gt; by &lt;a href=&quot;https://www.pixiv.net/users/2642047&quot;&gt;Ashima&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;创建文章&lt;/h1&gt;
&lt;h2&gt;文章元数据&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: Charlotte-Markdown
published: 2018-10-30
description: &apos;Charlotte-Markdown 是 Charlotte 主题的 Markdown 语法说明文档&apos;
image: &apos;./Markdown.webp&apos;
tags: [Charlotte, 公告, Markdown]
category: &apos;公告&apos;
draft: false 
lang: &apos;&apos;
---
&lt;/code&gt;&lt;/pre&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;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章发表时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章简介。 会显示在主页上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章封面图   1. 以 &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;https://&lt;/code&gt;开头: 使用网络图片   2. 以 &lt;code&gt;/&lt;/code&gt;: 开头来使用 &lt;code&gt;public&lt;/code&gt; 中的图片   3. 没有任何前缀：使用相对于Markdown文件的图片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章的标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章的分类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;或者&lt;code&gt;false&lt;/code&gt;。是否为草稿。如果为&lt;code&gt;true&lt;/code&gt;，则不会显示在主页上。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;发布文章的存放位置&lt;/h2&gt;
&lt;p&gt;你发布的文章应当在 &lt;code&gt;src/content/posts/&lt;/code&gt; 目录下. 你也可以创建一个子目录，用来存放文章和文章中的资源。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Markdown 语法&lt;/h1&gt;
&lt;h1&gt;这是一个 h1 标题&lt;/h1&gt;
&lt;h2&gt;这是一个 h2 标题&lt;/h2&gt;
&lt;h3&gt;这是一个 h3 标题&lt;/h3&gt;
&lt;p&gt;段落之间用空行分隔。（或双空格+换行进行内部换行）&lt;/p&gt;
&lt;p&gt;这是第二段 &lt;em&gt;斜体&lt;/em&gt;、&lt;strong&gt;粗体&lt;/strong&gt;和 &lt;code&gt;代码行&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;无序列表&lt;/h1&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;h1&gt;有序列表&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;第一项&lt;/li&gt;
&lt;li&gt;第二项&lt;/li&gt;
&lt;li&gt;第三项&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;嵌套列表&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先有这两个对象&lt;/p&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;p&gt;一定要记住&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不能忘&lt;/p&gt;
&lt;p&gt;&lt;code&gt;找到我&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;说晚安&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;链接和脚注&lt;/h1&gt;
&lt;p&gt;这里有一个链接到 &lt;a href=&quot;http://bilibili.com&quot;&gt;一个网站&lt;/a&gt;、&lt;a href=&quot;example.md&quot;&gt;本地文档&lt;/a&gt; 和 &lt;a href=&quot;#%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA-h3-%E6%A0%87%E9%A2%98&quot;&gt;当前文档中的某个章节标题&lt;/a&gt;。这里有一个脚注&lt;a href=&quot;%E8%BF%99%E6%98%AF%E8%84%9A%E6%B3%A8%E7%9A%84%E7%A4%BA%E4%BE%8B%E5%86%85%E5%AE%B9%EF%BC%8C%E7%82%B9%E5%87%BB%E8%84%9A%E6%B3%A8%E5%BC%95%E7%94%A8%E4%BC%9A%E8%B7%B3%E8%BD%AC%E5%88%B0%E8%BF%99%E9%87%8C%E3%80%82%EF%BC%88%E6%98%BE%E7%A4%BA%E5%9C%A8Post%E6%9C%80%E5%90%8E%EF%BC%89&quot;&gt;^1&lt;/a&gt;。&lt;/p&gt;
&lt;h1&gt;图片引用&lt;/h1&gt;
&lt;h2&gt;Markdown 语法引入图片&lt;/h2&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![头像图片](/favicon/icon_256.webp &quot;我的头像&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.chuwu.top/favicon/icon_256.webp&quot; alt=&quot;头像图片&quot; title=&quot;我的头像&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;HTML 标签引入图片&lt;/h2&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;/favicon/icon_256.webp&quot; alt=&quot;头像图片&quot; width=&quot;256&quot; height=&quot;256&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;img src=&quot;/favicon/icon_256.webp&quot; alt=&quot;头像图片&quot; width=&quot;256&quot; height=&quot;256&quot; /&amp;gt;&lt;/p&gt;
&lt;h2&gt;路径说明&lt;/h2&gt;
&lt;p&gt;图片路径有以下几种方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网络图片&lt;/strong&gt;：以 &lt;code&gt;http://&lt;/code&gt; 或 &lt;code&gt;https://&lt;/code&gt; 开头&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![网络图片](https://example.com/image.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;公共目录图片&lt;/strong&gt;：以 &lt;code&gt;/&lt;/code&gt; 开头，相对于 &lt;code&gt;public&lt;/code&gt; 目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![公共图片](/favicon/icon_256.webp)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相对路径图片&lt;/strong&gt;：相对于当前 Markdown 文件的位置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![相对图片](./images/photo.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;数学公式&lt;/h1&gt;
&lt;p&gt;行内数学公式是这样写的：$\omega = d\phi / dt$。&lt;/p&gt;
&lt;p&gt;显示数学公式应该独占一行，用双美元符号包裹：&lt;/p&gt;
&lt;p&gt;$$I = \int \rho R^{2} dV$$&lt;/p&gt;
&lt;p&gt;$$
\begin{equation*}
\pi
=3.1415926535
;8979323846;2643383279;5028841971;\ldots
\end{equation*}
$$&lt;/p&gt;
&lt;h1&gt;GitHub 仓库卡片&lt;/h1&gt;
&lt;p&gt;你可以添加一个链接到一个 GitHub 仓库的动态卡片。当页面加载时，将从 GitHub API 获取仓库信息。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;ChuwuYo/Charlotte&quot;}&lt;/p&gt;
&lt;p&gt;创建一个 Github 仓库卡片，只需在 Markdown 文件中添加一行 &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;ChuwuYo/Charlotte&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;警告&lt;/h1&gt;
&lt;p&gt;支持这些类型的警告: &lt;code&gt;note&lt;/code&gt; &lt;code&gt;tip&lt;/code&gt; &lt;code&gt;important&lt;/code&gt; &lt;code&gt;warning&lt;/code&gt; &lt;code&gt;caution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
突出显示用户在浏览时也应考虑的信息。
:::&lt;/p&gt;
&lt;p&gt;:::tip
可选的信息，以帮助用户更顺利地理解。
:::&lt;/p&gt;
&lt;p&gt;:::important
用户完成任务所必需的关键信息。
:::&lt;/p&gt;
&lt;p&gt;:::warning
关键内容，由于潜在风险需要用户立即关注。
:::&lt;/p&gt;
&lt;p&gt;:::caution
行动的负面潜在后果。
:::&lt;/p&gt;
&lt;h2&gt;基本语法&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;:::note
突出显示用户在浏览时也应考虑的信息。
:::

:::tip
可选的信息，以帮助用户更顺利地理解。
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;自定义标题&lt;/h2&gt;
&lt;p&gt;警告的标题可以自定义。&lt;/p&gt;
&lt;p&gt;:::note[自定义标题]
这是一个带有自定义标题的提示。
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[自定义标题]
这是一个带有自定义标题的提示。
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;GitHub 语法&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
同时也支持 &lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;GitHub 语法&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; 也支持 GitHub 语法。

&amp;gt; [!TIP]
&amp;gt; 也支持 GitHub 语法。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;剧透内容&lt;/h1&gt;
&lt;p&gt;你可以为文本添加剧透。文本也支持 &lt;strong&gt;Markdown&lt;/strong&gt; 语法。&lt;/p&gt;
&lt;p&gt;内容 :spoiler[被隐藏起来了 &lt;strong&gt;哈哈&lt;/strong&gt;]！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;内容 :spoiler[被隐藏起来了 **哈哈**]！
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;视频卡片&lt;/h1&gt;
&lt;p&gt;只需从 YouTube 或其他平台复制嵌入代码，然后将其粘贴到 markdown 文件中。&lt;/p&gt;
&lt;h3&gt;YouTube&lt;/h3&gt;
&lt;p&gt;只需从 YouTube 复制嵌入代码，然后粘贴到 Markdown 文件中即可。&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/1MsuXjTlCGE?si=KykaK5Bgvq1W1hXI&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h1&gt;杂项&lt;/h1&gt;
&lt;h2&gt;特殊符号&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;长破折号&lt;/strong&gt;：使用三个破折号 &lt;code&gt;---&lt;/code&gt; 表示长破折号（——）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;范围符号&lt;/strong&gt;：使用两个破折号 &lt;code&gt;--&lt;/code&gt; 表示范围（例如，&quot;第 12—14 章&quot;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;省略号&lt;/strong&gt;：三个点 &lt;code&gt;...&lt;/code&gt; 将被转换为省略号（……）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unicode 支持&lt;/h2&gt;
&lt;p&gt;支持 Unicode 字符，例如表情符号：☺ ★ ♥ ♦ ♣ ♠ ● ○ ◇ ◆ □ ■ △ ▲ ※ → ← ↑ ↓&lt;/p&gt;
&lt;h2&gt;转义字符&lt;/h2&gt;
&lt;p&gt;如果需要显示特殊字符的原样，可以使用反斜杠 &lt;code&gt;\&lt;/code&gt; 进行转义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\_&lt;/code&gt; 显示为 &lt;code&gt;_&lt;/code&gt;（而不是斜体）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\*&lt;/code&gt; 显示为 &lt;code&gt;*&lt;/code&gt;（而不是粗体）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\`` 显示为 `` &lt;/code&gt;（而不是代码）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;缩进&lt;/h2&gt;
&lt;p&gt;缩进始终保持为四个空格的距离，你也可以使用制表符（Tab）。&lt;/p&gt;
&lt;h2&gt;行块&lt;/h2&gt;
&lt;p&gt;| 第一行
| 第二行
| 第三行&lt;/p&gt;
</content:encoded></item></channel></rss>