<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Tom Chen</title>
        <link>https://chenpan.com.cn</link>
        <description>十年 .NET 开发与架构经验，擅长系统架构、大数据平台开发与 Web 分布式系统架构，主攻工业 RPA、AI Agent 与流程自动化，有半导体 FAB 工作经验。</description>
        <lastBuildDate>Tue, 29 Sep 2026 03:32:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <image>
            <title>Tom Chen</title>
            <url>https://chenpan.com.cn/ava.svg</url>
            <link>https://chenpan.com.cn</link>
        </image>
        <copyright>Copyright© 2025-present Tom Chen</copyright>
        <item>
            <title><![CDATA[机器学习与深度学习入门：从核心概念到 CNN 卷积神经网络]]></title>
            <link>https://chenpan.com.cn/posts/2026/ml-ai-cnn-getting-started</link>
            <guid>https://chenpan.com.cn/posts/2026/ml-ai-cnn-getting-started</guid>
            <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<!-- DESC SEP -->
<p>一篇面向工程师的 AI 入门长文：先理清 AI、机器学习、深度学习的关系，讲透机器学习的基本流程与经典算法；再深入神经网络与 CNN 卷积神经网络（附 PyTorch 完整示例），盘点 RNN、Transformer 等其他主流网络；最后按场景列举常用框架与一条可落地的学习路线。</p>
<!-- DESC SEP -->
<h2 id="一、先理清概念-ai、机器学习、深度学习是什么关系" tabindex="-1">一、先理清概念：AI、机器学习、深度学习是什么关系 <a class="header-anchor" href="#一、先理清概念-ai、机器学习、深度学习是什么关系" aria-label="Permalink to &quot;一、先理清概念：AI、机器学习、深度学习是什么关系&quot;">&ZeroWidthSpace;</a></h2>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>人工智能（AI，1956 年起的大概念）</span></span>
<span class="line"><span>└── 机器学习（ML，数据驱动的方法论，1980s 兴起）</span></span>
<span class="line"><span>    └── 深度学习（DL，多层神经网络，2012 年后爆发）</span></span>
<span class="line"><span>        ├── CNN        —— 图像</span></span>
<span class="line"><span>        ├── RNN/LSTM   —— 序列（已逐步被 Transformer 取代）</span></span>
<span class="line"><span>        ├── Transformer —— 大语言模型（GPT/Claude）、视觉（ViT）</span></span>
<span class="line"><span>        ├── GAN / 扩散模型 —— 生成图像</span></span>
<span class="line"><span>        └── ……</span></span></code></pre>
</div><ul>
<li><strong>人工智能</strong>：让机器表现出智能行为的总称，包含规则系统、专家系统等非学习方法</li>
<li><strong>机器学习</strong>：不从规则出发，而是<strong>从数据中自动学出规律</strong>——这是现代 AI 的主流范式</li>
<li><strong>深度学习</strong>：用多层神经网络自动提取特征，是机器学习的一个分支，也是当前爆火的根本原因</li>
</ul>
<h2 id="二、机器学习的基本范式" tabindex="-1">二、机器学习的基本范式 <a class="header-anchor" href="#二、机器学习的基本范式" aria-label="Permalink to &quot;二、机器学习的基本范式&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_2-1-三种学习方式" tabindex="-1">2.1 三种学习方式 <a class="header-anchor" href="#_2-1-三种学习方式" aria-label="Permalink to &quot;2.1 三种学习方式&quot;">&ZeroWidthSpace;</a></h3>
<p>| 范式 | 特点 | 典型任务 |
|</p>
]]></description>
            <content:encoded><![CDATA[<!-- DESC SEP -->
<p>一篇面向工程师的 AI 入门长文：先理清 AI、机器学习、深度学习的关系，讲透机器学习的基本流程与经典算法；再深入神经网络与 CNN 卷积神经网络（附 PyTorch 完整示例），盘点 RNN、Transformer 等其他主流网络；最后按场景列举常用框架与一条可落地的学习路线。</p>
<!-- DESC SEP -->
<h2 id="一、先理清概念-ai、机器学习、深度学习是什么关系" tabindex="-1">一、先理清概念：AI、机器学习、深度学习是什么关系 <a class="header-anchor" href="#一、先理清概念-ai、机器学习、深度学习是什么关系" aria-label="Permalink to &quot;一、先理清概念：AI、机器学习、深度学习是什么关系&quot;">&ZeroWidthSpace;</a></h2>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>人工智能（AI，1956 年起的大概念）</span></span>
<span class="line"><span>└── 机器学习（ML，数据驱动的方法论，1980s 兴起）</span></span>
<span class="line"><span>    └── 深度学习（DL，多层神经网络，2012 年后爆发）</span></span>
<span class="line"><span>        ├── CNN        —— 图像</span></span>
<span class="line"><span>        ├── RNN/LSTM   —— 序列（已逐步被 Transformer 取代）</span></span>
<span class="line"><span>        ├── Transformer —— 大语言模型（GPT/Claude）、视觉（ViT）</span></span>
<span class="line"><span>        ├── GAN / 扩散模型 —— 生成图像</span></span>
<span class="line"><span>        └── ……</span></span></code></pre>
</div><ul>
<li><strong>人工智能</strong>：让机器表现出智能行为的总称，包含规则系统、专家系统等非学习方法</li>
<li><strong>机器学习</strong>：不从规则出发，而是<strong>从数据中自动学出规律</strong>——这是现代 AI 的主流范式</li>
<li><strong>深度学习</strong>：用多层神经网络自动提取特征，是机器学习的一个分支，也是当前爆火的根本原因</li>
</ul>
<h2 id="二、机器学习的基本范式" tabindex="-1">二、机器学习的基本范式 <a class="header-anchor" href="#二、机器学习的基本范式" aria-label="Permalink to &quot;二、机器学习的基本范式&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_2-1-三种学习方式" tabindex="-1">2.1 三种学习方式 <a class="header-anchor" href="#_2-1-三种学习方式" aria-label="Permalink to &quot;2.1 三种学习方式&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>范式</th>
<th>特点</th>
<th>典型任务</th>
</tr>
</thead>
<tbody>
<tr>
<td>监督学习</td>
<td>数据带标签（有标准答案）</td>
<td>图像分类、缺陷检测、价格预测</td>
</tr>
<tr>
<td>无监督学习</td>
<td>数据无标签，自己找结构</td>
<td>用户聚类、异常检测、降维</td>
</tr>
<tr>
<td>强化学习</td>
<td>智能体与环境交互，靠奖励学习</td>
<td>游戏对弈、机器人控制、RLHF</td>
</tr>
</tbody>
</table>
<h3 id="_2-2-一切模型的标准流程" tabindex="-1">2.2 一切模型的标准流程 <a class="header-anchor" href="#_2-2-一切模型的标准流程" aria-label="Permalink to &quot;2.2 一切模型的标准流程&quot;">&ZeroWidthSpace;</a></h3>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>收集数据 → 划分数据集（训练/验证/测试）→ 特征工程 → 选择模型</span></span>
<span class="line"><span>   → 训练（在训练集上拟合）→ 调参（在验证集上评估）→ 最终评估（测试集）→ 部署</span></span></code></pre>
</div><p>关键认知：<strong>机器学习调的是&quot;泛化能力&quot;，不是&quot;背题能力&quot;</strong>。训练集上 100 分、测试集上不及格，就是过拟合。</p>
<h3 id="_2-3-必须懂的几个词" tabindex="-1">2.3 必须懂的几个词 <a class="header-anchor" href="#_2-3-必须懂的几个词" aria-label="Permalink to &quot;2.3 必须懂的几个词&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>术语</th>
<th>含义</th>
<th>通俗理解</th>
</tr>
</thead>
<tbody>
<tr>
<td>特征（Feature）</td>
<td>描述样本的输入变量</td>
<td>判断水果是&quot;重量、颜色&quot;</td>
</tr>
<tr>
<td>标签（Label）</td>
<td>要预测的答案</td>
<td>&quot;苹果 / 橘子&quot;</td>
</tr>
<tr>
<td>损失函数（Loss）</td>
<td>衡量预测与答案的差距</td>
<td>错得越离谱，损失越大</td>
</tr>
<tr>
<td>过拟合 Overfitting</td>
<td>训练集很好、新数据很差</td>
<td>死记硬背，不会举一反三</td>
</tr>
<tr>
<td>欠拟合 Underfitting</td>
<td>训练集上都学不好</td>
<td>根本没学进去</td>
</tr>
<tr>
<td>正则化</td>
<td>抑制过拟合的手段</td>
<td>限制模型的&quot;死记硬背&quot;能力</td>
</tr>
</tbody>
</table>
<h3 id="_2-4-经典机器学习算法-传统-ml" tabindex="-1">2.4 经典机器学习算法（传统 ML） <a class="header-anchor" href="#_2-4-经典机器学习算法-传统-ml" aria-label="Permalink to &quot;2.4 经典机器学习算法（传统 ML）&quot;">&ZeroWidthSpace;</a></h3>
<p>深度学习之前的主力军，<strong>表格数据、小数据集上至今非常好用</strong>：</p>
<table tabindex="0">
<thead>
<tr>
<th>算法</th>
<th>类型</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>线性回归</td>
<td>回归</td>
<td>拟合一条直线/超平面</td>
</tr>
<tr>
<td>逻辑回归</td>
<td>分类</td>
<td>线性模型 + Sigmoid，输出概率</td>
</tr>
<tr>
<td>KNN</td>
<td>分类/回归</td>
<td>近朱者赤：看最近的 K 个邻居投票</td>
</tr>
<tr>
<td>决策树</td>
<td>分类/回归</td>
<td>一连串 if-else，可解释性强</td>
</tr>
<tr>
<td>随机森林</td>
<td>集成</td>
<td>多棵决策树投票，稳</td>
</tr>
<tr>
<td>XGBoost / LightGBM</td>
<td>集成</td>
<td>梯度提升树，表格数据竞赛之王</td>
</tr>
<tr>
<td>SVM</td>
<td>分类</td>
<td>找间隔最大的分界面</td>
</tr>
<tr>
<td>K-Means</td>
<td>聚类</td>
<td>无监督，按距离自动分组</td>
</tr>
<tr>
<td>PCA</td>
<td>降维</td>
<td>保留主要信息，压缩维度</td>
</tr>
</tbody>
</table>
<p>用 scikit-learn 五行跑通一个分类器：</p>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sklearn.datasets </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> load_iris</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sklearn.model_selection </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> train_test_split</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sklearn.ensemble </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> RandomForestClassifier</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sklearn.metrics </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> accuracy_score</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">X, y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> load_iris(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">return_X_y</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">True</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)                    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 经典鸢尾花数据集</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">X_train, X_test, y_train, y_test </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> train_test_split(X, y, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">test_size</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">random_state</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">42</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">model </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> RandomForestClassifier(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">n_estimators</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).fit(X_train, y_train)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(accuracy_score(y_test, model.predict(X_test)))  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1.0</span></span></code></pre>
</div><h2 id="三、神经网络-深度学习的地基" tabindex="-1">三、神经网络：深度学习的地基 <a class="header-anchor" href="#三、神经网络-深度学习的地基" aria-label="Permalink to &quot;三、神经网络：深度学习的地基&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_3-1-从一个神经元说起" tabindex="-1">3.1 从一个神经元说起 <a class="header-anchor" href="#_3-1-从一个神经元说起" aria-label="Permalink to &quot;3.1 从一个神经元说起&quot;">&ZeroWidthSpace;</a></h3>
<p>一个神经元 = <strong>加权求和 + 偏置 + 激活函数</strong>：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>输出 = f(w₁x₁ + w₂x₂ + … + wₙxₙ + b)</span></span></code></pre>
</div><ul>
<li><strong>权重 w</strong>：学习的产物——训练就是在不断调整这些数字</li>
<li><strong>激活函数 f</strong>：引入非线性（没有它，叠再多层都等价于一层线性变换）
<ul>
<li>ReLU：<code>max(0, x)</code>，默认首选</li>
<li>Sigmoid / Softmax：输出概率（二分类 / 多分类）</li>
</ul>
</li>
</ul>
<h3 id="_3-2-训练三件套" tabindex="-1">3.2 训练三件套 <a class="header-anchor" href="#_3-2-训练三件套" aria-label="Permalink to &quot;3.2 训练三件套&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li><strong>前向传播</strong>：输入逐层计算，得到预测值</li>
<li><strong>计算损失</strong>：预测 vs 标签的差距（回归用 MSE，分类用交叉熵 CrossEntropy）</li>
<li><strong>反向传播 + 梯度下降</strong>：把损失对每个权重的梯度算出来，朝损失下降的方向微调权重</li>
</ol>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>w ← w − lr × ∂Loss/∂w        （lr 为学习率）</span></span></code></pre>
</div><p>优化器（怎么走这一步）：</p>
<ul>
<li><strong>SGD</strong>：随机梯度下降，朴素但有效</li>
<li><strong>SGD + Momentum</strong>：带上惯性</li>
<li><strong>Adam / AdamW</strong>：自适应学习率，<strong>默认闭眼选它</strong></li>
</ul>
<h3 id="_3-3-训练时的常见操作" tabindex="-1">3.3 训练时的常见操作 <a class="header-anchor" href="#_3-3-训练时的常见操作" aria-label="Permalink to &quot;3.3 训练时的常见操作&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><strong>Batch（批）</strong>：每次用一小批样本估算梯度（常见 32 / 64 / 128）</li>
<li><strong>Epoch</strong>：完整过一遍训练集</li>
<li><strong>Dropout</strong>：训练时随机丢弃部分神经元，防过拟合</li>
<li><strong>BatchNorm / LayerNorm</strong>：归一化内部分布，让训练更稳</li>
<li><strong>早停（Early Stopping）</strong>：验证集指标不再提升就停手</li>
</ul>
<h2 id="四、cnn-卷积神经网络-给图像而生的网络" tabindex="-1">四、CNN 卷积神经网络：给图像而生的网络 <a class="header-anchor" href="#四、cnn-卷积神经网络-给图像而生的网络" aria-label="Permalink to &quot;四、CNN 卷积神经网络：给图像而生的网络&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_4-1-为什么全连接网络搞不定图像" tabindex="-1">4.1 为什么全连接网络搞不定图像 <a class="header-anchor" href="#_4-1-为什么全连接网络搞不定图像" aria-label="Permalink to &quot;4.1 为什么全连接网络搞不定图像&quot;">&ZeroWidthSpace;</a></h3>
<p>一张 224×224 的彩色图有 224×224×3 ≈ 15 万个输入。若第一层 1000 个神经元全连接，就是 1.5 亿参数——算不动，还丢失了<strong>空间结构</strong>（相邻像素有关系）。</p>
<h3 id="_4-2-卷积层-三个核心思想" tabindex="-1">4.2 卷积层：三个核心思想 <a class="header-anchor" href="#_4-2-卷积层-三个核心思想" aria-label="Permalink to &quot;4.2 卷积层：三个核心思想&quot;">&ZeroWidthSpace;</a></h3>
<p><strong>① 局部感受野</strong>：每个神经元只看一小块（如 3×3），而不是整张图——符合&quot;先看细节再看全局&quot;的视觉规律。</p>
<p><strong>② 权值共享</strong>：同一个 3×3 卷积核在整张图上滑动复用，参数量骤降。一个 3×3×3 的卷积核只有 <strong>27 个参数</strong>，学的是&quot;某种局部图案&quot;。</p>
<p><strong>③ 平移不变性</strong>：不管猫在图片左上角还是右下角，同一个卷积核都能检测到它。</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>输入 (28×28) ──[卷积核 3×3, 32 个]──► 特征图 (26×26×32) ──► ReLU ──► 池化 (13×13×32)</span></span>
<span class="line"><span>              卷积核在图上滑动，每个位置做点积</span></span></code></pre>
</div><h3 id="_4-3-池化层与特征层次" tabindex="-1">4.3 池化层与特征层次 <a class="header-anchor" href="#_4-3-池化层与特征层次" aria-label="Permalink to &quot;4.3 池化层与特征层次&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><strong>最大池化（MaxPool）</strong>：2×2 窗口取最大值 → 尺寸减半，保留最强响应，降低计算量</li>
<li><strong>层层堆叠后</strong>，网络自动学出层次化特征：</li>
</ul>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>浅层卷积 ──► 边缘、颜色斑块</span></span>
<span class="line"><span>中层卷积 ──► 纹理、局部形状（圆弧、角点）</span></span>
<span class="line"><span>深层卷积 ──► 部件（眼睛、轮子、焊点）</span></span>
<span class="line"><span>输出层   ──► 整体语义（猫 / 螺丝 / 缺陷件）</span></span></code></pre>
</div><h3 id="_4-4-经典-cnn-网络-面试与落地高频" tabindex="-1">4.4 经典 CNN 网络（面试与落地高频） <a class="header-anchor" href="#_4-4-经典-cnn-网络-面试与落地高频" aria-label="Permalink to &quot;4.4 经典 CNN 网络（面试与落地高频）&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>网络</th>
<th>年份</th>
<th>关键贡献</th>
</tr>
</thead>
<tbody>
<tr>
<td>LeNet-5</td>
<td>1998</td>
<td>CNN 开山，手写数字识别</td>
</tr>
<tr>
<td>AlexNet</td>
<td>2012</td>
<td>ImageNet 夺冠，ReLU + GPU，深度学习复兴起点</td>
</tr>
<tr>
<td>VGG-16</td>
<td>2014</td>
<td>全部用 3×3 小卷积核堆深度，结构极简</td>
</tr>
<tr>
<td>ResNet</td>
<td>2015</td>
<td><strong>残差连接</strong>（跳跃连接），解决深层网络退化，可训到上百层</td>
</tr>
<tr>
<td>MobileNet</td>
<td>2017</td>
<td>深度可分离卷积，移动端实时推理</td>
</tr>
<tr>
<td>EfficientNet</td>
<td>2019</td>
<td>复合缩放（深度/宽度/分辨率）系统调优</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>ResNet 的残差连接</strong>是现代所有大模型（包括 Transformer）的标配思想：<code>输出 = F(x) + x</code>，让梯度有&quot;高速公路&quot;直通浅层。</p>
</blockquote>
<h3 id="_4-5-动手-pytorch-写一个-cnn-mnist-手写数字" tabindex="-1">4.5 动手：PyTorch 写一个 CNN（MNIST 手写数字） <a class="header-anchor" href="#_4-5-动手-pytorch-写一个-cnn-mnist-手写数字" aria-label="Permalink to &quot;4.5 动手：PyTorch 写一个 CNN（MNIST 手写数字）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> torch</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> torch.nn </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> nn</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> torchvision </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datasets, transforms</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> torch.utils.data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DataLoader</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1. 数据：自动下载 MNIST，归一化</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">transform </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> transforms.Compose([transforms.ToTensor(), transforms.Normalize((</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.1307</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,), (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.3081</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,))])</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">train_set </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datasets.MNIST(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"./data"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">train</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">True</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">download</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">True</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">transform</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">transform)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">test_set  </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datasets.MNIST(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"./data"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">train</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">transform</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">transform)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">train_loader </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DataLoader(train_set, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">batch_size</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">shuffle</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">True</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">test_loader  </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DataLoader(test_set, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">batch_size</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">256</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2. 模型：两个卷积块 + 全连接分类头</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> CNN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">nn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        super</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">__init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.features </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> nn.Sequential(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.Conv2d(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">padding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), nn.ReLU(),   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 28×28 → 28×28×32</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.MaxPool2d(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),                              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># → 14×14×32</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.Conv2d(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">padding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), nn.ReLU(),   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># → 14×14×64</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.MaxPool2d(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),                              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># → 7×7×64</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        )</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.classifier </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> nn.Sequential(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.Flatten(),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.Linear(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">64</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 7</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), nn.ReLU(),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.Dropout(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.25</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            nn.Linear(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">128</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),                           </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 0~9 十类</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        )</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> forward</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, x):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.classifier(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.features(x))</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">device </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "cuda"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> torch.cuda.is_available() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "cpu"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">model </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> CNN().to(device)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">optimizer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> torch.optim.AdamW(model.parameters(), </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">lr</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1e-3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">criterion </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> nn.CrossEntropyLoss()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 3. 训练</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> epoch </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    model.train()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x, y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> train_loader:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        x, y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x.to(device), y.to(device)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        optimizer.zero_grad()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        loss </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> criterion(model(x), y)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        loss.backward()          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 反向传播</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        optimizer.step()         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 更新权重</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"epoch </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">epoch </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> done, loss=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">loss.item()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.4f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 4. 测试</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">model.eval()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">correct </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> total </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> torch.no_grad():            </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 推理不需要梯度</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x, y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> test_loader:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        pred </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> model(x.to(device)).argmax(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).cpu()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        correct </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (pred </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y).sum().item()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        total </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(y)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"测试集准确率: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">correct </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> total</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.2%</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 约 99%</span></span></code></pre>
</div><p>三十行左右，准确率 99%——这就是深度学习框架的魅力：<strong>你只描述结构，梯度自动帮你算</strong>。</p>
<h3 id="_4-6-工业落地-cnn-做缺陷检测的典型打法" tabindex="-1">4.6 工业落地：CNN 做缺陷检测的典型打法 <a class="header-anchor" href="#_4-6-工业落地-cnn-做缺陷检测的典型打法" aria-label="Permalink to &quot;4.6 工业落地：CNN 做缺陷检测的典型打法&quot;">&ZeroWidthSpace;</a></h3>
<p>结合工业现场的真实场景，CNN 落地通常长这样：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>相机拍照 → 预处理（裁剪/对位/增强）→ CNN 推理 → 判定 OK / NG → 剔除/报警</span></span></code></pre>
</div><ul>
<li><strong>分类</strong>（整件良/不良）：ResNet / MobileNet 微调</li>
<li><strong>检测</strong>（缺陷在哪）：YOLO 系列（YOLOv8/v11，ultralytics 库十行训练）</li>
<li><strong>分割</strong>（缺陷精确轮廓）：U-Net、Mask R-CNN</li>
<li><strong>小样本场景</strong>：先用预训练模型微调（Transfer Learning），几百张标注图就能到可用精度</li>
<li><strong>无监督异常检测</strong>：只有良品图时用 PatchCore / PaDiM（anomalib 库）</li>
</ul>
<h2 id="五、cnn-之外-一张图看懂其他主流网络" tabindex="-1">五、CNN 之外：一张图看懂其他主流网络 <a class="header-anchor" href="#五、cnn-之外-一张图看懂其他主流网络" aria-label="Permalink to &quot;五、CNN 之外：一张图看懂其他主流网络&quot;">&ZeroWidthSpace;</a></h2>
<table tabindex="0">
<thead>
<tr>
<th>网络</th>
<th>擅长</th>
<th>代表应用</th>
</tr>
</thead>
<tbody>
<tr>
<td>RNN / LSTM</td>
<td>序列</td>
<td>早期的文本、时序预测（已被 Transformer 大面积取代）</td>
</tr>
<tr>
<td><strong>Transformer</strong></td>
<td>序列 + 万物</td>
<td>GPT / Claude 等大语言模型、ViT 视觉、多模态</td>
</tr>
<tr>
<td>GAN</td>
<td>生成</td>
<td>图像生成、超分辨率（逐渐被扩散模型取代）</td>
</tr>
<tr>
<td>扩散模型</td>
<td>生成</td>
<td>Stable Diffusion、Midjourney 文生图</td>
</tr>
<tr>
<td>自编码器（AE/VAE）</td>
<td>压缩/重建</td>
<td>工业异常检测（重建误差判 NG）</td>
</tr>
<tr>
<td>图神经网络（GNN）</td>
<td>图结构</td>
<td>社交网络、分子结构、知识图谱</td>
</tr>
</tbody>
</table>
<p><strong>Transformer 一句话</strong>：注意力机制（Attention）让每个位置直接&quot;看遍&quot;所有其他位置，天然并行、长依赖随便抓——所以它同时统治了语言和视觉。</p>
<h2 id="六、常用框架与工具盘点" tabindex="-1">六、常用框架与工具盘点 <a class="header-anchor" href="#六、常用框架与工具盘点" aria-label="Permalink to &quot;六、常用框架与工具盘点&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_6-1-深度学习框架-选一个主力" tabindex="-1">6.1 深度学习框架（选一个主力） <a class="header-anchor" href="#_6-1-深度学习框架-选一个主力" aria-label="Permalink to &quot;6.1 深度学习框架（选一个主力）&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>特点</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>PyTorch</strong></td>
<td>研究与工业界主流，动态图直观，本文示例使用</td>
</tr>
<tr>
<td>TensorFlow / Keras</td>
<td>Google 系，Keras API 上手快，部署生态（TF Serving / TFLite）</td>
</tr>
<tr>
<td>MindSpore / PaddlePaddle</td>
<td>国产框架，中文文档友好</td>
</tr>
<tr>
<td>ONNX</td>
<td>不是框架，是<strong>模型交换格式</strong>——训练端到部署端的桥梁</td>
</tr>
</tbody>
</table>
<h3 id="_6-2-按场景的工具链" tabindex="-1">6.2 按场景的工具链 <a class="header-anchor" href="#_6-2-按场景的工具链" aria-label="Permalink to &quot;6.2 按场景的工具链&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>场景</th>
<th>工具</th>
</tr>
</thead>
<tbody>
<tr>
<td>传统机器学习</td>
<td><strong>scikit-learn</strong>、XGBoost、LightGBM</td>
</tr>
<tr>
<td>计算机视觉</td>
<td><strong>ultralytics（YOLO）</strong>、OpenCV、MMDetection、anomalib（工业异常检测）</td>
</tr>
<tr>
<td>大模型 / NLP</td>
<td><strong>Hugging Face Transformers</strong>、LangChain、LlamaIndex</td>
</tr>
<tr>
<td>训练加速</td>
<td>CUDA、cuDNN、混合精度（AMP）、DeepSpeed（大模型分布式）</td>
</tr>
<tr>
<td>实验管理</td>
<td>TensorBoard、Weights &amp; Biases（W&amp;B）、MLflow</td>
</tr>
<tr>
<td>部署推理</td>
<td>ONNX Runtime、TensorRT（NVIDIA 卡极限优化）、OpenVINO（Intel CPU 友好）</td>
</tr>
</tbody>
</table>
<h3 id="_6-3-面向工程师的学习路线" tabindex="-1">6.3 面向工程师的学习路线 <a class="header-anchor" href="#_6-3-面向工程师的学习路线" aria-label="Permalink to &quot;6.3 面向工程师的学习路线&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li><strong>第 1 步</strong>：Python 基础 + NumPy（向量思维）→ 用 scikit-learn 跑通第一个分类任务</li>
<li><strong>第 2 步</strong>：理解反向传播（推荐 3Blue1Brown 的神经网络系列视频）→ 手写一个两层网络</li>
<li><strong>第 3 步</strong>：PyTorch 官方 60 分钟教程 → 复现 MNIST 的 CNN（本文 4.5 节）</li>
<li><strong>第 4 步</strong>：选方向深入——
<ul>
<li>做视觉：YOLO 训练自己的数据集，跑一个缺陷检测 demo</li>
<li>做大模型：Hugging Face 微调 + LangChain 搭 RAG 问答</li>
</ul>
</li>
<li><strong>第 5 步</strong>：学部署——ONNX 导出、TensorRT/OpenVINO 推理加速，模型上产线</li>
</ol>
<p>三条经验之谈：</p>
<ul>
<li><strong>先跑通再深究</strong>：先让模型转起来，再回头补数学（线代 + 概率 + 微积分，用到哪补哪）</li>
<li><strong>数据比模型重要</strong>：工业场景 80% 的时间在整理数据和标注，不在调网络</li>
<li><strong>从预训练微调开始</strong>：永远不要从零训练，站在 ResNet / YOLO / 大模型的肩膀上</li>
</ul>
<blockquote>
<p>本文示例环境：Python 3.12 · PyTorch 2.x · scikit-learn 1.5 · 代码可直接复制运行（<code>pip install torch torchvision scikit-learn</code>）</p>
</blockquote>
]]></content:encoded>
            <author>tom@chenpan.com.cn (Tom Chen)</author>
        </item>
        <item>
            <title><![CDATA[Python 入门指南：从基础语法到常用类库]]></title>
            <link>https://chenpan.com.cn/posts/2026/python-getting-started</link>
            <guid>https://chenpan.com.cn/posts/2026/python-getting-started</guid>
            <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<!-- DESC SEP -->
<p>一篇面向初学者的 Python 入门长文：从环境搭建、基础语法讲起，覆盖切片、推导式、生成器、装饰器、面向对象等高级特性，再按场景盘点最常用的标准库、类库与主流框架（Web / 爬虫 / RPA / AI / 调度 / 测试 / 数据），最后给出一条可执行的学习路线。</p>
<!-- DESC SEP -->
<h2 id="为什么要学-python" tabindex="-1">为什么要学 Python <a class="header-anchor" href="#为什么要学-python" aria-label="Permalink to &quot;为什么要学 Python&quot;">&ZeroWidthSpace;</a></h2>
<p>语法接近自然语言、生态极其丰富、脚本到服务端到 AI 全场景通吃。对工业自动化开发者来说，Python 是做数据处理、自动化脚本、AI 应用最快的工具。</p>
<h2 id="一、环境准备" tabindex="-1">一、环境准备 <a class="header-anchor" href="#一、环境准备" aria-label="Permalink to &quot;一、环境准备&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1. 安装 Python（建议 3.10+）：https://www.python.org/downloads/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#    Windows 安装时勾选 "Add Python to PATH"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2. 创建虚拟环境（每个项目一个，避免依赖污染）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">python</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> venv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .venv</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 3. 激活</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Windows PowerShell:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.venv\Scripts\Activate.ps1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># macOS / Linux:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">source</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .venv/bin/activate</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 4. 安装第三方包</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> requests</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> freeze</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> requirements.txt</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 导出依赖清单</span></span></code></pre>
</div><h2 id="二、基础语法" tabindex="-1">二、基础语法 <a class="header-anchor" href="#二、基础语法" aria-label="Permalink to &quot;二、基础语法&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="变量与基本类型" tabindex="-1">变量与基本类型 <a class="header-anchor" href="#变量与基本类型" aria-label="Permalink to &quot;变量与基本类型&quot;">&ZeroWidthSpace;</a></h3>
<p>Python 是动态类型语言，变量无需声明类型：</p>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Tom"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">          # str 字符串</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">age </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 30</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">              # int 整数</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">height </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1.75</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">         # float 浮点数</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">active </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> True</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">         # bool 布尔值（注意大写开头）</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nothing </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # NoneType 空值</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># type() 查看类型</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(age))      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># &#x3C;class 'int'></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 类型转换</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"42"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># str -> int</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3.14</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># float -> str</span></span></code></pre>
</div><h3 id="字符串" tabindex="-1">字符串 <a class="header-anchor" href="#字符串" aria-label="Permalink to &quot;字符串&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Hello, Python"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># f-string 格式化（推荐，3.6+）</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lang </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Python"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"我在学 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lang</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">，今年是 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{2026}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 年"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 常用方法</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s.lower())          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 转小写</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s.split(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">", "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 切分 -> ['Hello', 'Python']</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s.replace(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hi"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"  pad  "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.strip())  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 去首尾空白</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s))             </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 长度</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Py"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> s)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 包含判断 -> True</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 多行字符串</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">text </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> """第一行</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">第二行"""</span></span></code></pre>
</div><h3 id="运算符" tabindex="-1">运算符 <a class="header-anchor" href="#运算符" aria-label="Permalink to &quot;运算符&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">a, b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">//</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 13 3.3333 3（// 整除）</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1 1000（% 取余，** 幂）</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 比较与逻辑</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">and</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># True</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b))           </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># True</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 海象运算符（3.8+）：赋值同时判断</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n)                  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 10</span></span></code></pre>
</div><h3 id="条件与循环" tabindex="-1">条件与循环 <a class="header-anchor" href="#条件与循环" aria-label="Permalink to &quot;条件与循环&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># if / elif / else —— 注意：Python 用缩进表示代码块</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">score </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 85</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> score </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 90</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"优秀"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">elif</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> score </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 80</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"良好"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"继续努力"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># for 循环遍历</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 0 1 2 3 4</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ch </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "abc"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 遍历字符串</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(ch)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># while 循环</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(count)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># break 跳出 / continue 跳过本轮</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        continue</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        break</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)</span></span></code></pre>
</div><h3 id="函数" tabindex="-1">函数 <a class="header-anchor" href="#函数" aria-label="Permalink to &quot;函数&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> greet</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, greeting: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    """位置参数 + 默认参数"""</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">greeting</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(greet(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))                     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Hello, Tom!</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(greet(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">greeting</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"你好"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 你好, Tom!</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 可变参数</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> total</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">args, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kwargs):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(args)      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 元组：位置参数打包</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(kwargs)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字典：关键字参数打包</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">total(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># (1, 2) {'x': 3, 'y': 4}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 多返回值（其实是元组解包）</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> min_max</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> min</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums), </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">max</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lo, hi </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> min_max([</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(lo, hi)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1 5</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 匿名函数</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pairs </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'b'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'a'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pairs.sort(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=lambda</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> p: p[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 按第二个元素排序</span></span></code></pre>
</div><h3 id="四大内建数据结构" tabindex="-1">四大内建数据结构 <a class="header-anchor" href="#四大内建数据结构" aria-label="Permalink to &quot;四大内建数据结构&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># list 列表 —— 有序、可变</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums.append(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 尾部追加</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums.insert(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 指定位置插入</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums.pop()              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 弹出尾部</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], nums[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 首元素 / 末元素</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># tuple 元组 —— 有序、不可变</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">point </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">20</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x, y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> point            </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 解包</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># dict 字典 —— 键值对、查找 O(1)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"age"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">30</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">user[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "tom@example.com"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # 增/改</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(user.get(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"phone"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"未设置"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 安全读取，避免 KeyError</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> key, value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user.items():      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 遍历</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(key, value)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># set 集合 —— 去重、交并差</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 交集 {2, 3}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 并集 {1, 2, 3, 4}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 差集 {1}</span></span></code></pre>
</div><h2 id="三、高级语法" tabindex="-1">三、高级语法 <a class="header-anchor" href="#三、高级语法" aria-label="Permalink to &quot;三、高级语法&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="切片-sequence-slicing" tabindex="-1">切片（Sequence Slicing） <a class="header-anchor" href="#切片-sequence-slicing" aria-label="Permalink to &quot;切片（Sequence Slicing）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [1, 2, 3]     下标 [1, 4)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [0, 1, 2]     前三个</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:]      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [4, 5]        最后两个</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[::</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [0, 2, 4]     步长 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[::</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 反转</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Python"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s[::</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># nohtyP —— 字符串同样适用</span></span></code></pre>
</div><h3 id="推导式-comprehension" tabindex="-1">推导式（Comprehension） <a class="header-anchor" href="#推导式-comprehension" aria-label="Permalink to &quot;推导式（Comprehension）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 列表推导式</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">squares </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">evens </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">20</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 带条件的嵌套</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">matrix </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">flat </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> row </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> matrix </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> row]   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [1, 2, 3, 4]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字典 / 集合推导式</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name_lens </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {name: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Jerry"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">unique_lens </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Jerry"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Bob"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 生成器表达式 —— 惰性求值，省内存</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">total </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1_000_000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span></code></pre>
</div><h3 id="迭代器与生成器" tabindex="-1">迭代器与生成器 <a class="header-anchor" href="#迭代器与生成器" aria-label="Permalink to &quot;迭代器与生成器&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 生成器函数：yield 逐个产出，不一次性占用内存</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> countdown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        yield</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> countdown(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 3 2 1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 处理大文件的标准姿势</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># with open("huge.log", encoding="utf-8") as f:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#     for line in f:          # 逐行读取</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#         process(line)</span></span></code></pre>
</div><h3 id="装饰器-decorator" tabindex="-1">装饰器（Decorator） <a class="header-anchor" href="#装饰器-decorator" aria-label="Permalink to &quot;装饰器（Decorator）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> functools</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> time</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 装饰器：在不改函数代码的前提下叠加行为（计时、缓存、鉴权……）</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> timer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(func):</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    @functools.wraps</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(func)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> wrapper</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">args, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kwargs):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> time.perf_counter()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> func(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">args, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kwargs)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">func.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">__name__}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 耗时 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">time.perf_counter() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.3f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">s"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> wrapper</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@timer</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> work</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n))</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">work(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10_000_000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># work 耗时 0.21s</span></span></code></pre>
</div><h3 id="上下文管理器-with-语句" tabindex="-1">上下文管理器（with 语句） <a class="header-anchor" href="#上下文管理器-with-语句" aria-label="Permalink to &quot;上下文管理器（with 语句）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># with 自动释放资源：文件、锁、数据库连接……</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">with</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> open</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"demo.txt"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"w"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> f:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    f.write(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"自动关闭文件，即使中途抛异常"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自定义上下文管理器</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> contextlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> contextmanager</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@contextmanager</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> timer_block</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> time.perf_counter()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        yield</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    finally</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 耗时 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">time.perf_counter() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.3f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">s"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timer_block(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"任务"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1_000_000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span></code></pre>
</div><h3 id="异常处理" tabindex="-1">异常处理 <a class="header-anchor" href="#异常处理" aria-label="Permalink to &quot;异常处理&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"abc"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">except</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ValueError</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> e:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"转换失败: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">e</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">except</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">TypeError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">KeyError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"其他异常"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"没有异常时执行"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">finally</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"无论如何都执行（清理现场）"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自定义异常</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ConfigError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    pass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> load_config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(path: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> path.endswith(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        raise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ConfigError(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"配置文件必须是 .json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><h3 id="面向对象-oop" tabindex="-1">面向对象（OOP） <a class="header-anchor" href="#面向对象-oop" aria-label="Permalink to &quot;面向对象（OOP）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dataclasses </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dataclass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Device</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    """设备基类"""</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, ip: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 502</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ip </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ip</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.port </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> port</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> connect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"connect </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ip</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.port</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __repr__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自定义打印</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Device(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ip</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Plc</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Device</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    """PLC 继承设备"""</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, ip: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, vendor: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        super</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">__init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(ip)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 调用父类构造</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.vendor </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> vendor</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> connect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 多态：重写</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.vendor</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">] "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> super</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().connect()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">devices </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [Device(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"192.168.3.10"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), Plc(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"192.168.3.11"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Siemens"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> d </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> devices:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(d.connect())</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># connect 192.168.3.10:502</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [Siemens] connect 192.168.3.11:502</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># dataclass：纯数据类，自动生成 __init__/__repr__/__eq__</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@dataclass</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Point</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    x: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">float</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    y: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">float</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Point(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(p)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Point(x=1.0, y=2.0)</span></span></code></pre>
</div><h3 id="类型注解" tabindex="-1">类型注解 <a class="header-anchor" href="#类型注解" aria-label="Permalink to &quot;类型注解&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 注解不影响运行，但配合 IDE / mypy 能提前抓住大量 bug</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> process</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(items: list[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], limit: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> dict[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {item: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> item </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> items}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> dict</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(result.items())[:limit] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> limit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result.items())</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 常见写法</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># int | None        —— 3.10+ 联合类型（旧版用 Optional[int]）</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># list[str]         —— 3.9+ 内建泛型（旧版用 List[str]）</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Callable[[int], str]  —— 可调用对象</span></span></code></pre>
</div><h3 id="模块与包" tabindex="-1">模块与包 <a class="header-anchor" href="#模块与包" aria-label="Permalink to &quot;模块与包&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># import 的几种姿势</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> os                      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 整个模块</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> numpy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> np             </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 起别名</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pathlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 只导入某个名字</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> collections </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> defaultdict, Counter</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 工程结构示例</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># my_project/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ├── .venv/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ├── my_app/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │   ├── __init__.py       # 有它才是包</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │   ├── main.py</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │   └── utils/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │       ├── __init__.py</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │       └── helpers.py</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ├── requirements.txt</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># └── README.md</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># if __name__ == "__main__" —— 作为脚本运行才执行，被导入时不执行</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">():</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"程序入口"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    main()</span></span></code></pre>
</div><h2 id="四、常用标准库" tabindex="-1">四、常用标准库 <a class="header-anchor" href="#四、常用标准库" aria-label="Permalink to &quot;四、常用标准库&quot;">&ZeroWidthSpace;</a></h2>
<p>标准库免安装、质量高，先把这些用熟：</p>
<h3 id="pathlib-——-路径操作" tabindex="-1">pathlib —— 路径操作 <a class="header-anchor" href="#pathlib-——-路径操作" aria-label="Permalink to &quot;pathlib —— 路径操作&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pathlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"data"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "logs"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "app.log"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 跨平台路径拼接</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.parent        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># data/logs</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.suffix        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># .log</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.exists()      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 是否存在</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.read_text(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)            </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 一行读文件</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.write_text(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 一行写文件</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> f </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"."</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).glob(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*.py"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 通配查找</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(f)</span></span></code></pre>
</div><h3 id="json-——-数据序列化" tabindex="-1">json —— 数据序列化 <a class="header-anchor" href="#json-——-数据序列化" aria-label="Permalink to &quot;json —— 数据序列化&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> json</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"tags"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"python"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"rpa"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> json.dumps(data, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">ensure_ascii</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">indent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 对象 -> 字符串</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> json.loads(s)                                  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字符串 -> 对象</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 读写文件</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">with</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> open</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"data.json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"w"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> f:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    json.dump(data, f, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">ensure_ascii</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">indent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><h3 id="re-——-正则表达式" tabindex="-1">re —— 正则表达式 <a class="header-anchor" href="#re-——-正则表达式" aria-label="Permalink to &quot;re —— 正则表达式&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> re</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">text </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "联系 tom@example.com 或 tom@chenpan.com.cn"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 提取所有邮箱</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">emails </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> re.findall(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">[\w.]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">@</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">[\w.]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, text)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(emails)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> re.search(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">(\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">{4}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">(\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">{2}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">(\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">{2}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"今天是 2026-09-23"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> m:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(m.group(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2026-09-23</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(m.group(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2026</span></span></code></pre>
</div><h3 id="datetime-——-日期时间" tabindex="-1">datetime —— 日期时间 <a class="header-anchor" href="#datetime-——-日期时间" aria-label="Permalink to &quot;datetime —— 日期时间&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime, timedelta, date</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">now </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime.now()</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(now.strftime(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"%Y-%m-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> %H:%M:%S"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 格式化输出</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">dt </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime.strptime(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"2026-09-23"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"%Y-%m-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字符串解析</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">tomorrow </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dt </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timedelta(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">days</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)                   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 日期运算</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((now </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dt).days)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 相差天数</span></span></code></pre>
</div><h3 id="collections-——-高级容器" tabindex="-1">collections —— 高级容器 <a class="header-anchor" href="#collections-——-高级容器" aria-label="Permalink to &quot;collections —— 高级容器&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> collections </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Counter, defaultdict, deque</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Counter 计数神器</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">words </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"apple"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"egg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"apple"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"banana"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"egg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"apple"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Counter(words).most_common(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [('apple', 3), ('egg', 2)]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># defaultdict 带默认值的字典，分组不再 KeyError</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">groups </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> defaultdict(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name, dept </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"RPA"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), (</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Jerry"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"FAB"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), (</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Bob"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"RPA"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    groups[dept].append(name)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">dict</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(groups))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># {'RPA': ['Tom', 'Bob'], 'FAB': ['Jerry']}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># deque 双端队列，适合做队列 / 滑动窗口</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">q </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> deque(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">maxlen</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    q.append(i)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(q)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># deque([2, 3, 4], maxlen=3)</span></span></code></pre>
</div><h3 id="itertools-functools-——-函数式工具" tabindex="-1">itertools / functools —— 函数式工具 <a class="header-anchor" href="#itertools-functools-——-函数式工具" aria-label="Permalink to &quot;itertools / functools —— 函数式工具&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> itertools </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> chain, groupby, product</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> functools </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> lru_cache, partial, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reduce</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(chain([</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])))      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 拼接 [1, 2, 3, 4]</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(product(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"AB"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">repeat</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 笛卡尔积</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@lru_cache</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">maxsize</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)                </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 记忆化缓存</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fib</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> fib(n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> fib(n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(fib(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 瞬间出结果</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">lambda</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> a, b: a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 120 阶乘</span></span></code></pre>
</div><h3 id="logging-——-日志-别再用-print-调试生产代码" tabindex="-1">logging —— 日志（别再用 print 调试生产代码） <a class="header-anchor" href="#logging-——-日志-别再用-print-调试生产代码" aria-label="Permalink to &quot;logging —— 日志（别再用 print 调试生产代码）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logging.basicConfig(</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    level</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logging.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">INFO</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    format</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%(asctime)s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> %(levelname)s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%(name)s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">] </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%(message)s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">log </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> logging.getLogger(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"app"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">log.info(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"服务启动"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">log.warning(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"配置缺失，使用默认值"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">except</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ZeroDivisionError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    log.exception(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"出错了"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自动附带堆栈</span></span></code></pre>
</div><h3 id="asyncio-——-异步-io" tabindex="-1">asyncio —— 异步 IO <a class="header-anchor" href="#asyncio-——-异步-io" aria-label="Permalink to &quot;asyncio —— 异步 IO&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, delay: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio.sleep(delay)      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 模拟 IO 等待</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> done"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">():</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # 并发执行，总耗时 ≈ 最长的那个，而不是相加</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    results </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio.gather(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        fetch(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"任务A"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        fetch(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"任务B"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(results)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">asyncio.run(main())</span></span></code></pre>
</div><h2 id="五、常用类库与框架" tabindex="-1">五、常用类库与框架 <a class="header-anchor" href="#五、常用类库与框架" aria-label="Permalink to &quot;五、常用类库与框架&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_5-1-常用类库速查" tabindex="-1">5.1 常用类库速查 <a class="header-anchor" href="#_5-1-常用类库速查" aria-label="Permalink to &quot;5.1 常用类库速查&quot;">&ZeroWidthSpace;</a></h3>
<p><code>pip install</code> 即用，按场景挑选：</p>
<p>| 场景 | 库 | 一句话说明 |
|</p>
]]></description>
            <content:encoded><![CDATA[<!-- DESC SEP -->
<p>一篇面向初学者的 Python 入门长文：从环境搭建、基础语法讲起，覆盖切片、推导式、生成器、装饰器、面向对象等高级特性，再按场景盘点最常用的标准库、类库与主流框架（Web / 爬虫 / RPA / AI / 调度 / 测试 / 数据），最后给出一条可执行的学习路线。</p>
<!-- DESC SEP -->
<h2 id="为什么要学-python" tabindex="-1">为什么要学 Python <a class="header-anchor" href="#为什么要学-python" aria-label="Permalink to &quot;为什么要学 Python&quot;">&ZeroWidthSpace;</a></h2>
<p>语法接近自然语言、生态极其丰富、脚本到服务端到 AI 全场景通吃。对工业自动化开发者来说，Python 是做数据处理、自动化脚本、AI 应用最快的工具。</p>
<h2 id="一、环境准备" tabindex="-1">一、环境准备 <a class="header-anchor" href="#一、环境准备" aria-label="Permalink to &quot;一、环境准备&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1. 安装 Python（建议 3.10+）：https://www.python.org/downloads/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#    Windows 安装时勾选 "Add Python to PATH"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2. 创建虚拟环境（每个项目一个，避免依赖污染）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">python</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> venv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .venv</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 3. 激活</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Windows PowerShell:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.venv\Scripts\Activate.ps1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># macOS / Linux:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">source</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .venv/bin/activate</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 4. 安装第三方包</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> requests</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> freeze</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> requirements.txt</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 导出依赖清单</span></span></code></pre>
</div><h2 id="二、基础语法" tabindex="-1">二、基础语法 <a class="header-anchor" href="#二、基础语法" aria-label="Permalink to &quot;二、基础语法&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="变量与基本类型" tabindex="-1">变量与基本类型 <a class="header-anchor" href="#变量与基本类型" aria-label="Permalink to &quot;变量与基本类型&quot;">&ZeroWidthSpace;</a></h3>
<p>Python 是动态类型语言，变量无需声明类型：</p>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Tom"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">          # str 字符串</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">age </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 30</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">              # int 整数</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">height </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1.75</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">         # float 浮点数</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">active </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> True</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">         # bool 布尔值（注意大写开头）</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nothing </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # NoneType 空值</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># type() 查看类型</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(age))      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># &#x3C;class 'int'></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 类型转换</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"42"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># str -> int</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3.14</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># float -> str</span></span></code></pre>
</div><h3 id="字符串" tabindex="-1">字符串 <a class="header-anchor" href="#字符串" aria-label="Permalink to &quot;字符串&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Hello, Python"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># f-string 格式化（推荐，3.6+）</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lang </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Python"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"我在学 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lang</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">，今年是 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{2026}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 年"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 常用方法</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s.lower())          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 转小写</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s.split(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">", "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 切分 -> ['Hello', 'Python']</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s.replace(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Hi"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"  pad  "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.strip())  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 去首尾空白</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s))             </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 长度</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Py"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> s)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 包含判断 -> True</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 多行字符串</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">text </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> """第一行</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">第二行"""</span></span></code></pre>
</div><h3 id="运算符" tabindex="-1">运算符 <a class="header-anchor" href="#运算符" aria-label="Permalink to &quot;运算符&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">a, b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">//</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 13 3.3333 3（// 整除）</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1 1000（% 取余，** 幂）</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 比较与逻辑</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">and</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># True</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b))           </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># True</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 海象运算符（3.8+）：赋值同时判断</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n)                  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 10</span></span></code></pre>
</div><h3 id="条件与循环" tabindex="-1">条件与循环 <a class="header-anchor" href="#条件与循环" aria-label="Permalink to &quot;条件与循环&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># if / elif / else —— 注意：Python 用缩进表示代码块</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">score </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 85</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> score </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 90</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"优秀"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">elif</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> score </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 80</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"良好"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"继续努力"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># for 循环遍历</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 0 1 2 3 4</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ch </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "abc"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 遍历字符串</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(ch)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># while 循环</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(count)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># break 跳出 / continue 跳过本轮</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        continue</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        break</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)</span></span></code></pre>
</div><h3 id="函数" tabindex="-1">函数 <a class="header-anchor" href="#函数" aria-label="Permalink to &quot;函数&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> greet</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, greeting: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    """位置参数 + 默认参数"""</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">greeting</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(greet(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))                     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Hello, Tom!</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(greet(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">greeting</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"你好"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 你好, Tom!</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 可变参数</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> total</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">args, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kwargs):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(args)      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 元组：位置参数打包</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(kwargs)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字典：关键字参数打包</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">total(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># (1, 2) {'x': 3, 'y': 4}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 多返回值（其实是元组解包）</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> min_max</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> min</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums), </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">max</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lo, hi </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> min_max([</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(lo, hi)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1 5</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 匿名函数</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pairs </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'b'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'a'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pairs.sort(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=lambda</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> p: p[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 按第二个元素排序</span></span></code></pre>
</div><h3 id="四大内建数据结构" tabindex="-1">四大内建数据结构 <a class="header-anchor" href="#四大内建数据结构" aria-label="Permalink to &quot;四大内建数据结构&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># list 列表 —— 有序、可变</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums.append(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 尾部追加</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums.insert(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 指定位置插入</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">nums.pop()              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 弹出尾部</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(nums[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], nums[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 首元素 / 末元素</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># tuple 元组 —— 有序、不可变</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">point </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">20</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x, y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> point            </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 解包</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># dict 字典 —— 键值对、查找 O(1)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"age"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">30</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">user[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "tom@example.com"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # 增/改</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(user.get(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"phone"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"未设置"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 安全读取，避免 KeyError</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> key, value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user.items():      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 遍历</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(key, value)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># set 集合 —— 去重、交并差</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 交集 {2, 3}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 并集 {1, 2, 3, 4}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 差集 {1}</span></span></code></pre>
</div><h2 id="三、高级语法" tabindex="-1">三、高级语法 <a class="header-anchor" href="#三、高级语法" aria-label="Permalink to &quot;三、高级语法&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="切片-sequence-slicing" tabindex="-1">切片（Sequence Slicing） <a class="header-anchor" href="#切片-sequence-slicing" aria-label="Permalink to &quot;切片（Sequence Slicing）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [1, 2, 3]     下标 [1, 4)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [0, 1, 2]     前三个</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:]      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [4, 5]        最后两个</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[::</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [0, 2, 4]     步长 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lst[::</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 反转</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Python"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s[::</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># nohtyP —— 字符串同样适用</span></span></code></pre>
</div><h3 id="推导式-comprehension" tabindex="-1">推导式（Comprehension） <a class="header-anchor" href="#推导式-comprehension" aria-label="Permalink to &quot;推导式（Comprehension）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 列表推导式</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">squares </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">evens </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">20</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 带条件的嵌套</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">matrix </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">flat </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> row </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> matrix </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> row]   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [1, 2, 3, 4]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字典 / 集合推导式</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name_lens </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {name: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Jerry"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">unique_lens </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Jerry"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Bob"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 生成器表达式 —— 惰性求值，省内存</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">total </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1_000_000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span></code></pre>
</div><h3 id="迭代器与生成器" tabindex="-1">迭代器与生成器 <a class="header-anchor" href="#迭代器与生成器" aria-label="Permalink to &quot;迭代器与生成器&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 生成器函数：yield 逐个产出，不一次性占用内存</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> countdown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        yield</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> countdown(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i)     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 3 2 1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 处理大文件的标准姿势</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># with open("huge.log", encoding="utf-8") as f:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#     for line in f:          # 逐行读取</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#         process(line)</span></span></code></pre>
</div><h3 id="装饰器-decorator" tabindex="-1">装饰器（Decorator） <a class="header-anchor" href="#装饰器-decorator" aria-label="Permalink to &quot;装饰器（Decorator）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> functools</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> time</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 装饰器：在不改函数代码的前提下叠加行为（计时、缓存、鉴权……）</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> timer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(func):</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    @functools.wraps</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(func)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> wrapper</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">args, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kwargs):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> time.perf_counter()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> func(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">args, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">**</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">kwargs)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">func.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">__name__}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 耗时 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">time.perf_counter() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.3f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">s"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> wrapper</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@timer</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> work</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n))</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">work(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10_000_000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># work 耗时 0.21s</span></span></code></pre>
</div><h3 id="上下文管理器-with-语句" tabindex="-1">上下文管理器（with 语句） <a class="header-anchor" href="#上下文管理器-with-语句" aria-label="Permalink to &quot;上下文管理器（with 语句）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># with 自动释放资源：文件、锁、数据库连接……</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">with</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> open</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"demo.txt"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"w"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> f:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    f.write(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"自动关闭文件，即使中途抛异常"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自定义上下文管理器</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> contextlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> contextmanager</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@contextmanager</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> timer_block</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    start </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> time.perf_counter()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        yield</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    finally</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 耗时 </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">time.perf_counter() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> start</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.3f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">s"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">with</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timer_block(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"任务"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1_000_000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span></code></pre>
</div><h3 id="异常处理" tabindex="-1">异常处理 <a class="header-anchor" href="#异常处理" aria-label="Permalink to &quot;异常处理&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"abc"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">except</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ValueError</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> e:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"转换失败: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">e</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">except</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">TypeError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">KeyError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"其他异常"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"没有异常时执行"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">finally</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"无论如何都执行（清理现场）"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自定义异常</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ConfigError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    pass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> load_config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(path: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> path.endswith(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        raise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ConfigError(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"配置文件必须是 .json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><h3 id="面向对象-oop" tabindex="-1">面向对象（OOP） <a class="header-anchor" href="#面向对象-oop" aria-label="Permalink to &quot;面向对象（OOP）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dataclasses </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dataclass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Device</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    """设备基类"""</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, ip: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, port: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 502</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ip </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ip</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.port </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> port</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> connect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"connect </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ip</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.port</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __repr__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自定义打印</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Device(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ip</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Plc</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">Device</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    """PLC 继承设备"""</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self, ip: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, vendor: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        super</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">__init__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(ip)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 调用父类构造</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.vendor </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> vendor</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> connect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 多态：重写</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{self</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.vendor</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">] "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> super</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().connect()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">devices </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [Device(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"192.168.3.10"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), Plc(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"192.168.3.11"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Siemens"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> d </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> devices:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(d.connect())</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># connect 192.168.3.10:502</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [Siemens] connect 192.168.3.11:502</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># dataclass：纯数据类，自动生成 __init__/__repr__/__eq__</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@dataclass</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Point</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    x: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">float</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    y: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">float</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Point(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2.0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(p)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Point(x=1.0, y=2.0)</span></span></code></pre>
</div><h3 id="类型注解" tabindex="-1">类型注解 <a class="header-anchor" href="#类型注解" aria-label="Permalink to &quot;类型注解&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 注解不影响运行，但配合 IDE / mypy 能提前抓住大量 bug</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> process</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(items: list[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], limit: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> dict[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {item: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> item </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> items}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> dict</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(result.items())[:limit] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> limit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result.items())</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 常见写法</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># int | None        —— 3.10+ 联合类型（旧版用 Optional[int]）</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># list[str]         —— 3.9+ 内建泛型（旧版用 List[str]）</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Callable[[int], str]  —— 可调用对象</span></span></code></pre>
</div><h3 id="模块与包" tabindex="-1">模块与包 <a class="header-anchor" href="#模块与包" aria-label="Permalink to &quot;模块与包&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># import 的几种姿势</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> os                      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 整个模块</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> numpy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> np             </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 起别名</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pathlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 只导入某个名字</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> collections </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> defaultdict, Counter</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 工程结构示例</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># my_project/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ├── .venv/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ├── my_app/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │   ├── __init__.py       # 有它才是包</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │   ├── main.py</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │   └── utils/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │       ├── __init__.py</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># │       └── helpers.py</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># ├── requirements.txt</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># └── README.md</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># if __name__ == "__main__" —— 作为脚本运行才执行，被导入时不执行</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">():</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"程序入口"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> __name__</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "__main__"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    main()</span></span></code></pre>
</div><h2 id="四、常用标准库" tabindex="-1">四、常用标准库 <a class="header-anchor" href="#四、常用标准库" aria-label="Permalink to &quot;四、常用标准库&quot;">&ZeroWidthSpace;</a></h2>
<p>标准库免安装、质量高，先把这些用熟：</p>
<h3 id="pathlib-——-路径操作" tabindex="-1">pathlib —— 路径操作 <a class="header-anchor" href="#pathlib-——-路径操作" aria-label="Permalink to &quot;pathlib —— 路径操作&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pathlib </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"data"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "logs"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "app.log"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 跨平台路径拼接</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.parent        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># data/logs</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.suffix        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># .log</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.exists()      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 是否存在</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.read_text(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)            </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 一行读文件</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">p.write_text(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hello"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 一行写文件</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> f </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Path(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"."</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).glob(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*.py"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 通配查找</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(f)</span></span></code></pre>
</div><h3 id="json-——-数据序列化" tabindex="-1">json —— 数据序列化 <a class="header-anchor" href="#json-——-数据序列化" aria-label="Permalink to &quot;json —— 数据序列化&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> json</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"tags"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"python"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"rpa"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> json.dumps(data, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">ensure_ascii</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">indent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 对象 -> 字符串</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> json.loads(s)                                  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字符串 -> 对象</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 读写文件</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">with</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> open</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"data.json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"w"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">encoding</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> f:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    json.dump(data, f, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">ensure_ascii</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">indent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><h3 id="re-——-正则表达式" tabindex="-1">re —— 正则表达式 <a class="header-anchor" href="#re-——-正则表达式" aria-label="Permalink to &quot;re —— 正则表达式&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> re</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">text </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "联系 tom@example.com 或 tom@chenpan.com.cn"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 提取所有邮箱</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">emails </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> re.findall(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">[\w.]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">@</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">[\w.]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, text)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(emails)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> re.search(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">r</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">(\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">{4}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">(\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">{2}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">(\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">{2}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"今天是 2026-09-23"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> m:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(m.group(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2026-09-23</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(m.group(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2026</span></span></code></pre>
</div><h3 id="datetime-——-日期时间" tabindex="-1">datetime —— 日期时间 <a class="header-anchor" href="#datetime-——-日期时间" aria-label="Permalink to &quot;datetime —— 日期时间&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime, timedelta, date</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">now </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime.now()</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(now.strftime(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"%Y-%m-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> %H:%M:%S"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 格式化输出</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">dt </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> datetime.strptime(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"2026-09-23"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"%Y-%m-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 字符串解析</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">tomorrow </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dt </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timedelta(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">days</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)                   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 日期运算</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((now </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dt).days)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 相差天数</span></span></code></pre>
</div><h3 id="collections-——-高级容器" tabindex="-1">collections —— 高级容器 <a class="header-anchor" href="#collections-——-高级容器" aria-label="Permalink to &quot;collections —— 高级容器&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> collections </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Counter, defaultdict, deque</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Counter 计数神器</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">words </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"apple"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"egg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"apple"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"banana"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"egg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"apple"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Counter(words).most_common(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># [('apple', 3), ('egg', 2)]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># defaultdict 带默认值的字典，分组不再 KeyError</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">groups </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> defaultdict(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name, dept </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"RPA"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), (</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Jerry"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"FAB"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), (</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Bob"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"RPA"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    groups[dept].append(name)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">dict</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(groups))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># {'RPA': ['Tom', 'Bob'], 'FAB': ['Jerry']}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># deque 双端队列，适合做队列 / 滑动窗口</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">q </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> deque(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">maxlen</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    q.append(i)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(q)    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># deque([2, 3, 4], maxlen=3)</span></span></code></pre>
</div><h3 id="itertools-functools-——-函数式工具" tabindex="-1">itertools / functools —— 函数式工具 <a class="header-anchor" href="#itertools-functools-——-函数式工具" aria-label="Permalink to &quot;itertools / functools —— 函数式工具&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> itertools </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> chain, groupby, product</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> functools </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> lru_cache, partial, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reduce</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(chain([</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])))      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 拼接 [1, 2, 3, 4]</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">list</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(product(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"AB"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">repeat</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 笛卡尔积</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@lru_cache</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">maxsize</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">None</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)                </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 记忆化缓存</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fib</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> fib(n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> fib(n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(fib(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 瞬间出结果</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">lambda</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> a, b: a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">range</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 120 阶乘</span></span></code></pre>
</div><h3 id="logging-——-日志-别再用-print-调试生产代码" tabindex="-1">logging —— 日志（别再用 print 调试生产代码） <a class="header-anchor" href="#logging-——-日志-别再用-print-调试生产代码" aria-label="Permalink to &quot;logging —— 日志（别再用 print 调试生产代码）&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logging.basicConfig(</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    level</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">logging.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">INFO</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">    format</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%(asctime)s</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> %(levelname)s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%(name)s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">] </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%(message)s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">log </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> logging.getLogger(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"app"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">log.info(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"服务启动"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">log.warning(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"配置缺失，使用默认值"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">except</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ZeroDivisionError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    log.exception(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"出错了"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自动附带堆栈</span></span></code></pre>
</div><h3 id="asyncio-——-异步-io" tabindex="-1">asyncio —— 异步 IO <a class="header-anchor" href="#asyncio-——-异步-io" aria-label="Permalink to &quot;asyncio —— 异步 IO&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(name: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, delay: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) -> </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio.sleep(delay)      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 模拟 IO 等待</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> done"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">():</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # 并发执行，总耗时 ≈ 最长的那个，而不是相加</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    results </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> asyncio.gather(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        fetch(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"任务A"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        fetch(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"任务B"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(results)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">asyncio.run(main())</span></span></code></pre>
</div><h2 id="五、常用类库与框架" tabindex="-1">五、常用类库与框架 <a class="header-anchor" href="#五、常用类库与框架" aria-label="Permalink to &quot;五、常用类库与框架&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_5-1-常用类库速查" tabindex="-1">5.1 常用类库速查 <a class="header-anchor" href="#_5-1-常用类库速查" aria-label="Permalink to &quot;5.1 常用类库速查&quot;">&ZeroWidthSpace;</a></h3>
<p><code>pip install</code> 即用，按场景挑选：</p>
<table tabindex="0">
<thead>
<tr>
<th>场景</th>
<th>库</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTTP 请求</td>
<td>requests / httpx</td>
<td>httpx 支持异步</td>
</tr>
<tr>
<td>数值计算</td>
<td>numpy</td>
<td>多维数组与向量化运算</td>
</tr>
<tr>
<td>数据分析</td>
<td>pandas</td>
<td>表格数据处理神器</td>
</tr>
<tr>
<td>可视化</td>
<td>matplotlib / plotly</td>
<td>画图</td>
</tr>
<tr>
<td>Web 框架</td>
<td>FastAPI / Flask</td>
<td>接口服务首选 FastAPI</td>
</tr>
<tr>
<td>数据校验</td>
<td>pydantic</td>
<td>用类型注解做参数校验</td>
</tr>
<tr>
<td>数据库</td>
<td>SQLAlchemy</td>
<td>Python 生态最主流的 ORM</td>
</tr>
<tr>
<td>自动化办公</td>
<td>openpyxl / python-docx</td>
<td>读写 Excel / Word</td>
</tr>
<tr>
<td>爬虫</td>
<td>scrapy / playwright</td>
<td>playwright 能驱动真实浏览器</td>
</tr>
<tr>
<td>测试</td>
<td>pytest</td>
<td>简洁强大的测试框架</td>
</tr>
<tr>
<td>终端美化</td>
<td>rich / typer</td>
<td>rich 画表格进度条，typer 做 CLI</td>
</tr>
<tr>
<td>任务调度</td>
<td>APScheduler</td>
<td>定时任务</td>
</tr>
</tbody>
</table>
<h3 id="_5-2-常用框架盘点-按场景" tabindex="-1">5.2 常用框架盘点（按场景） <a class="header-anchor" href="#_5-2-常用框架盘点-按场景" aria-label="Permalink to &quot;5.2 常用框架盘点（按场景）&quot;">&ZeroWidthSpace;</a></h3>
<p>框架比类库更「重」—— 它规定了你写代码的骨架。挑主流的记：</p>
<p><strong>🌐 Web 开发</strong></p>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>FastAPI</td>
<td>现代异步框架，类型注解即参数校验，自带交互式 API 文档</td>
</tr>
<tr>
<td>Flask</td>
<td>轻量灵活、插件丰富，小项目首选</td>
</tr>
<tr>
<td>Django</td>
<td>大而全的「全家桶」，自带 ORM / Admin / Auth，适合内容型网站</td>
</tr>
</tbody>
</table>
<p><strong>🕷️ 爬虫与浏览器自动化</strong></p>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Scrapy</td>
<td>工业级爬虫框架，调度、并发、管道一体化</td>
</tr>
<tr>
<td>Playwright</td>
<td>微软出品，驱动真实浏览器，自动等待元素，爬动态页首选</td>
</tr>
<tr>
<td>Selenium</td>
<td>老牌浏览器自动化，资料最多</td>
</tr>
<tr>
<td>DrissionPage</td>
<td>国产亮点，requests 与浏览器模式二合一，上手极快</td>
</tr>
</tbody>
</table>
<p><strong>🖥️ 桌面与 RPA 自动化</strong></p>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>PyAutoGUI</td>
<td>跨平台键鼠模拟，坐标点击 / 截图找图</td>
</tr>
<tr>
<td>pywinauto / uiautomation</td>
<td>Windows 原生控件级自动化，比坐标点击稳得多</td>
</tr>
<tr>
<td>OpenCV（cv2）</td>
<td>图像定位与识别，配合键鼠模拟做「视觉 RPA」</td>
</tr>
<tr>
<td>robotframework</td>
<td>关键字驱动的 RPA / 测试框架，业务人员也能写用例</td>
</tr>
</tbody>
</table>
<p><strong>🤖 AI 与大模型应用</strong></p>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>openai / anthropic（SDK）</td>
<td>调用 GPT / Claude 等大模型 API 的官方客户端</td>
</tr>
<tr>
<td>LangChain</td>
<td>LLM 应用编排框架，链式调用、工具、Agent 一站式</td>
</tr>
<tr>
<td>LlamaIndex</td>
<td>专注 RAG（检索增强生成）的数据接入与索引框架</td>
</tr>
<tr>
<td>Transformers（HF）</td>
<td>一行代码本地跑开源模型</td>
</tr>
</tbody>
</table>
<p><strong>⏰ 任务队列与调度</strong></p>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Celery</td>
<td>分布式任务队列的事实标准，配合 Redis / RabbitMQ</td>
</tr>
<tr>
<td>APScheduler</td>
<td>进程内定时任务，cron 风格语法</td>
</tr>
<tr>
<td>Huey</td>
<td>轻量级 Celery 替代，小项目够用</td>
</tr>
</tbody>
</table>
<p><strong>✅ 测试与工程质量</strong></p>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>pytest</td>
<td>Python 测试事实标准，断言直接写、插件生态庞大</td>
</tr>
<tr>
<td>hypothesis</td>
<td>基于性质（property-based）自动生成测试数据</td>
</tr>
<tr>
<td>ruff / black</td>
<td>代码检查 + 格式化，二件套</td>
</tr>
</tbody>
</table>
<p><strong>📊 数据处理</strong></p>
<table tabindex="0">
<thead>
<tr>
<th>框架</th>
<th>一句话说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>numpy</td>
<td>多维数组与向量化运算，一切数据科学的底座</td>
</tr>
<tr>
<td>pandas</td>
<td>表格数据处理神器</td>
</tr>
<tr>
<td>polars</td>
<td>Rust 内核的新一代 DataFrame，比 pandas 快得多</td>
</tr>
<tr>
<td>matplotlib / plotly</td>
<td>静态图 / 交互图可视化</td>
</tr>
</tbody>
</table>
<blockquote>
<p>选型建议：Web 选 FastAPI，爬虫选 Scrapy / Playwright，桌面自动化选 PyAutoGUI + pywinauto 组合，AI 应用选 LangChain。<strong>每个场景先用一个主流的，不要在选型上耗太久。</strong></p>
</blockquote>
<h3 id="_5-3-高频使用示例" tabindex="-1">5.3 高频使用示例 <a class="header-anchor" href="#_5-3-高频使用示例" aria-label="Permalink to &quot;5.3 高频使用示例&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># requests —— 调接口</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> requests</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">resp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> requests.get(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"https://httpbin.org/json"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">timeout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">resp.raise_for_status()          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 非 2xx 直接抛异常</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(resp.json()[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"slideshow"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">][</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"title"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># pandas —— 表格处理</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pandas </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pd</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">df </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pd.DataFrame({</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "设备"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"PLC-1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"PLC-2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"PLC-3"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "产量"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">120</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">95</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">130</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(df.describe())          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 统计摘要</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(df.sort_values(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"产量"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">ascending</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 排序</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">df.to_excel(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"output.xlsx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">index</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)          </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 一行导出 Excel</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># FastAPI —— 三行起一个接口服务</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> fastapi </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> FastAPI</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> FastAPI()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">@app.get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/devices/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{device_id}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> get_device</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(device_id: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"id"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: device_id, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"online"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># uvicorn main:app --reload 启动，自带交互式文档 /docs</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># pydantic —— 数据模型校验</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> pydantic </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> BaseModel, EmailStr</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">BaseModel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">):</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    name: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">str</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    email: EmailStr        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 自动校验邮箱格式</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    age: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> None</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> User(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Tom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">email</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"tom@example.com"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(user.model_dump())</span></span></code></pre>
</div><h2 id="六、学习路线建议" tabindex="-1">六、学习路线建议 <a class="header-anchor" href="#六、学习路线建议" aria-label="Permalink to &quot;六、学习路线建议&quot;">&ZeroWidthSpace;</a></h2>
<ol>
<li><strong>第一周</strong>：基础语法 + 四大数据结构，把本文第二节敲一遍（一定要手敲）</li>
<li><strong>第二周</strong>：切片、推导式、异常处理、文件读写，能写脚本处理 Excel/文本</li>
<li><strong>第三、四周</strong>：面向对象 + 常用标准库（pathlib / json / logging），写一个完整的小工具</li>
<li><strong>进阶</strong>：装饰器、生成器、asyncio、类型注解，读开源项目源码</li>
<li><strong>实战方向</strong>：办公自动化（openpyxl）→ 数据分析（pandas）→ 接口服务（FastAPI）→ AI 应用（调用大模型 API）</li>
</ol>
<p>两个建议：</p>
<ul>
<li><strong>先跑起来再优化</strong>。脚本思维很重要，不要一上来就设计模式。</li>
<li><strong>用好官方文档与 REPL</strong>。<code>python</code> 直接敲命令行进交互环境，<code>help(list)</code> 随手查。</li>
</ul>
<blockquote>
<p>本文环境：Python 3.12 · 示例均可直接复制运行（第三方库需先 pip 安装）</p>
</blockquote>
]]></content:encoded>
            <author>tom@chenpan.com.cn (Tom Chen)</author>
        </item>
        <item>
            <title><![CDATA[YOLO26 实战：目标检测新特性与工业视觉检测落地]]></title>
            <link>https://chenpan.com.cn/posts/2026/yolo26-industrial-vision-detection</link>
            <guid>https://chenpan.com.cn/posts/2026/yolo26-industrial-vision-detection</guid>
            <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<!-- DESC SEP -->
<p>一篇面向工程师的 YOLO26 实战长文：一分钟回顾 YOLO 的检测原理与发展脉络，逐条拆解 YOLO26 的六大新特性（NMS-Free 端到端、移除 DFL、MuSGD 优化器、RLA-D 检测头、小目标增强、消费级 GPU 分布式训练）；再用 ultralytics 十行代码跑通推理，从数据标注到训练自己的工业数据集，最后给出缺陷检测的调优经验与产线部署方案。</p>
<!-- DESC SEP -->
<h2 id="一、yolo-一分钟-为什么它能做到-实时" tabindex="-1">一、YOLO 一分钟：为什么它能做到&quot;实时&quot; <a class="header-anchor" href="#一、yolo-一分钟-为什么它能做到-实时" aria-label="Permalink to &quot;一、YOLO 一分钟：为什么它能做到&quot;实时&quot;&quot;">&ZeroWidthSpace;</a></h2>
<p>YOLO（You Only Look Once）是单阶段（one-stage）目标检测的开山之作：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>传统两阶段：先生成候选框（慢）→ 再分类回归</span></span>
<span class="line"><span>YOLO 单阶段：整张图一次前向传播，同时输出所有框的位置 + 类别 + 置信度</span></span></code></pre>
</div><p>一次前向就出全部结果，天然适合实时场景——产线相机 30fps 连拍、边缘设备低延迟推理，都是 YOLO 的主场。</p>
<h3 id="发展脉络一览" tabindex="-1">发展脉络一览 <a class="header-anchor" href="#发展脉络一览" aria-label="Permalink to &quot;发展脉络一览&quot;">&ZeroWidthSpace;</a></h3>
<p>| 版本 | 年份 | 关键词 |
|</p>
]]></description>
            <content:encoded><![CDATA[<!-- DESC SEP -->
<p>一篇面向工程师的 YOLO26 实战长文：一分钟回顾 YOLO 的检测原理与发展脉络，逐条拆解 YOLO26 的六大新特性（NMS-Free 端到端、移除 DFL、MuSGD 优化器、RLA-D 检测头、小目标增强、消费级 GPU 分布式训练）；再用 ultralytics 十行代码跑通推理，从数据标注到训练自己的工业数据集，最后给出缺陷检测的调优经验与产线部署方案。</p>
<!-- DESC SEP -->
<h2 id="一、yolo-一分钟-为什么它能做到-实时" tabindex="-1">一、YOLO 一分钟：为什么它能做到&quot;实时&quot; <a class="header-anchor" href="#一、yolo-一分钟-为什么它能做到-实时" aria-label="Permalink to &quot;一、YOLO 一分钟：为什么它能做到&quot;实时&quot;&quot;">&ZeroWidthSpace;</a></h2>
<p>YOLO（You Only Look Once）是单阶段（one-stage）目标检测的开山之作：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>传统两阶段：先生成候选框（慢）→ 再分类回归</span></span>
<span class="line"><span>YOLO 单阶段：整张图一次前向传播，同时输出所有框的位置 + 类别 + 置信度</span></span></code></pre>
</div><p>一次前向就出全部结果，天然适合实时场景——产线相机 30fps 连拍、边缘设备低延迟推理，都是 YOLO 的主场。</p>
<h3 id="发展脉络一览" tabindex="-1">发展脉络一览 <a class="header-anchor" href="#发展脉络一览" aria-label="Permalink to &quot;发展脉络一览&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>版本</th>
<th>年份</th>
<th>关键词</th>
</tr>
</thead>
<tbody>
<tr>
<td>YOLOv1</td>
<td>2016</td>
<td>开创单阶段检测</td>
</tr>
<tr>
<td>YOLOv3</td>
<td>2018</td>
<td>多尺度预测（FPN），小目标改善</td>
</tr>
<tr>
<td>YOLOv5</td>
<td>2020</td>
<td>工程化标杆：PyTorch + 部署生态完善</td>
</tr>
<tr>
<td>YOLOv8</td>
<td>2023</td>
<td>ultralytics 统一框架，支持检测/分割/姿态/OBB</td>
</tr>
<tr>
<td>YOLO11</td>
<td>2024</td>
<td>C3k2 模块，更少参数更高精度</td>
</tr>
<tr>
<td><strong>YOLO26</strong></td>
<td>2025</td>
<td><strong>端到端 NMS-Free、移除 DFL、MuSGD 优化器、小目标增强</strong></td>
</tr>
</tbody>
</table>
<h2 id="二、yolo26-六大新特性" tabindex="-1">二、YOLO26 六大新特性 <a class="header-anchor" href="#二、yolo26-六大新特性" aria-label="Permalink to &quot;二、YOLO26 六大新特性&quot;">&ZeroWidthSpace;</a></h2>
<p>YOLO26 是 Ultralytics 在 2025 年 9 月 YOLO Vision 活动上发布的版本，围绕**&quot;更好训练、更容易部署&quot;**两条主线：</p>
<h3 id="_1-端到端-nms-free" tabindex="-1">① 端到端 NMS-Free <a class="header-anchor" href="#_1-端到端-nms-free" aria-label="Permalink to &quot;① 端到端 NMS-Free&quot;">&ZeroWidthSpace;</a></h3>
<p>历代 YOLO 的原始输出是&quot;一堆重叠候选框&quot;，要靠 <strong>NMS（非极大值抑制）</strong> 后处理去重——这一步是串行计算，在边缘设备上经常要额外写 NMS 插件，又慢又麻烦。</p>
<p>YOLO26 训练策略升级，<strong>直接输出最终结果，不需要 NMS</strong>：</p>
<ul>
<li>导出 ONNX / TFLite 更干净，端侧部署不再被 NMS 卡脖子</li>
<li>推理延迟稳定可预期（不再有框多框少导致的延迟波动）</li>
</ul>
<h3 id="_2-移除-dfl-模块" tabindex="-1">② 移除 DFL 模块 <a class="header-anchor" href="#_2-移除-dfl-模块" aria-label="Permalink to &quot;② 移除 DFL 模块&quot;">&ZeroWidthSpace;</a></h3>
<p>DFL（Distribution Focal Loss，框分布建模）是精度功臣，但它的运算在<strong>整数化的 NPU / MCU 上不友好</strong>。YOLO26 移除 DFL，换来了：</p>
<ul>
<li>全整数（full integer）推理路径打通</li>
<li>更好地适配 ARM、RK3588、Jetson 等边缘芯片</li>
</ul>
<blockquote>
<p>一句话：<strong>精度换部署友好</strong>，对产线落地是净收益。</p>
</blockquote>
<h3 id="_3-musgd-优化器" tabindex="-1">③ MuSGD 优化器 <a class="header-anchor" href="#_3-musgd-优化器" aria-label="Permalink to &quot;③ MuSGD 优化器&quot;">&ZeroWidthSpace;</a></h3>
<p>融合 <strong>SGD</strong> 与 <strong>Muon</strong>（借鉴 Moonshot AI Kimi K2 大模型训练经验）的新优化器：收敛更快，训练更稳。训练 YOLO26 不用再纠结&quot;SGD 还是 Adam&quot;。</p>
<h3 id="_4-rla-d-检测头" tabindex="-1">④ RLA-D 检测头 <a class="header-anchor" href="#_4-rla-d-检测头" aria-label="Permalink to &quot;④ RLA-D 检测头&quot;">&ZeroWidthSpace;</a></h3>
<p>感受野对齐蒸馏（Receptive-field Alignment Distillation）检测头：让检测头与卷积特征的感受野更好对齐，<strong>小目标 mAP +1.5</strong>。</p>
<h3 id="_5-progloss-stal-小目标增强" tabindex="-1">⑤ ProgLoss + STAL 小目标增强 <a class="header-anchor" href="#_5-progloss-stal-小目标增强" aria-label="Permalink to &quot;⑤ ProgLoss + STAL 小目标增强&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><strong>ProgLoss</strong>：渐进式损失平衡</li>
<li><strong>STAL</strong>：小目标感知的标签分配（Small-Target-Aware Label assignment）</li>
</ul>
<p>两者叠加，<strong>Nano 级模型的小目标 mAP +2.9</strong>——工业缺陷检测大多是&quot;小目标&quot;问题，这条最实用。</p>
<h3 id="_6-更小、更快、更民主的训练" tabindex="-1">⑥ 更小、更快、更民主的训练 <a class="header-anchor" href="#_6-更小、更快、更民主的训练" aria-label="Permalink to &quot;⑥ 更小、更快、更民主的训练&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>同等精度下<strong>参数量最高减少 43%</strong></li>
<li>Nano 模型 COCO 推理延迟约 <strong>1.7ms</strong>（T4 GPU）</li>
<li><strong>分布式训练平民化</strong>：8 张消费级 RTX 4050 即可开 DDP 训练大模型——不再必须 A100/H100</li>
</ul>
<h3 id="任务与型号家族" tabindex="-1">任务与型号家族 <a class="header-anchor" href="#任务与型号家族" aria-label="Permalink to &quot;任务与型号家族&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>型号</th>
<th>定位</th>
</tr>
</thead>
<tbody>
<tr>
<td>yolo26n / s</td>
<td>边缘设备、CPU、实时性优先</td>
</tr>
<tr>
<td>yolo26m</td>
<td>通用产线检测（性价比之选）</td>
</tr>
<tr>
<td>yolo26l / x</td>
<td>服务器端追求极致精度</td>
</tr>
</tbody>
</table>
<p>支持任务：<strong>检测 / 分割 / 分类 / 姿态估计 / 旋转框（OBB）</strong> 全家桶，API 与 v8/v11 完全一致。</p>
<h2 id="三、快速上手-三步跑通" tabindex="-1">三、快速上手：三步跑通 <a class="header-anchor" href="#三、快速上手-三步跑通" aria-label="Permalink to &quot;三、快速上手：三步跑通&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ultralytics</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # 一把梭安装（含 PyTorch）</span></span></code></pre>
</div><p><strong>① 命令行推理</strong>（自动下载预训练权重）：</p>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yolo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> predict</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> model=yolo26n.pt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> source="factory_floor.jpg"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yolo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> predict</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> model=yolo26n.pt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> source="screen.mp4"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> show=True</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">   # 视频/摄像头</span></span></code></pre>
</div><p><strong>② Python API</strong>：</p>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ultralytics </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> YOLO</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">model </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> YOLO(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"yolo26n.pt"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)                  </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 预训练模型</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">results </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> model(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"defect_part.jpg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">conf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> r </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> results:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> box </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> r.boxes:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        cls</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> model.names[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(box.cls)]     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 类别名</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        conf </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> float</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(box.conf)              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 置信度</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        x1, y1, x2, y2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> box.xyxy[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].tolist()   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 框坐标</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{cls}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> {</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">conf</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.2f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.0f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">y1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.0f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)-(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.0f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">y2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:.0f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    r.save(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">filename</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"result.jpg"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)           </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 保存可视化</span></span></code></pre>
</div><p><strong>③ 训练自己的数据集</strong>（详见下一节）：</p>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yolo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> detect</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> train</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> model=yolo26n.pt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> data=defect.yaml</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> epochs=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> imgsz=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">640</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> batch=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">16</span></span></code></pre>
</div><h2 id="四、训练自己的工业检测数据集" tabindex="-1">四、训练自己的工业检测数据集 <a class="header-anchor" href="#四、训练自己的工业检测数据集" aria-label="Permalink to &quot;四、训练自己的工业检测数据集&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_4-1-数据标注" tabindex="-1">4.1 数据标注 <a class="header-anchor" href="#_4-1-数据标注" aria-label="Permalink to &quot;4.1 数据标注&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>工具</th>
<th>特点</th>
</tr>
</thead>
<tbody>
<tr>
<td>LabelImg / Label Studio</td>
<td>经典框选标注，输出 YOLO txt 格式</td>
</tr>
<tr>
<td>X-AnyLabeling</td>
<td>支持模型预标注（用大模型辅助打框，效率翻倍）</td>
</tr>
<tr>
<td>Roboflow</td>
<td>在线平台，标注 + 增强 + 版本管理</td>
</tr>
</tbody>
</table>
<p>YOLO 标注格式（每张图一个 txt，一行一个目标）：</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span># class_id  x_center  y_center  width  height   （全部归一化到 0~1）</span></span>
<span class="line"><span>0 0.512 0.340 0.180 0.220</span></span>
<span class="line"><span>1 0.755 0.610 0.090 0.150</span></span></code></pre>
</div><h3 id="_4-2-数据集目录与配置" tabindex="-1">4.2 数据集目录与配置 <a class="header-anchor" href="#_4-2-数据集目录与配置" aria-label="Permalink to &quot;4.2 数据集目录与配置&quot;">&ZeroWidthSpace;</a></h3>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span>defect_dataset/</span></span>
<span class="line"><span>├── images/</span></span>
<span class="line"><span>│   ├── train/   # 训练图（建议 ≥500 张/类，小目标越多越好）</span></span>
<span class="line"><span>│   └── val/     # 验证图（10%~20%）</span></span>
<span class="line"><span>└── labels/</span></span>
<span class="line"><span>    ├── train/</span></span>
<span class="line"><span>    └── val/</span></span></code></pre>
</div><p><code>defect.yaml</code>：</p>
<div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">./defect_dataset</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">train</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">images/train</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">val</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">images/val</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">names</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">scratch</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      # 划痕</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">dent</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">         # 凹陷</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">stain</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # 污渍</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">crack</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # 裂纹</span></span></code></pre>
</div><h3 id="_4-3-开训" tabindex="-1">4.3 开训 <a class="header-anchor" href="#_4-3-开训" aria-label="Permalink to &quot;4.3 开训&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yolo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> detect</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> train</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  model=yolo26n.pt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \ </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">       # 从预训练权重微调（务必不要 from scratch）</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">defect.yaml</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  epochs=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">150</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  imgsz=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">640</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  batch=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">16</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  device=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">                  # 多卡: device=0,1,2,3</span></span></code></pre>
</div><p>训练完成输出在 <code>runs/detect/train/</code>：<code>weights/best.pt</code>（最佳）、<code>results.png</code>（损失曲线）、<code>confusion_matrix.png</code>（混淆矩阵）、<code>val_batch*_pred.jpg</code>（预测可视化）。</p>
<h3 id="_4-4-常用参数速查" tabindex="-1">4.4 常用参数速查 <a class="header-anchor" href="#_4-4-常用参数速查" aria-label="Permalink to &quot;4.4 常用参数速查&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>参数</th>
<th>作用</th>
<th>建议</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>imgsz</code></td>
<td>训练/推理分辨率</td>
<td>缺陷很小就上 1024/1280</td>
</tr>
<tr>
<td><code>epochs</code></td>
<td>轮数</td>
<td>100~300，配合 early stopping 观察</td>
</tr>
<tr>
<td><code>batch</code></td>
<td>批大小</td>
<td>显存不够就减半</td>
</tr>
<tr>
<td><code>cache</code></td>
<td>缓存图片进内存</td>
<td><code>cache=True</code> 小数据集提速明显</td>
</tr>
<tr>
<td><code>patience</code></td>
<td>早停耐心值</td>
<td>默认 100，可调 30~50</td>
</tr>
<tr>
<td><code>cls</code></td>
<td>分类损失权重</td>
<td>类别易混淆时调大</td>
</tr>
<tr>
<td><code>degrees</code> / <code>mosaic</code></td>
<td>数据增强</td>
<td>默认开启，一般别关</td>
</tr>
</tbody>
</table>
<h2 id="五、工业缺陷检测调优经验" tabindex="-1">五、工业缺陷检测调优经验 <a class="header-anchor" href="#五、工业缺陷检测调优经验" aria-label="Permalink to &quot;五、工业缺陷检测调优经验&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_5-1-小目标问题-最常见痛点" tabindex="-1">5.1 小目标问题（最常见痛点） <a class="header-anchor" href="#_5-1-小目标问题-最常见痛点" aria-label="Permalink to &quot;5.1 小目标问题（最常见痛点）&quot;">&ZeroWidthSpace;</a></h3>
<p>缺陷往往只占画面几十个像素，直接训会被大目标&quot;淹没&quot;：</p>
<ul>
<li><strong>提高 <code>imgsz</code></strong>：640 → 1024/1280，最立竿见影</li>
<li><strong>切图训练/推理（SAHI）</strong>：把大图切成带重叠的小块分别推理再合并，<code>pip install sahi</code></li>
<li><strong>尽量贴近拍</strong>：相机分辨率、光学放大、工件对位做足，让缺陷在图里占比大一些</li>
<li>YOLO26 的 RLA-D + STAL 正是为小目标优化的，Nano 模型收益最大</li>
</ul>
<h3 id="_5-2-类别不均衡与难样本" tabindex="-1">5.2 类别不均衡与难样本 <a class="header-anchor" href="#_5-2-类别不均衡与难样本" aria-label="Permalink to &quot;5.2 类别不均衡与难样本&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>NG 样本天然稀少：收集各类型缺陷，宁缺毋滥（错误标注比缺数据更伤）</li>
<li>复用增强：<code>copy_paste</code>、 HSV 扰动、随机遮挡，让模型见过&quot;千奇百怪&quot;的缺陷</li>
<li>良品图也要喂：背景干扰（反光、水印、纹理）让模型学会&quot;什么都不是缺陷&quot;</li>
</ul>
<h3 id="_5-3-现场环境的三大坑" tabindex="-1">5.3 现场环境的三大坑 <a class="header-anchor" href="#_5-3-现场环境的三大坑" aria-label="Permalink to &quot;5.3 现场环境的三大坑&quot;">&ZeroWidthSpace;</a></h3>
<table tabindex="0">
<thead>
<tr>
<th>坑</th>
<th>对策</th>
</tr>
</thead>
<tbody>
<tr>
<td>光照变化</td>
<td>光源罩起来（固定光源），比什么增强都有效</td>
</tr>
<tr>
<td>反光/过曝</td>
<td>偏振镜 + 低角度光源</td>
</tr>
<tr>
<td>位姿变化</td>
<td>工装定位，或标注时覆盖多角度样本</td>
</tr>
</tbody>
</table>
<h2 id="六、产线部署-从-pt-到-plc" tabindex="-1">六、产线部署：从 pt 到 plc <a class="header-anchor" href="#六、产线部署-从-pt-到-plc" aria-label="Permalink to &quot;六、产线部署：从 pt 到 plc&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_6-1-导出与加速" tabindex="-1">6.1 导出与加速 <a class="header-anchor" href="#_6-1-导出与加速" aria-label="Permalink to &quot;6.1 导出与加速&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yolo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> export</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> model=best.pt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> format=onnx</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">          # 通用交换格式</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yolo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> export</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> model=best.pt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> format=engine</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # NVIDIA TensorRT（极限加速）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">yolo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> export</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> model=best.pt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> format=openvino</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      # Intel CPU / 核显</span></span></code></pre>
</div><table tabindex="0">
<thead>
<tr>
<th>平台</th>
<th>推荐方案</th>
<th>典型延迟</th>
</tr>
</thead>
<tbody>
<tr>
<td>NVIDIA 独显 / Jetson</td>
<td>TensorRT FP16 / INT8</td>
<td>1~5ms</td>
</tr>
<tr>
<td>工控机 Intel CPU</td>
<td>OpenVINO INT8</td>
<td>10~30ms</td>
</tr>
<tr>
<td>ARM 边缘盒（RK3588 等）</td>
<td>RKNN / TFLite INT8</td>
<td>视芯片而定</td>
</tr>
</tbody>
</table>
<p>YOLO26 移除 DFL、NMS-Free 之后，<strong>全 INT8 量化链路终于完整</strong>——这正是它对工业部署最大的意义。</p>
<h3 id="_6-2-与产线联动" tabindex="-1">6.2 与产线联动 <a class="header-anchor" href="#_6-2-与产线联动" aria-label="Permalink to &quot;6.2 与产线联动&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> cv2, requests</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ultralytics </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> YOLO</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">model </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> YOLO(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"best.engine"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># TensorRT 引擎</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">cap </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> cv2.VideoCapture(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># GigE/USB 工业相机</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">while</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> True</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ok, frame </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> cap.read()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ok:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        break</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    r </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> model(frame, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">verbose</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">False</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ng </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> r.boxes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b.conf </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0.6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ng:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # 1) 保存 NG 图与记录  2) 触发 PLC 剔除/声光报警</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        requests.post(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://plc-gateway/api/kick"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">json</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"count"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">len</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(ng)})</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cv2.imshow(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"inspector"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, r.plot())</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> cv2.waitKey(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 27</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        break</span></span></code></pre>
</div><p>架构上建议：<strong>推理服务独立成进程/容器</strong>，通过 HTTP / MQTT 与 PLC 网关通信——视觉系统崩了不拖累产线，升级模型也不用动产线程序。</p>
<h2 id="七、总结" tabindex="-1">七、总结 <a class="header-anchor" href="#七、总结" aria-label="Permalink to &quot;七、总结&quot;">&ZeroWidthSpace;</a></h2>
<table tabindex="0">
<thead>
<tr>
<th>你要做的</th>
<th>YOLO26 给你的</th>
</tr>
</thead>
<tbody>
<tr>
<td>快速出 demo</td>
<td><code>pip install ultralytics</code> 十行代码</td>
</tr>
<tr>
<td>自有数据检测</td>
<td>标注 500+ 张 → 一条命令微调</td>
</tr>
<tr>
<td>小缺陷检出</td>
<td>imgsz↑ / SAHI 切图 / RLA-D + STAL 加持</td>
</tr>
<tr>
<td>产线部署</td>
<td>NMS-Free + 无 DFL → 全 INT8 边缘推理</td>
</tr>
<tr>
<td>低成本训练</td>
<td>8× 消费级 RTX 4050 即可 DDP</td>
</tr>
</tbody>
</table>
<p>YOLO 系列能把目标检测做到&quot;开箱即用&quot;，靠的是持续十代的工程化打磨。YOLO26 把部署侧的两大历史包袱（NMS、DFL）卸掉了——<strong>对实验室是锦上添花，对产线是雪中送炭</strong>。</p>
<blockquote>
<p>本文环境：ultralytics ≥ 8.3 · YOLO26 权重发布于 2025.09 · 示例命令均可直接运行</p>
</blockquote>
]]></content:encoded>
            <author>tom@chenpan.com.cn (Tom Chen)</author>
        </item>
    </channel>
</rss>