<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://ujava.cn/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <atom:link href="https://ujava.cn/rss.xml" rel="self" type="application/rss+xml"/>
    <title>UJava</title>
    <link>https://ujava.cn/</link>
    <description> 【Java学习 + Java面试】首选UJava！  </description>
    <language>zh-CN</language>
    <pubDate>Wed, 25 Feb 2026 07:11:10 GMT</pubDate>
    <lastBuildDate>Wed, 25 Feb 2026 07:11:10 GMT</lastBuildDate>
    <generator>@vuepress/plugin-feed</generator>
    <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
    <category>设计模型</category>
    <category>设计Python</category>
    <category>Python</category>
    <category>设计组件</category>
    <category>设计高频</category>
    <item>
      <title>Spring AI Alibaba</title>
      <link>https://ujava.cn/model/springaialibaba.html</link>
      <guid>https://ujava.cn/model/springaialibaba.html</guid>
      <source url="https://ujava.cn/rss.xml">Spring AI Alibaba</source>
      <description>Spring AI Alibaba</description>
      <category>设计模型</category>
      <pubDate>Wed, 25 Feb 2026 07:07:05 GMT</pubDate>
      <content:encoded><![CDATA[<blockquote>
<p>Spring AI Alibaba</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>LLaMA-Factory</title>
      <link>https://ujava.cn/model/llamafactory.html</link>
      <guid>https://ujava.cn/model/llamafactory.html</guid>
      <source url="https://ujava.cn/rss.xml">LLaMA-Factory</source>
      <description>LLaMA-Factory 是一个基于 Hugging Face 和 DeepSeek 模型的开源工具，主要用于大模型微调、推理及可视化操作。以下是其核心用法： 环境准备 ‌安装 Anaconda ‌：创建Python环境（推荐Python 3.11），激活环境后安装依赖（如torch、metrics等）。 ‌下载模型‌：通过pip install m...</description>
      <category>设计模型</category>
      <pubDate>Wed, 09 Jul 2025 10:13:54 GMT</pubDate>
      <content:encoded><![CDATA[<p>LLaMA-Factory&nbsp;是一个基于&nbsp;Hugging Face&nbsp;和&nbsp;DeepSeek&nbsp;模型的开源工具，主要用于大模型微调、推理及可视化操作。以下是其核心用法：</p>
<h3>环境准备</h3>
<ol>
<li>‌<strong>安装&nbsp;Anaconda</strong>&nbsp;‌：创建Python环境（推荐Python 3.11），激活环境后安装依赖（如<code>torch</code>、<code>metrics</code>等）。</li>
<li>‌<strong>下载模型</strong>‌：通过<code>pip install modelscope download --model Qwen/Qwen2.5-VL-7B-Instruct --local_dir /data2/users/yszhang/quickllm/qwen2.5-vl-instruct</code>命令下载模型参数。</li>
</ol>
<h3>启动图形界面</h3>
<p>运行<code>llamafactory-cli webui</code>启动Web界面（访问<code>http://127.0.0.1:7860</code>），通过以下步骤操作：</p>
<ol>
<li>‌<strong>选择语言</strong>‌：默认支持中文（zh）。</li>
<li>‌<strong>模型选择</strong>‌：从Hugging Face或本地路径加载模型（如Qwen2.5-VL-7B-Instruct）。</li>
<li>‌<strong>参数配置</strong>‌：支持微调、推理参数设置，支持多卡训练（需提前安装&nbsp;DeepSpeed&nbsp;）。</li>
</ol>
<h3>微调流程</h3>
<ol>
<li>‌<strong>数据准备</strong>‌：需自行准备训练数据（文本/代码补全模板）。</li>
<li>‌<strong>训练启动</strong>‌：通过Web界面选择训练方法（如全量调参、&nbsp;LoRA&nbsp;等），指定GPU数量及输出路径。</li>
<li>‌<strong>结果验证</strong>‌：根据日志文件选择最优checkpoint进行推理测试。</li>
</ol>
<h3>注意事项</h3>
<ul>
<li>需确保服务器支持GPU加速，安装驱动及CUDA环境。 ‌</li>
<li>不同版本可能存在功能差异，建议参考官方GitHub更新日志。 ‌</li>
</ul>
<p>Llama-Factory&nbsp;内置的MMLU、&nbsp;CMMLU&nbsp;和&nbsp;CEVAL&nbsp;是针对大模型在不同场景下的评估工具，主要区别如下：</p>
<h3>MMLU（多领域语言理解）</h3>
<p>用于评估模型在多个学科领域的理解能力，包含数学、艺术、法律等67个主题的测试题，通过多项选择题形式考察模型对学科知识的掌握程度。</p>
<h3>CMMLU（中文多选多学科理解）</h3>
<p>专为中文设计，涵盖艺术、商业、文化等67个主题，侧重评估模型对中国文化、语言及跨学科推理能力的适应性。其题目设计更贴近中文语境，答案需针对中国背景。</p>
<h3>CEVAL（&nbsp;C-Eval&nbsp;）</h3>
<p>包含52个学科13948道题，通过不同难度等级（初级、中级、高级）评估模型在代码生成、数学推理等领域的专项能力。题型为填空题，需模型生成代码或数学解题步骤。</p>
<p>‌<strong>适用场景对比</strong>‌</p>
<ul>
<li>‌<strong>MMLU</strong>‌：适合评估模型在多领域知识理解的泛化能力，类似&nbsp;SQUAD&nbsp;等通用语言理解测试。</li>
<li>‌<strong>CMMLU</strong>‌：侧重中文语境下的跨学科推理与知识应用，适合评估模型对中国文化、法律的适配性。</li>
<li>‌<strong>CEVAL</strong>‌：聚焦代码生成、数学推理等专项能力，通过填空题形式直接考察模型的编程与逻辑推导能力。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Python模型蒸馏</title>
      <link>https://ujava.cn/python/distill.html</link>
      <guid>https://ujava.cn/python/distill.html</guid>
      <source url="https://ujava.cn/rss.xml">Python模型蒸馏</source>
      <description>蒸馏（Distillation）是一种在机器学习和深度学习中广泛应用的技术，特别是在模型压缩和知识迁移方面。蒸馏的目的是创建一个较小的、计算效率更高的模型，同时尽可能保持原始大模型的性能。这种方法通常用于将一个复杂的模型（如一个大模型或预训练模型）的知识转移到一个小模型上，而小模型通常更容易部署和运行在资源受限的环境中。 蒸馏的基本原理 蒸馏的基本思想...</description>
      <category>设计Python</category>
      <pubDate>Wed, 25 Jun 2025 10:58:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>蒸馏（Distillation）是一种在机器学习和深度学习中广泛应用的技术，特别是在模型压缩和知识迁移方面。蒸馏的目的是创建一个较小的、计算效率更高的模型，同时尽可能保持原始大模型的性能。这种方法通常用于将一个复杂的模型（如一个大模型或预训练模型）的知识转移到一个小模型上，而小模型通常更容易部署和运行在资源受限的环境中。</p>
<p>蒸馏的基本原理</p>
<p>蒸馏的基本思想是通过最小化一个教师模型（通常是原始大模型）和学生模型（较小或较简单模型）之间的差异来训练学生模型。这种差异通常是通过某种形式的损失函数来衡量的，例如最常见的有温度缩放（Temperature Scaling）方法。</p>
<p>温度缩放<br>
温度缩放是蒸馏中最常用的方法之一。在这种方法中，教师模型的输出通过一个温度参数 $T$ 进行缩放，然后使用softmax函数的输出作为目标分布。学生模型的输出也使用相同的温度进行缩放，然后通过交叉熵损失函数与教师模型的输出进行比较。</p>
<p>数学表达式如下：</p>
<p>$$ P_{teacher}(y|x) = \frac{e^{logits_y / T}}{\sum_i e^{logits_i / T}} $$</p>
<p>其中 $logits$ 是教师模型的原始输出（通常是未经softmax处理的），$T$ 是温度参数，$y$ 是真实标签。</p>
<p>实现蒸馏的步骤<br>
选择教师模型和学生模型：教师模型通常是预先训练好的复杂模型，而学生模型则是需要训练的较小模型。</p>
<p>训练教师模型：首先确保教师模型已经充分训练并达到预期的性能。</p>
<p>定义损失函数：使用交叉熵损失函数，并结合温度缩放策略。</p>
<p>训练学生模型：使用教师模型的输出作为目标，通过最小化损失函数来训练学生模型。</p>
<p>示例代码（使用PyTorch）<br>
以下是一个简单的示例，展示如何使用PyTorch进行蒸馏：</p>
<p>import torch<br>
import torch.nn as nn<br>
import torch.nn.functional as F</p>
<h1>假设 teacher_model 和 student_model 已经定义并初始化</h1>
<p>teacher_model = ...  # 已经训练好的大模型<br>
student_model = ...  # 小模型，结构简单，参数少</p>
<h1>损失函数定义，使用交叉熵损失和温度缩放</h1>
<p>def distillation_loss(outputs, labels, T):<br>
outputs = F.log_softmax(outputs/T, dim=1)<br>
labels = F.softmax(labels/T, dim=1)<br>
return F.kl_div(outputs, labels, reduction='batchmean') * (T * T)</p>
<h1>假设 data_loader 是已经定义好的数据加载器</h1>
<p>for data, target in data_loader:<br>
teacher_output = teacher_model(data)<br>
student_output = student_model(data)<br>
loss = distillation_loss(student_output, teacher_output, T=2.0)  # T=2.0 是温度参数的一个例子<br>
loss.backward()<br>
optimizer.step()  # 确保有一个优化器在运行中</p>
<p>注意事项</p>
<p>选择合适的温度参数 $T$ 对蒸馏的效果有显著影响。通常需要一些实验来确定最佳的温度值。</p>
<p>在实际应用中，可能还需要考虑其他因素，如数据增强、正则化等，以进一步提高蒸馏的效果。</p>
<p>确保教师模型和学生模型的输入输出维度匹配。</p>
<p>通过以上步骤和示例代码，你可以开始在自己的项目中应用蒸馏技术来优化和简化深度学习模型。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python怎么开发大模型程序</title>
      <link>https://ujava.cn/model/model.html</link>
      <guid>https://ujava.cn/model/model.html</guid>
      <source url="https://ujava.cn/rss.xml">Python怎么开发大模型程序</source>
      <description>在Python中开发一个大模型程序通常涉及以下几个步骤： 1. 选择合适的库 对于机器学习或深度学习项目，常用的库有： TensorFlow 和 Keras：由Google开发，非常适合构建深度学习模型。 PyTorch：由Facebook开发，提供了灵活的张量操作和自动求导功能。 Scikit-learn：适合传统的机器学习任务。 2. 数据准备 数...</description>
      <category>设计模型</category>
      <pubDate>Tue, 10 Jun 2025 07:27:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>在Python中开发一个大模型程序通常涉及以下几个步骤：</p>
<h3>1. 选择合适的库</h3>
<p>对于机器学习或深度学习项目，常用的库有：</p>
<ul>
<li>
<p><strong>TensorFlow</strong>&nbsp;和&nbsp;<strong>Keras</strong>：由Google开发，非常适合构建深度学习模型。</p>
</li>
<li>
<p><strong>PyTorch</strong>：由Facebook开发，提供了灵活的张量操作和自动求导功能。</p>
</li>
<li>
<p><strong>Scikit-learn</strong>：适合传统的机器学习任务。</p>
</li>
</ul>
<h3>2. 数据准备</h3>
<ul>
<li>
<p><strong>数据收集</strong>：收集或获取你的数据集。</p>
</li>
<li>
<p><strong>数据清洗</strong>：处理缺失值、异常值等。</p>
</li>
<li>
<p><strong>数据预处理</strong>：如归一化、标准化、编码等。</p>
</li>
<li>
<p><strong>数据分割</strong>：通常分为训练集、验证集和测试集。</p>
</li>
</ul>
<h3>3. 模型设计与实现</h3>
<p>根据任务选择合适的模型架构。例如，对于图像分类可以使用卷积神经网络（CNN），对于序列数据可以使用循环神经网络（RNN）或长短期记忆网络（LSTM）。</p>
<h4>示例：使用TensorFlow和Keras构建一个简单的CNN模型</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tensorflow </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tf</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tensorflow.keras </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> layers, models</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建模型</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> models.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Sequential</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Conv2D</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">32</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, (</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">), </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">activation</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'relu'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">input_shape</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)))</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">MaxPooling2D</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">((</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)))</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Conv2D</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, (</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">), </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">activation</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'relu'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">MaxPooling2D</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">((</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)))</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Conv2D</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, (</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">), </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">activation</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'relu'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Flatten</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">())</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Dense</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">activation</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'relu'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(layers.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Dense</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">activation</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'softmax'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 假设是10类分类问题</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 编译模型</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">compile</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">optimizer</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'adam'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">loss</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'sparse_categorical_crossentropy'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">metrics</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'accuracy'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>4. 训练模型</h3>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 假设 X_train 和 y_train 是你的训练数据和标签</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(X_train, y_train, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">epochs</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">validation_split</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>5. 模型评估与调优</h3>
<ul>
<li>
<p><strong>评估</strong>：使用测试集评估模型性能。</p>
</li>
<li>
<p><strong>调优</strong>：根据性能反馈调整模型结构或参数。</p>
</li>
<li>
<p><strong>超参数调优</strong>：使用如Grid Search、Random Search或Bayesian Optimization等技术来优化超参数。</p>
</li>
</ul>
<h3>6. 模型部署与使用</h3>
<ul>
<li>
<p><strong>保存模型</strong>：使用<code>model.save()</code>保存模型。</p>
</li>
<li>
<p><strong>加载模型</strong>：在其他应用中加载模型进行预测。</p>
</li>
<li>
<p><strong>部署</strong>：将模型部署到生产环境，例如使用Flask或FastAPI创建API服务。</p>
</li>
</ul>
<h4>示例：使用Flask部署模型</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> flask </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Flask, request, jsonify</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tensorflow </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tf</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">app </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> Flask</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__name__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tf.keras.models.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">load_model</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'path_to_your_model'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 加载模型</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">@app</span><span style="--shiki-light:#4078F2;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">route</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'/predict'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> methods</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'POST'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> predict</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  data </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> request.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get_json</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">force</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">True</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 获取JSON格式的数据</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  preds </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">predict</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(data[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'input'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 进行预测</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> jsonify</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">({</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'prediction'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: preds.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">tolist</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()})  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 返回预测结果</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '__main__'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  app.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">debug</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">True</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>通过以上步骤，你可以在Python中开发一个复杂的大规模机器学习或深度学习模型程序。每个步骤都可能需要根据具体任务和数据进行相应的调整和优化。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python基础知识2</title>
      <link>https://ujava.cn/python/base3.html</link>
      <guid>https://ujava.cn/python/base3.html</guid>
      <source url="https://ujava.cn/rss.xml">Python基础知识2</source>
      <description>img_16.pngimg_16.png ✅基本数据类型全家福： int → 整数（42） bool → 布尔值（True/False） float → 浮点数（3.14） str → 字符串（&amp;quot;Hello&amp;quot;） list → 可变序列（[1,2]） tuple → 不可变序列（(1,2)） set → 无序不重复集合 dict → 键值对字典 comp...</description>
      <category>设计Python</category>
      <pubDate>Thu, 29 May 2025 11:48:50 GMT</pubDate>
      <content:encoded><![CDATA[<figure><figcaption>img_16.png</figcaption></figure>
<ul>
<li>✅基本数据类型全家福：</li>
<li>int → 整数（42）</li>
<li>bool → 布尔值（True/False）</li>
<li>float → 浮点数（3.14）</li>
<li>str → 字符串（"Hello"）</li>
<li>list → 可变序列（[1,2]）</li>
<li>tuple → 不可变序列（(1,2)）</li>
<li>set → 无序不重复集合</li>
<li>dict → 键值对字典</li>
<li>complex → 复数（1+2j）</li>
<li>👉特殊成员：函数/模块/类型本身也是对象！</li>
<li>🔢不可不知的常量</li>
<li>✔️数学三杰：</li>
<li>math.pi → 圆周率π</li>
<li>math.e → 自然对数e</li>
<li>math.inf → 无穷大∞</li>
<li>✔️布尔判官：</li>
<li>True → 真值开关</li>
<li>False → 假值开关</li>
<li>✔️空值代表：</li>
<li>None → 表示空（类似null）</li>
<li>💡Tips：记得先import math才能调用哦！</li>
<li>⚙️运算符冷知识</li>
<li>🔀赋值技巧：</li>
<li>a += 1 等价于 a = a + 1</li>
<li>（右边算完赋值给左边！）</li>
<li>🧮算术运算符：</li>
<li>// → 地板除（5//2=2）</li>
<li>@ → 矩阵乘法（numpy常用）</li>
<li>** → 幂运算（2**3=8）</li>
<li>% → 取余（-2%3=1）</li>
<li>💥隐藏知识点：fmod vs %</li>
<li>math.fmod(-2,3) → -2</li>
<li>-2%3 → 1</li>
<li>👉区别：负数取余时方向不同！</li>
<li>➖fmod向零取整，%向下取整</li>
<li>📝学习贴士：</li>
<li>1️⃣ type()函数可查变量类型</li>
<li>2️⃣ 浮点数比较用math.isclose()</li>
<li>3️⃣ 变量命名避开关键字</li>
<li>4️⃣ 逻辑运算符优先级：not&gt;and&gt;or</li>
<li>🎯新手常见误区：</li>
<li>× 用is比较数值（应用==）</li>
<li>× 把1.0当作整数判断</li>
<li>× 忘记导入math直接调pi</li>
<li></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Python文件操作</title>
      <link>https://ujava.cn/python/file.html</link>
      <guid>https://ujava.cn/python/file.html</guid>
      <source url="https://ujava.cn/rss.xml">Python文件操作</source>
      <description>1 文件操作 1.1 文件打开与关闭 1.1.1 打开文件-open 在上述示例中： &amp;apos;example.txt&amp;apos; 是文件的路径和名称，你可以根据实际情况修改为你想要打开的文件。 &amp;apos;r&amp;apos; 表示只读模式。如果你想要写入文件，可以使用 &amp;apos;w&amp;apos; 模式，如果想要追加内容，可以使用 &amp;apos;a&amp;apos; 模式等。 with open(...) as file : 是使用上下文管...</description>
      <category>设计Python</category>
      <pubDate>Thu, 22 May 2025 10:46:34 GMT</pubDate>
      <content:encoded><![CDATA[<h2>1 文件操作</h2>
<h3>1.1 文件打开与关闭</h3>
<h4>1.1.1 打开文件-open</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 打开文件（默认为只读模式）</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">file_path </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'example.txt'</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">with</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> open</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(file_path, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'r'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">  # 执行文件操作，例如读取文件内容</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  file_content </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">read</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">  print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(file_content)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 文件在with块结束后会自动关闭，无需显式关闭文件</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在上述示例中：</p>
<ul>
<li>'example.txt' 是文件的路径和名称，你可以根据实际情况修改为你想要打开的文件。</li>
<li>'r' 表示只读模式。如果你想要写入文件，可以使用 'w' 模式，如果想要追加内容，可以使用 'a' 模式等。</li>
<li>with open(...) as file : 是使用上下文管理器的方式，确保文件在使用后被正确关闭，即使在处理文件时发生异常也能保证关闭。</li>
</ul>
<h4>1.1.2 访问模式及说明</h4>
<p>|              |                                                                                   |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python类型转换</title>
      <link>https://ujava.cn/python/changetype.html</link>
      <guid>https://ujava.cn/python/changetype.html</guid>
      <source url="https://ujava.cn/rss.xml">Python类型转换</source>
      <description>在Python中，对象类型转换可以通过多种方法实现，包括使用内置函数、类型构造函数、显式类型转换等。其中，使用内置函数是最常见的方法，例如可以使用int()、float()、str()等函数进行基本的数据类型转换。此外，对于自定义对象，可以通过实现特殊方法（如__int__()、__float__()、__str__()等）来自定义转换行为。以下将详细...</description>
      <category>设计Python</category>
      <pubDate>Wed, 21 May 2025 11:39:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>在Python中，对象类型转换可以通过多种方法实现，包括<strong>使用内置函数、类型构造函数、显式类型转换</strong>等。其中，使用内置函数是最常见的方法，例如可以使用<code>int()</code>、<code>float()</code>、<code>str()</code>等函数进行基本的数据类型转换。此外，对于自定义对象，可以通过实现特殊方法（如<code>__int__()</code>、<code>__float__()</code>、<code>__str__()</code>等）来自定义转换行为。以下将详细介绍Python中几种常见的对象类型转换方法。</p>
<p>一、使用内置函数进行类型转换</p>
<p>Python提供了一系列的内置函数用于实现基本数据类型之间的转换。这些函数包括<code>int()</code>、<code>float()</code>、<code>str()</code>、<code>list()</code>、<code>tuple()</code>、<code>set()</code>等。</p>
<ol>
<li><code>int()</code></li>
</ol>
<p><code>int()</code>函数用于将其他数据类型转换为整数类型。它可以将浮点数、字符串（如果字符串内容为有效的整数表示）转换为整数。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3.14</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：3</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"42"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：42</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>需要注意的是，如果字符串不能被解释为一个有效的整数，将会抛出<code>ValueError</code>。</p>
<ol start="2">
<li><code>float()</code></li>
</ol>
<p><code>float()</code>函数用于将其他数据类型转换为浮点数类型。它可以将整数、字符串（如果字符串内容为有效的浮点数表示）转换为浮点数。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">float</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：3.0</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">float</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"3.14"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)) </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：3.14</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>同样，如果字符串不能被解释为有效的浮点数，将会抛出<code>ValueError</code>。</p>
<ol start="3">
<li><code>str()</code></li>
</ol>
<p><code>str()</code>函数用于将对象转换为字符串表示。几乎所有对象都可以被转换为字符串，特别是那些实现了<code>__str__()</code>或<code>__repr__()</code>方法的对象。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">123</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出："123"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3.14</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))     </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出："3.14"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]))</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出："[1, 2, 3]"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>详细描述</strong>：<code>str()</code>函数非常灵活，因为它不仅能将数值类型转换为字符串，还能将列表、元组、字典等数据结构转换为字符串。此外，自定义类对象也可以通过实现<code>__str__()</code>方法来定义自己的字符串表示。当调用<code>str()</code>函数时，Python会自动调用对象的<code>__str__()</code>方法，从而返回自定义的字符串表示。这在调试和输出信息时非常有用，可以让程序的输出更加直观和易于理解。</p>
<p>二、使用类型构造函数进行转换</p>
<p>Python中，类型本身也是构造函数，可以用于创建该类型的新实例。这种方法适用于<code>list()</code>、<code>tuple()</code>、<code>set()</code>等数据结构的转换。</p>
<ol>
<li><code>list()</code></li>
</ol>
<p><code>list()</code>函数用于将可迭代对象（如字符串、元组、集合等）转换为列表。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">list</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：['a', 'b', 'c']</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">list</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">((</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)))  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：[1, 2, 3]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li><code>tuple()</code></li>
</ol>
<p><code>tuple()</code>函数用于将可迭代对象转换为元组。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">tuple</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：('a', 'b', 'c')</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">tuple</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]))  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：(1, 2, 3)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3">
<li><code>set()</code></li>
</ol>
<p><code>set()</code>函数用于将可迭代对象转换为集合。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">set</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：{'a', 'b', 'c'}</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">set</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])) </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：{1, 2, 3}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>三、显式类型转换与自定义对象的转换</p>
<p>在Python中，显式类型转换指的是通过用户定义的方法实现对象的自定义转换行为。对于自定义对象，可以通过实现一些特殊方法来支持类型转换。</p>
<ol>
<li>实现<code>__int__()</code>,&nbsp;<code>__float__()</code>,&nbsp;<code>__str__()</code></li>
</ol>
<p>在自定义类中，可以实现<code>__int__()</code>、<code>__float__()</code>和<code>__str__()</code>方法，来支持将对象转换为整数、浮点数和字符串。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> MyNumber</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.value </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __int__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.value)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __float__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> float</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.value)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __str__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.value)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> MyNumber</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(num))   </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：5</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">float</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(num)) </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：5.5</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(num))   </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出："5.5"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li>使用自定义方法进行复杂转换</li>
</ol>
<p>有时，转换规则可能比较复杂，不适合用内置的方法。这时，可以定义专门的方法来实现特定的转换逻辑。例如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.data </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> data</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> to_dict</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">        # 自定义逻辑将数据转换为字典</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(i): item </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i, item </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> enumerate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.data)}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">data </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> Data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(data.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">to_dict</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">())  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：{'0': 10, '1': 20, '2': 30}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>四、注意事项与最佳实践</p>
<p>在进行类型转换时，需要注意以下几点：</p>
<ol>
<li>
<p><strong>数据丢失风险</strong>：在某些情况下，类型转换可能导致数据丢失。例如，将浮点数转换为整数时，小数部分将会丢失。</p>
</li>
<li>
<p><strong>异常处理</strong>：在进行类型转换时，可能会遇到转换失败的情况（如字符串无法转换为整数）。应提前做好异常处理，如使用<code>try-except</code>结构来捕获转换异常。</p>
</li>
<li>
<p><strong>明确转换目的</strong>：在进行类型转换前，明确转换的目的和需求，选择合适的转换方法。</p>
</li>
<li>
<p><strong>自定义类型转换</strong>：对于复杂的数据结构和自定义对象，尽可能实现明确的转换方法，确保转换的可读性和可维护性。</p>
</li>
</ol>
<p>通过合理使用Python中的类型转换机制，可以在程序中灵活地处理不同的数据类型和结构，提高代码的兼容性和可扩展性。</p>
<h2><strong>相关问答FAQs：</strong></h2>
<p><strong>如何在Python中将字符串转换为整数？</strong><br>
在Python中，可以使用内置的<code>int()</code>函数将字符串转换为整数。只需将字符串作为参数传递给<code>int()</code>函数即可。例如，<code>num = int("123")</code>将字符串"123"转换为整数123。请注意，确保字符串内容是有效的数字，否则将引发<code>ValueError</code>异常。</p>
<p><strong>Python中是否支持自定义对象的类型转换？</strong><br>
是的，Python支持自定义对象的类型转换。可以通过定义<code>__str__()</code>和<code>__repr__()</code>方法来实现对象与字符串之间的转换。此外，重载<code>__int__()</code>、<code>__float__()</code>等特殊方法可以实现对象与其他基本数据类型的转换。例如，定义一个类并在其中实现这些方法，就可以自定义对象的表示和转换逻辑。</p>
<p><strong>在Python中如何处理类型转换时的异常？</strong><br>
在进行类型转换时，特别是在将字符串转换为数字时，可能会遇到异常。可以使用<code>try</code>和<code>except</code>语句来捕获这些异常。例如，在尝试将用户输入的字符串转换为整数时，可以使用以下代码：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(user_input)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ValueError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"输入的不是一个有效的整数"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这种方式可以确保程序在遇到错误时不会崩溃，并能够给用户提供友好的提示。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python eval函数</title>
      <link>https://ujava.cn/python/eval.html</link>
      <guid>https://ujava.cn/python/eval.html</guid>
      <source url="https://ujava.cn/rss.xml">Python eval函数</source>
      <description>eval() 是 Python 内置的一个函数，它可以将字符串当作[有效的] Python 表达式进行求值并返回结果。它的作用是将字符串转换为相应的数据类型、执行计算和执行任意有效的 Python 代码。 然而，使用 eval() 函数需要谨慎，因为它可以执行任意的代码，可能导致安全风险和不受控制的行为。 1. eval() 函数的语法 eval() ...</description>
      <category>设计Python</category>
      <pubDate>Wed, 21 May 2025 11:39:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>eval() 是 Python 内置的一个函数，它可以将字符串当作[有效的]&nbsp;Python 表达式进行求值并返回结果。它的作用是将字符串转换为相应的数据类型、执行计算和执行任意有效的 Python 代码。</p>
<p>然而，使用 eval() 函数需要谨慎，因为它可以执行任意的代码，可能导致安全风险和不受控制的行为。</p>
<h2>1. eval() 函数的语法</h2>
<p>eval() 函数的语法如下：</p>
<p>eval(expression, globals=None, locals=None)</p>
<p>参数：</p>
<p>expression 是一个字符串，表示要求值的表达式或代码。</p>
<p>globals 是一个可选的全局命名空间字典。</p>
<p>locals 是一个可选的局部命名空间字典。</p>
<p>下面一些示例代码，展示了 eval() 函数的使用方法和功能。</p>
<h3>1.1 默认参数使用</h3>
<h4>1.1.1 求值表达式</h4>
<div class="language-php line-numbers-mode" data-highlighter="shiki" data-ext="php" data-title="php" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#ABB2BF">result</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> eval</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"2 + 3"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#ABB2BF">result</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：5</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>上述示例中，将字符串 "2 + 3" 作为表达式传递给 eval() 函数，它会求值这个表达式并返回结果。</p>
<h4>1.1.2&nbsp;[字符串转换]为数据类型</h4>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">num = eval(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"42"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(type(num))  # 输出： &lt;</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'int'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">string</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = eval(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"'Hello, World!'"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(type(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">string</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))  # 输出： &lt;</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'str'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>上述示例中，使用 eval() 将字符串转换为对应的数据类型，例如将字符串 "42" 转换为整数，将字符串 "'Hello, World!'" 转换为字符串。</p>
<h4>1.1.3 执行代码块</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">code </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '''</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">if x &gt; 5:</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    print("x is greater than 5")</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">else:</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    print("x is not greater than 5")</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'''</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 8</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">eval</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(code)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>上述示例中，将代码块作为字符串传递给 eval() 函数，然后在给定的上下文中执行这段代码。根据变量 x 的值，会打印不同的结果。</p>
<h3>1.2&nbsp; 默认参数globals 和 locals 的使用</h3>
<p>eval() 函数中的 globals 和 locals 参数用于指定代码执行时的全局和局部命名空间。这些参数允许你在 eval() 中使用特定的变量和函数。</p>
<h4>1.2.1 使用全局命名空间</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 5</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> eval</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"x + 2"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">globals</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">())</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(result)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：7</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>上述示例中，我们使用 globals() 函数将当前的全局命名空间传递给 eval()。这样，eval() 中的代码可以访问全局变量 x。</p>
<h4>1.2.2 使用局部命名空间</h4>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">def </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a, b):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a + b</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">locals_dict = {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: 3}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">result = eval(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"add(a, b)"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, globals(), locals_dict)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(result)  # 输出：</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在这个例子中，我们使用 locals_dict 字典作为局部命名空间传递给 eval()。这样，eval() 中的代码可以访问局部变量 a 和 b，以及 add() 函数。</p>
<h4>1.2.3 修改局部命名空间</h4>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">x = </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">locals_dict = {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'x'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: 5}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">eval(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"x = x + 1"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, globals(), locals_dict)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(locals_dict[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'x'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])  # 输出：</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">6</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>示例中，我们将 locals_dict 字典作为局部命名空间传递给 eval()。eval() 中的代码将修改局部变量 x 的值。通过在 eval() 之后检查 locals_dict['x']，我们可以看到变量 x 的值已经被修改为 6。</p>
<h3>1.3 使用总结</h3>
<p>需要注意的是，eval() 函数默认情况下使用调用 eval() 的上下文的命名空间。如果未提供 globals 和 locals 参数，eval() 将使用默认的命名空间。</p>
<p>使用 globals 和 locals 参数时，应该谨慎选择要传递的命名空间，并确保代码中可以访问所需的变量和函数。同时，需要注意在 eval() 中执行的代码对命名空间的修改是否会影响到后续代码的行为。</p>
<p>eval() 函数可以执行任意有效的 Python 代码，包括函数调用、循环和文件操作等。因此，在使用 eval() 函数时，应该确保字符串是可信的，并避免执行不安全的代码。</p>
<h2>2. 异常处理</h2>
<p>如果在 eval() 中的表达式或代码中存在语法错误或运行时错误，eval() 将引发相应的异常。因此，在使用 eval() 时，应该使用适当的异常处理机制来捕获和处理可能出现的异常。</p>
<h2>3. eval() 的替代方法</h2>
<p>在某些情况下，可以考虑使用更安全和受控制的替代方法来执行特定的任务。例如，如果需要执行简单的数学运算，可以使用 eval() 的更安全的替代方法 ast.literal_eval()。如果需要执行特定的函数调用，可以使用 getattr() 函数来获取对象的属性或方法，并进行调用。</p>
<h2>4. 开发时注意事项</h2>
<p>在实际编程中，应该谨慎使用 eval() 函数，并评估是否有其他更安全和可控制的替代方法可用。如果必须使用 eval()，则应该遵循以下最佳实践：</p>
<p>a.验证和过滤输入：确保将不受信任的输入数据进行验证和过滤，以防止注入恶意代码。</p>
<p>b.限制执行环境：限制 eval() 的执行环境，仅允许访问必要的变量和函数。</p>
<p>c.使用异常处理：使用适当的异常处理机制来捕获和处理可能的异常情况。</p>
<p>d.文档和注释：在代码中提供清晰的文档和注释，以说明为什么需要使用 eval()，并确保其他开发人员了解代码的含义和潜在的风险。</p>
<ol start="5">
<li>总结</li>
</ol>
<p>eval() 函数可以将字符串作为 Python&nbsp;[表达式求值]，将字符串转换为数据类型，执行代码块等。它在某些情况下可以方便地处理动态代码和计算，但需要谨慎使用以避免安全风险。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python异常</title>
      <link>https://ujava.cn/python/except.html</link>
      <guid>https://ujava.cn/python/except.html</guid>
      <source url="https://ujava.cn/rss.xml">Python异常</source>
      <description>内置异常，指预定义的[异常类]，当程序运行时遇到错误情况，就会抛出相应的异常。这些异常类构成了一个层次结构，BaseException 是所有[异常的]基类。 1. 顶级异常类 BaseException：所有异常的基类。通常不直接捕获这个异常，因为它会捕获像 SystemExit、KeyboardInterrupt 等控制流异常。 Exception...</description>
      <category>设计Python</category>
      <pubDate>Wed, 21 May 2025 11:39:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>内置异常，指预定义的[异常类]，当程序运行时遇到错误情况，就会抛出相应的异常。这些异常类构成了一个层次结构，<code>BaseException</code>&nbsp;是所有[异常的]基类。</p>
<h4>1. 顶级异常类</h4>
<ul>
<li><strong><code>BaseException</code></strong>：所有异常的基类。通常不直接捕获这个异常，因为它会捕获像&nbsp;<code>SystemExit</code>、<code>KeyboardInterrupt</code>&nbsp;等控制流异常。</li>
<li><strong><code>Exception</code></strong>：大多数内置异常的基类，除了一些系统退出和中断相关的异常。在编写异常处理代码时，通常捕获&nbsp;<code>Exception</code>&nbsp;及其子类。</li>
</ul>
<h4>2. 常见的具体异常类</h4>
<h5>2.1 语法错误相关</h5>
<ul>
<li><strong><code>SyntaxError</code></strong>：当 Python 解释器遇到不符合 Python 语法规则的代码时抛出。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：缺少冒号</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> True</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"True"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong><code>IndentationError</code></strong>：是&nbsp;<code>SyntaxError</code>&nbsp;的子类，当代码的缩进不符合 Python 规则时抛出，例如混合使用制表符和空格进行缩进。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：缩进不一致</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> True</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"True"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">  print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"This line has incorrect indentation"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5>2.2 名称错误相关</h5>
<ul>
<li><strong><code>NameError</code></strong>：当使用一个未定义的变量名时抛出。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：使用未定义的变量</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(undefined_variable)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h5>2.3 类型错误相关</h5>
<ul>
<li><strong><code>TypeError</code></strong>：当操作或函数应用于不兼容类型的对象时抛出，例如对整数和字符串进行加法操作。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：整数和字符串相加</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "2"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong><code>ValueError</code></strong>：当函数接收到正确类型但值不合适的参数时抛出，例如将一个非数字字符串转换为整数。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：将非数字字符串转换为整数</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h5>2.4 索引和键错误相关</h5>
<ul>
<li><strong><code>IndexError</code></strong>：当尝试访问序列（如列表、元组）中不存在的索引时抛出。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：访问超出列表长度的索引</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_list </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_list[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong><code>KeyError</code></strong>：当尝试访问字典中不存在的键时抛出。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：访问字典中不存在的键</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_dict[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5>2.5 文件操作错误相关</h5>
<ul>
<li><strong><code>FileNotFoundError</code></strong>：当尝试打开一个不存在的文件时抛出。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：打开不存在的文件</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">with</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> open</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'nonexistent_file.txt'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'r'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> f:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    pass</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong><code>PermissionError</code></strong>：当尝试对文件或目录进行操作，但没有足够的权限时抛出。</li>
</ul>
<h5>2.6 算术错误相关</h5>
<ul>
<li><strong><code>ZeroDivisionError</code></strong>：当尝试用零作为除数进行除法运算时抛出。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 错误示例：除以零</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> /</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong><code>OverflowError</code></strong>：当算术运算结果太大而无法表示时抛出。</li>
</ul>
<h4>3. 异常处理</h4>
<p><code>try-except</code>&nbsp;语句用于捕获和处理异常，能让你在出现异常时采取相应的措施，而不是让程序直接终止。</p>
<h5>基本语法</h5>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # 可能会抛出异常的代码块</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # ...</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ExceptionType:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # 当指定类型的异常发生时执行的代码块</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # ...</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><code>try</code>&nbsp;块：包含可能会抛出异常的代码。Python 会尝试执行这个代码块中的所有语句。</li>
<li><code>except</code>&nbsp;块：当&nbsp;<code>try</code>&nbsp;块中的代码抛出指定类型的异常时，程序流程会跳转到对应的&nbsp;<code>except</code>&nbsp;块中执行。<code>ExceptionType</code>&nbsp;是要捕获的异常类型，如果不指定，会捕获所有继承自&nbsp;<code>Exception</code>&nbsp;类的异常。</li>
</ul>
<h5>示例</h5>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> /</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">  # 这里会抛出 ZeroDivisionError 异常</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ZeroDivisionError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"不能除以零！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在这个例子中，<code>try</code>&nbsp;块里的&nbsp;<code>1 / 0</code>&nbsp;会抛出&nbsp;<code>ZeroDivisionError</code>&nbsp;异常，由于&nbsp;<code>except</code>&nbsp;块指定了要捕获&nbsp;<code>ZeroDivisionError</code>&nbsp;异常，所以程序会执行&nbsp;<code>except</code>&nbsp;块中的代码，输出“不能除以零！”。</p>
<h5>捕获多种异常</h5>
<p>可以使用多个&nbsp;<code>except</code>&nbsp;块来捕获不同类型的异常。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 这里会抛出 ValueError 异常</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> /</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> num</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ValueError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"输入的不是有效的数字！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ZeroDivisionError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"不能除以零！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在这个例子中，<code>try</code>&nbsp;块里的&nbsp;<code>int("abc")</code>&nbsp;会抛出&nbsp;<code>ValueError</code>&nbsp;异常，程序会执行对应的&nbsp;<code>except ValueError</code>&nbsp;块中的代码，输出“输入的不是有效的数字！”。</p>
<h5>捕获多个异常类型在一个 except 块中</h5>
<p>可以在一个&nbsp;<code>except</code>&nbsp;块中捕获多种不同类型的异常。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 可能抛出 ValueError</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> /</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> num  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 可能抛出 ZeroDivisionError</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF">ValueError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF">ZeroDivisionError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"发生了值错误或除零错误！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5>获取异常信息</h5>
<p>可以通过&nbsp;<code>except</code>&nbsp;块中的异常对象来获取具体的异常信息。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ValueError</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> e:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"发生了值错误: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">e</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在这个例子中，<code>as e</code>&nbsp;将捕获到的&nbsp;<code>ValueError</code>&nbsp;异常对象赋值给变量&nbsp;<code>e</code>，通过&nbsp;<code>e</code>&nbsp;可以获取异常的详细信息并打印出来。</p>
<h5>else 子句</h5>
<p><code>try-except</code>&nbsp;语句可以有一个可选的&nbsp;<code>else</code>&nbsp;子句，当&nbsp;<code>try</code>&nbsp;块中没有抛出任何异常时，会执行&nbsp;<code>else</code>&nbsp;块中的代码。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"123"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ValueError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"输入的不是有效的数字！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"转换后的数字是: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">num</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5>finally 子句</h5>
<p><code>try-except</code>&nbsp;语句还可以有一个可选的&nbsp;<code>finally</code>&nbsp;子句，无论&nbsp;<code>try</code>&nbsp;块中是否抛出异常，<code>finally</code>&nbsp;块中的代码都会被执行。一般用于执行收尾工作比如关闭文件。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"123"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ValueError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"输入的不是有效的数字！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"转换后的数字是: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">num</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">finally</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"无论是否发生异常，这里的代码都会执行。"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5>嵌套 try-except</h5>
<p><code>try-except</code>&nbsp;语句可以嵌套使用，即在&nbsp;<code>try</code>&nbsp;块或&nbsp;<code>except</code>&nbsp;块中可以再包含另一个&nbsp;<code>try-except</code>&nbsp;语句。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ValueError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">        print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"内部 try 块中发生了值错误！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"外部 try 块捕获到异常！"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5>raise from</h5>
<p>是一种异常链机制，用于在抛出新异常时保留原始异常的信息，这有助于调试，让开发者可以更清晰地了解异常发生的完整过程。</p>
<ol>
<li>
<p>语法</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # 可能引发异常的代码</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">    ...</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> SomeException </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> original_exception:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # 处理原始异常，然后抛出新的异常，并关联原始异常</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    raise</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> NewException</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"新异常的描述信息"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> original_exception</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在上述语法中，<code>SomeException</code>&nbsp;是原始异常类型，<code>original_exception</code>&nbsp;是捕获到的原始异常对象。<code>NewException</code>&nbsp;是要抛出的新异常类型，通过&nbsp;<code>raise ... from ...</code>&nbsp;语句将新异常与原始异常关联起来。</p>
</li>
<li>
<p>使用场景</p>
</li>
</ol>
<ul>
<li><strong>封装异常</strong>：当你在编写一个库或者模块时，可能不希望将底层的具体异常暴露给调用者，而是抛出一个更高级别的、更具业务含义的异常。使用&nbsp;<code>raise from</code>&nbsp;可以在抛出新异常的同时保留底层异常的信息，方便后续调试。</li>
<li><strong>异常转换</strong>：将一种类型的异常转换为另一种类型的异常，同时保留原始异常的上下文。</li>
</ul>
<ol start="3">
<li>
<p>举个例子<br>
想象你在玩一个游戏关卡，每关结束都有个报告。在 Python 里，代码运行时也会遇到各种“状况”（异常）。</p>
<p>正常情况下，一个异常抛出就完事儿了，你只知道这一个问题。但有时候，一个异常是由另一个异常引发的，就像第二关的失败是因为第一关遗留了个小失误。</p>
<p><code>raise from</code>&nbsp;就是用来记录这种关联的。当你用&nbsp;<code>raise from</code>&nbsp;抛出新异常时，它会把之前那个异常（原始异常）的“小报告”也带上。这样，开发者查看错误信息时，就能清楚知道是哪个“小失误”引发了后面的问题，就像能看到游戏关卡间的连锁反应，更方便找出代码里的毛病。</p>
<p>比如：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    num </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'abc'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 这里抛出 ValueError</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> ValueError</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> e:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    raise</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> TypeError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'新的类型错误'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> e</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里先有个&nbsp;<code>ValueError</code>，然后用&nbsp;<code>raise from</code>&nbsp;抛出&nbsp;<code>TypeError</code>&nbsp;时带上了前面&nbsp;<code>ValueError</code>&nbsp;的信息，方便排查错误。</p>
</li>
</ol>
<h5>assert</h5>
<p><code>assert</code>&nbsp;语句是一种调试辅助工具，用于在代码中检查某个条件是否为真。如果条件为真，程序会继续正常执行；如果条件为假，<code>assert</code>&nbsp;语句会抛出一个&nbsp;<code>AssertionError</code>&nbsp;异常，从而帮助快速定位程序中的问题。</p>
<ol>
<li>语法<br>
<code>assert</code>&nbsp;语句的基本语法如下：</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">assert</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> condition, message</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul>
<li><code>condition</code>：这是一个布尔表达式，也就是一个最终会计算出&nbsp;<code>True</code>&nbsp;或者&nbsp;<code>False</code>&nbsp;的表达式。<code>assert</code>&nbsp;会对这个表达式进行求值。</li>
<li><code>message</code>：这是一个可选的参数，是一个字符串。当&nbsp;<code>condition</code>&nbsp;为&nbsp;<code>False</code>&nbsp;时，<code>message</code>&nbsp;会作为&nbsp;<code>AssertionError</code>&nbsp;异常的错误信息被抛出。如果不提供&nbsp;<code>message</code>，则抛出的&nbsp;<code>AssertionError</code>&nbsp;异常不会附带额外信息。</li>
</ul>
<ol start="2">
<li>
<p>示例<br>
简单的&nbsp;<code>assert</code>&nbsp;语句</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 5</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">assert</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&gt;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"x 应该大于 10"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>在这个例子中，<code>x</code>&nbsp;的值为 5，条件&nbsp;<code>x &gt; 10</code>&nbsp;的计算结果为&nbsp;<code>False</code>，因此&nbsp;<code>assert</code>&nbsp;语句会抛出一个&nbsp;<code>AssertionError</code>&nbsp;异常，并且异常信息为&nbsp;<code>"x 应该大于 10"</code>。</p>
<p>不提供错误信息的&nbsp;<code>assert</code>&nbsp;语句</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">y </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">assert</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> y </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&gt;=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>这里条件&nbsp;<code>y &gt;= 0</code>&nbsp;为&nbsp;<code>False</code>，<code>assert</code>&nbsp;会抛出&nbsp;<code>AssertionError</code>&nbsp;异常，但由于没有提供额外的错误信息，所以异常中不会附带具体的提示内容。</p>
</li>
<li>
<p>使用场景</p>
</li>
</ol>
<ul>
<li>
<p><strong>调试代码</strong>：开发过程中，可以使用&nbsp;<code>assert</code>&nbsp;语句来验证程序中的一些假设是否成立。例如在调用一个函数之前，你可能期望某个变量具有特定的值或范围，这时就可以使用&nbsp;<code>assert</code>&nbsp;进行检查。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> divide</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> b</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> b </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">!=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"除数不能为零"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">/</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> b</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
<p>result&nbsp;=&nbsp;divide(10,&nbsp;0)&nbsp;# 会触发 AssertionError</p>
<ul>
<li>
<p><strong>验证数据的有效性</strong>：当你从外部获取数据（如文件、用户输入等）时，可以使用&nbsp;<code>assert</code>&nbsp;来确保数据符合预期的格式或范围。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">data </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">assert</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> all</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">isinstance</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(i, </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> data), </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"数据中应全为整数"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
<p>注意：</p>
<ul>
<li><strong><code>assert</code>&nbsp;可以被禁用</strong>：在 Python 中，当你以优化模式（使用&nbsp;<code>-O</code>&nbsp;或&nbsp;<code>-OO</code>&nbsp;选项运行 Python 解释器）运行代码时，所有的&nbsp;<code>assert</code>&nbsp;语句都会被忽略，不会进行条件检查。因此，<code>assert</code>&nbsp;不应该用于执行必要的程序逻辑或数据验证，而主要用于调试目的。</li>
<li><strong>性能影响</strong>：虽然&nbsp;<code>assert</code>&nbsp;语句在正常情况下执行速度很快，但在复杂的程序中，如果有大量的&nbsp;<code>assert</code>&nbsp;语句，可能会对性能产生一定的影响，因此在生产环境中应该谨慎使用。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Python中对象和JSON转化</title>
      <link>https://ujava.cn/python/jsonobj.html</link>
      <guid>https://ujava.cn/python/jsonobj.html</guid>
      <source url="https://ujava.cn/rss.xml">Python中对象和JSON转化</source>
      <description>在日常的软件测试过程中，测试数据的构造是一个占比非常大的活动。对于测试数据的构造，分为结构化的数据构造方式和非结构化的数据构造方式，反映python代码里分别是: 定义数据的class：修改数据中的某一个字段，操作json或者直接针对class的成员变量进行修改。 不定义数据的class： 直接操作json(dict)，来构造或者修改数据。 两种方式各...</description>
      <category>设计Python</category>
      <pubDate>Wed, 21 May 2025 11:39:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>在日常的软件测试过程中，测试数据的构造是一个占比非常大的活动。对于测试数据的构造，分为结构化的数据构造方式和非结构化的数据构造方式，反映python代码里分别是:</p>
<ul>
<li>定义数据的class：修改数据中的某一个字段，操作json或者直接针对class的成员变量进行修改。</li>
<li>不定义数据的class： 直接操作json(dict)，来构造或者修改数据。<br>
两种方式各有优缺点, 对于业务上有明确业务含义的数据，比如请求数据，建议使用第一种方式，对数据进行建模和定义； 而临时的数据构造，可以使用第二种方式，不需要额外定义一些结构，成本会低一些。在使用于第一种方法时，就会涉及到python中json数据与类对象的相互转化的。</li>
</ul>
<p>此篇文章，会通过4种方式来展示json数据与python的类对象相互转化：</p>
<ul>
<li>python的原生方法</li>
<li>jsonpickle</li>
<li>cattrs和attrs库</li>
<li>pydantic库<br>
以下的例子，都使用同一个class，并且使用了嵌套的json，算是一个稍微复杂的场景。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Address</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> street</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> number</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.street </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> street</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.number </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> number</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.address </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> Address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>一、python的原生方法<br>
json to python class的参考：<a href="https://stackoverflow.com/a/28352366" target="_blank" rel="noopener noreferrer">https://stackoverflow.com/a/28352366</a></p>
<p>python class to json的参考: <a href="https://stackoverflow.com/a/10252138" target="_blank" rel="noopener noreferrer">https://stackoverflow.com/a/10252138</a></p>
<p>以下为代码示例:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> JSONEncoder</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Address</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> street</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> number</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.street </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> street</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.number </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> number</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.address </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> Address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(**address)  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> MyEncoder</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">JSONEncoder</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> default</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> o</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> o.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__dict__</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '__main__'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    js </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '''{"name":"Cristian", "address":{"street":"Sesame","number":122}}'''</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    j </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">loads</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(js)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(j)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    u </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(**j)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dumps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">cls</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> MyEncoder))</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dumps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__dict__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>执行代码后，输出</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'name'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Cristian'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'address'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'street'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Sesame'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'number'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Cristian"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"address"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"street"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Sesame"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"number"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Traceback</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (most recent call last):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">***********</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    raise</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> TypeError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Object of type </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">o.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__class__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__name__</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ‘  </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">TypeError: Object of type Address is not JSON serializable</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>json转class object时，使用u = User(**j); class object转成json时，对于一级的json，直接使用u.dict就可以转成json，而对于嵌套的json，必须使用自定义的JSONEncoder才能转成功。</p>
<p>在以上的转化中，使用了两个python的特性，简单解释一下:</p>
<p>双星号() : 在函数参数中使用时，用于函数参数的解包，使用双星号()来解包一个字典的键值对到一个函数的关键字参数中。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> greet</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> age</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Hello, my name is </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">name</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> and I am </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">age</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> years old."</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">person </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'name'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Alice'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'age'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">greet</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(**person) </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 等价于 greet(name='Alice', age=30)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>dict属性:  dict属性是一个内置属性，包含了对象的属性及其值，以字典的形式存储。上面的例子中，使用dict属性，无法将address的值打印出来，就是因为值为Address对象，而不是一个字符串。<br>
优点：</p>
<p>不需要引入其他的三方库<br>
缺点：</p>
<p>一级的json数据没有什么问题，多级的json数据，to_json转化时，支持的不好，需要自己定义一个JSONEncoder才能转json成功, 如果更复杂的json，可能会失败。<br>
二、jsonpickle库<br>
jsonpickle在github上的介绍如下:</p>
<p>"Python library for serializing any arbitrary object graph into JSON. It can take almost any Python object and turn the object into JSON. Additionally, it can reconstitute the object back into Python.”</p>
<p>这段话，就说明了这是一个专注于class object -&gt; json的库，而json-&gt;object的功能则只支持调用jsonpickle得到的json，再转回class object.</p>
<p>以下为代码示例:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> jsonpickle</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Address</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> street</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> number</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.street </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> street</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.number </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> number</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.address </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> Address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(**address)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '__main__'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    js </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '''{"name":"Cristian", "address":{"street":"Sesame","number":122}}'''</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    j </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">loads</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(js)</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # jsonpickle中没有一个类似jsonpickle.decode(j, class = User)的方法，所以只能拿第一种方法初始化class</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    u </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(**j)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(jsonpickle.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">encode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">unpicklable</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">False</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    jp </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> jsonpickle.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">encode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(jp)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    u2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> jsonpickle.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">decode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(jp)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u2.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__class__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>执行后的输出为：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Cristian"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"address"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"street"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Sesame"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"number"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"py/object"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"__main__.User"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Cristian"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"address"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"py/object"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"__main__.Address"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"street"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Sesame"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"number"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&lt;</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '__main__.User'</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>一些说明：</p>
<ol>
<li>jsonpickle中没有一个类似jsonpickle.decode(j, class = User)的方法，所以只能拿第一种方法初始化class</li>
</ol>
<p>转成json时, 调用jsonpickle.encode方法，传入参数unpicklable=False时，返回值不包含把json数据转回python object的信息，得到一个通用的json字符串</p>
<ol start="3">
<li>转成json时, 调用jsonpickle.encode方法，默认unpicklable=True时，返回值中包含python object的信息，比如对象的类，输出中的"py/object": "main.User"就是这些信息</li>
</ol>
<p>json转成python object时， 必须使用unpicklable=True时的json数据，jsonpickle在json转object时的局限性就在于此。</p>
<p>优点:</p>
<p>object -&gt; json很强大，可以直接使用<br>
缺点:</p>
<p>json转object时， 比较鸡肋，基本不能直接使用<br>
三、cattrs和attrs库<br>
attrs库: <a href="https://github.com/python-attrs/attrs%E3%80%82" target="_blank" rel="noopener noreferrer">https://github.com/python-attrs/attrs。</a> attrs可以简化类的定义的管理，使用后这些类将自动获得一些有用的特性，如初始化方法（init）、repr方法、eq和hash等。实际使用的话，最基础的只需要知道attr.s和attr.ib两个方法即可。</p>
<p>cattrs库: <a href="https://github.com/python-attrs/cattrs%E3%80%82cattrs%EF%BC%88%E5%8D%B3%E2%80%9Cconversion" target="_blank" rel="noopener noreferrer">https://github.com/python-attrs/cattrs。cattrs（即“conversion</a> attrs”）是一个与attrs紧密集成的库，它提供了对象到字典（或其他数据结构）的序列化和从字典（或其他数据结构）到对象的反序列化功能。</p>
<p>以下为代码:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> attr</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> cattrs</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">@attr</span><span style="--shiki-light:#4078F2;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">s</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    street </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> attr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">ib</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">type</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    number </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> attr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">ib</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">type</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">@attr</span><span style="--shiki-light:#4078F2;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">s</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> attr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">ib</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">type</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    address </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> attr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">ib</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">type</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Address) </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># adrress 为Addres类型</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "__main__"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    js </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '''{"name":"Cristian", "address":{"street":"Sesame","number":122}}'''</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    j </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">loads</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(js)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    u </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> cattrs.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">structure</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(j, User)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u, u.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__class__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(cattrs.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">unstructure</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u))</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>执行后，输出:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">name</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Cristian'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">address</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">street</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Sesame'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">number</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">), </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&lt;</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '__main__.User'</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&gt;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'name'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Cristian'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'address'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'street'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Sesame'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'number'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>一些说明:</p>
<p>attr.s是一个装饰器，用来标记类为attrs类。<br>
attr.ib是一个用于声明属性的工厂函数, 比如attr.ib(type=str)表示一个类型为str的属性。在类定义中，使用attr.s和attr.ib基本就够了，在attr.ib方法中，还有很多参数，比如默认值、validator等，可以用于检查成员是不是满足定义的属性。<br>
cattrs.structure和cattrs.unstructure用来将attrs类和json dict之间的相互转化，含义非常的直观。<br>
优点:</p>
<p>使用cattrs和attrs结合使用，在与json的转化中，非常简单和强大，而且结构化的数据定义非常直观。<br>
四、pydantic库<br>
Pydantic库: <a href="https://github.com/pydantic/pydantic%E3%80%82%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81%E5%92%8C%E8%A7%A3%E6%9E%90%E7%9A%84Python%E5%BA%93%EF%BC%8C%E6%8F%90%E4%BE%9B%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%E3%80%81%E6%95%B0%E6%8D%AE%E9%AA%8C%E8%AF%81%E5%92%8C%E6%A8%A1%E5%9E%8B%E8%BD%AC%E6%8D%A2%E5%8A%9F%E8%83%BD%E3%80%82%E4%BD%BF%E7%94%A8Pydantic%E5%8F%AF%E4%BB%A5%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9E%8B%E7%B1%BB%EF%BC%8C%E9%AA%8C%E8%AF%81%E8%BE%93%E5%85%A5%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%AD%97%E5%85%B8%E6%88%96JSON%E3%80%82" target="_blank" rel="noopener noreferrer">https://github.com/pydantic/pydantic。数据验证和解析的Python库，提供类型注解、数据验证和模型转换功能。使用Pydantic可以定义模型类，验证输入数据并转换为字典或JSON。</a></p>
<p>直接上代码:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pydantic </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> BaseModel, Field</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> Address</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">BaseModel</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    street: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">   #pydantic使用类型注解, 来确保使用正确的类型提示来定义字段</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    number: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">BaseModel</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    name: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    address: Address</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "__main__"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    js </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '''{"name":"Cristian", "address":{"street":"Sesame","number":122}}'''</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    j </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">loads</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(js)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    u </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> User.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">parse_obj</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(j)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u, u.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">__class__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">json</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">())</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>执行代码后，输出:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">name</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Cristian'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> address</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">street</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Sesame'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">number</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&lt;</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '__main__.User'</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Cristian"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"address"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"street"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Sesame"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"number"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">122</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>一些说明:</p>
<ul>
<li>
<p>通过继承pydantic的BaseModel来定义类，类型注解来定义字段的类型，创建符合需求的数据模型(这里也能看出数据模型是pydantic的核心)。</p>
</li>
<li>
<p>继承BaseModel，直接使用parse_obj方法就可以将json数据转为class object, 直接使用json()方法就可以转为json数据。<br>
优点:</p>
</li>
<li>
<p>在与json的转化中，非常简单和强大，直接调用结构体的方法就可，而且结构化的数据定义非常直观</p>
</li>
</ul>
<p>总结：</p>
<ul>
<li>针对python中类对象和json的相关转化问题， 本文介绍了4种方式，涉及了三个非常强大的python库jsonpickle、attrs和cattrs、pydantic，但是这些库的功能并未涉及太深。在工作中，遇到实际的问题时，可以根据这几种方法，灵活选取。</li>
</ul>
<p>再回到结构化测试数据的构造，当需要对数据进行建模时，也就是赋予数据业务含义，pydantic应该是首选，目前来看，pydantic的生态非常活跃，各种基于pydantic的工具也非常多，建议尝试。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python中pass作用</title>
      <link>https://ujava.cn/python/pass.html</link>
      <guid>https://ujava.cn/python/pass.html</guid>
      <source url="https://ujava.cn/rss.xml">Python中pass作用</source>
      <description>在 Python 中，pass 是一个空语句，占位符，表示什么也不做。它通常用于需要一个语法上必须有代码的位置，但暂时还没有实际实现时。 1. 基本语法 pass 不执行任何操作，直接跳过。例如： if True: pass # 什么都不做 2. 常见用法 (1) 作为占位符 当你写代码时，某些逻辑还未完成，可以使用 pass 作为占位符，确保程序不会...</description>
      <category>设计Python</category>
      <pubDate>Wed, 21 May 2025 11:39:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>在 Python 中，<code>pass</code>&nbsp;是一个空语句，占位符，表示什么也不做。它通常用于需要一个语法上必须有代码的位置，但暂时还没有实际实现时。</p>
<h4>1.&nbsp;<strong>基本语法</strong></h4>
<p><code>pass</code>&nbsp;不执行任何操作，直接跳过。例如：</p>
<blockquote>
<p>if True:<br>
&nbsp; &nbsp; pass &nbsp;# 什么都不做</p>
</blockquote>
<h4>2.&nbsp;<strong>常见用法</strong></h4>
<h5>(1)&nbsp;<strong>作为占位符</strong></h5>
<p>当你写代码时，某些逻辑还未完成，可以使用&nbsp;<code>pass</code>&nbsp;作为占位符，确保程序不会因缺少<a href="https://so.csdn.net/so/search?q=%E4%BB%A3%E7%A0%81%E5%9D%97&amp;spm=1001.2101.3001.7020" target="_blank" rel="noopener noreferrer">代码块</a>而报错：</p>
<blockquote>
<p>def my_function():<br>
&nbsp; &nbsp; pass &nbsp;# 将来实现这个函数</p>
</blockquote>
<h5>(2)&nbsp;<strong>空循环</strong></h5>
<p>需要一个循环，但暂时不需要任何操作时：</p>
<blockquote>
<p>for i&nbsp;<a href="5">in range</a>:<br>
&nbsp; &nbsp; pass &nbsp;# 循环什么也不做</p>
</blockquote>
<h5>(3)&nbsp;<strong>空类定义</strong></h5>
<p>在定义一个类时，暂时还没有具体实现：</p>
<blockquote>
<p>class MyClass:<br>
&nbsp; &nbsp; pass &nbsp;# 占位，稍后[添加属性]和方法</p>
</blockquote>
<h5>(4)&nbsp;<strong>异常处理占位</strong></h5>
<p>在处理异常时，暂时不做任何处理：</p>
<blockquote>
<p>try:<br>
&nbsp; &nbsp; x = 10 / 0<br>
except ZeroDivisionError:<br>
&nbsp; &nbsp; pass &nbsp;# 暂时忽略除以零的错误</p>
</blockquote>
<h4>3.&nbsp;<strong>为什么不用注释代替？</strong></h4>
<ul>
<li><strong>语法规则</strong>：在需要语句的地方必须有实际代码，而注释不会被解释器识别为语句。</li>
<li><strong>代码可运行</strong>：<code>pass</code>&nbsp;确保程序不会因缺少代码块而出错。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Python基础知识</title>
      <link>https://ujava.cn/python/base2.html</link>
      <guid>https://ujava.cn/python/base2.html</guid>
      <source url="https://ujava.cn/rss.xml">Python基础知识</source>
      <description>python中的内置函数： 获得最大值：max() 获得最小值：min() 删除：del() 1.del(data):删除整个list。 2.del(data[i]):删除data中索引为i个数据 3.del(data[i:j]):删除data中第i个数据到第j个数据之前（不含j）的数据 获得长度：len() 获得总和：sum() 用于任何数据类型 *...</description>
      <category>设计Python</category>
      <pubDate>Thu, 08 May 2025 10:24:57 GMT</pubDate>
      <content:encoded><![CDATA[<h5><strong>python中的内置函数：</strong></h5>
<ul>
<li>
<h6><strong>获得最大值：max()</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>max(list)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>获得最小值：min()</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>min(list)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>删除：del()</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>例：定义一个list型数据，data = [1,2,3,4,5,6]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<p>1.del(data):删除整个list。</p>
<p>2.del(data[i]):删除data中索引为i个数据</p>
<p>3.del(data[i:j]):删除data中第i个数据到第j个数据之前（不含j）的数据</p>
<ul>
<li>
<h6><strong>获得长度：len()</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>len(list)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>获得总和：sum()</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>sum(list)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<h5><strong>用于任何数据类型</strong></h5>
<ul>
<li>
<h6>**原样输出：print **</h6>
</li>
<li>
<h6><strong>单行注释：</strong></h6>
<ul>
<li><strong>#注释内容 快捷键： ctrl+/</strong></li>
</ul>
</li>
<li>
<h6><strong>多行注释：</strong></h6>
<ul>
<li><strong>""“注释内容”"" 也可以用单引号 ‘’‘注释内容’’'</strong></li>
</ul>
</li>
<li>
<h6><strong>print(type(a))输出a的类型</strong></h6>
</li>
<li>
<h6><strong>输入函数</strong></h6>
<ul>
<li>**a=input(“提示内容”) 赋给a值 是字符串 **</li>
<li><strong>用强制转换将a变成其他类型 如：int(a) 变成整型</strong></li>
</ul>
</li>
<li>
<h6><strong>倒序：</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>a=[3,1,2,5,4]</span></span>
<span class="line"><span>a.sort(reverse=True)</span></span>
<span class="line"><span>print(a)  倒序</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
<h5><strong>数据类型介绍</strong></h5>
<ul>
<li>
<h6><strong>字符串：str</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>%s 字符串型</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>数字类型：整型 int 浮点型 float</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>%d 整型</span></span>
<span class="line"><span>%f  浮点型</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>布尔类型：1=true 0=false</strong></h6>
</li>
<li>
<h6><strong>列表：list =[1,2,3]</strong></h6>
</li>
<li>
<h6><strong>元祖：tuple= (1,2)</strong></h6>
</li>
<li>
<h6><strong>字典：dict = {“name”:“123”,“age”:18}</strong></h6>
</li>
<li>
<h6><strong>集合：set = {1,2,3,4}</strong></h6>
</li>
</ul>
<h5><strong>if语句</strong></h5>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>if 条件一:</span></span>
<span class="line"><span> &nbsp; print()</span></span>
<span class="line"><span>elif 条件二：</span></span>
<span class="line"><span>  print()</span></span>
<span class="line"><span>else :</span></span>
<span class="line"><span>  print()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5><strong>字符串操作：my="hello world hello python"</strong></h5>
<ul>
<li>
<h6><strong>切片</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>name="abcdef"</span></span>
<span class="line"><span>输出下标为0  print(name[0])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
<p>切片： 范围是左闭右开！！！</p>
<ul>
<li>print(name[0:3]) &nbsp; 结果：abc</li>
<li>print(name[0:5:2] 结果：ace</li>
<li>print(name[0👎2] 结果：ace</li>
<li>print(name[5:0:-2] 结果：fdb</li>
<li>print(name[5:0:-1] 结果:fedcb</li>
<li>print(name[:3] 结果：abc</li>
</ul>
<ul>
<li>
<h6><strong>find():检测字符串里是否包含你要查询的字符串</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.find("python"))</span></span>
<span class="line"><span>如果存在返回开始的索引值（也就是下标）</span></span>
<span class="line"><span>不存在返回值为-1</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>index():检测你设定的字符串长度里是否存在你要查询的字符串</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.index("py",0,25))</span></span>
<span class="line"><span>如果存在返回开始的索引值，否则报错，index里的第一个数字参数是起始，后一个是终止的索引值-1</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>count:查询出现的次数</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.count("l"))</span></span>
<span class="line"><span>结果为5</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>replace() 替换</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>my_str.replace("l","r",2)  将l替换为r 两次</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>split() 切片</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>以str为分隔符切片mystr,如果maxsplit有指定值，则仅分割maxsplit个字符串</span></span>
<span class="line"><span>格式：my_str.split(str=" ",2)</span></span>
<span class="line"><span>my_str.split(" ")  以空格为切片条件</span></span>
<span class="line"><span>结果为：['hello','world','hello','python']为列表结构</span></span>
<span class="line"><span>str="qaqwrwrwee"</span></span>
<span class="line"><span>print(str.split("w",2))</span></span>
<span class="line"><span>结果为：['qaq','r','rwee'] 2表示切两次  以w为切点  结果没有切点</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>startswith()</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>检查字符串是否以( )开头 是返回True 不是返回False</span></span>
<span class="line"><span>my_str.startswith("hello") 结果为：True</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>endswith() 查询是否以什么什么结尾</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.endswith("hello"))</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>upper()：转换my中的小写字母为大写(要有个变量接收，原字符串不改变)</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>res=my.upper()</span></span>
<span class="line"><span>print(res)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>lower():转换my中的大写字符为小写(要有个变量接收，原字符串不改变)</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>res=my.lower()</span></span>
<span class="line"><span>print(res)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>title():把字符串的每个单词首字母大写(要有个变量接收，原字符串不改变)</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>res=my.title()</span></span>
<span class="line"><span>print(res)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>capitalize():把字符串的第一个字符大写(要有个变量接收，原字符串不改变)</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>res=my.capitalize()</span></span>
<span class="line"><span>print(res)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>splitlines():按照行分隔，返回一个包含各行作为元素的列表</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>my_name="hello\nworld"</span></span>
<span class="line"><span>print(my_name) </span></span>
<span class="line"><span> 结果为：</span></span>
<span class="line"><span>hello</span></span>
<span class="line"><span>world</span></span>
<span class="line"><span>print(my_name.spiltlines())</span></span>
<span class="line"><span>结果为：</span></span>
<span class="line"><span>["hello","world"]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>isalpha():如果my所有字符都是字母 则返回True,否则返回False</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.isalpha())</span></span>
<span class="line"><span>结果为：True</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>isdigit()：如果my只包含数字则返回True 否则返回False</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.isdigit())</span></span>
<span class="line"><span>结果为：False</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>isalnum():如果my所有字符都是字母或数字则返回True,否则返回False</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.isalnum())</span></span>
<span class="line"><span>结果为True</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>isspace():如果my中只包含空格，则返回True,否则返回False</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>print(my.isspace())</span></span>
<span class="line"><span>结果为：False</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>rfind():从右往左找你要查找的字符串 找到后返回下标值</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>a=rfind('.')  用来取文件的后缀名</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>join:用来将列表里的元素连接变为字符串</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>a=[1,2,3,4,'3']</span></span>
<span class="line"><span>b=','.join([str(x) for x in a])</span></span>
<span class="line"><span>print(b)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
<p>结果为：1,2,3,4,3</p>
<p>列表里的元素每个必须都为str</p>
<h5><strong>列表：</strong></h5>
<ul>
<li>
<h6><strong>增加（append,extend,insert）</strong></h6>
<ul>
<li>
<p><strong>append:</strong></p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>A=[1,2,3]</span></span>
<span class="line"><span>A.append("4")</span></span>
<span class="line"><span>结果为：A=[1,2,3,"4"]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<p><strong>extend:</strong></p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>a=[1,2]  b=[3,4]</span></span>
<span class="line"><span>a.extend(b)</span></span>
<span class="line"><span>结果为 a=[1,2,3,4]</span></span>
<span class="line"><span>a.append(b)</span></span>
<span class="line"><span>结果为 a=[1,2,[3,4]]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<p><strong>insert:</strong></p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>a=[0,1,2]</span></span>
<span class="line"><span>a.insert(1,3)</span></span>
<span class="line"><span>结果为 a=[0,3,1,2]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ul>
</li>
<li>
<h6><strong>修改元素：</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>a=[1,2,3]</span></span>
<span class="line"><span>a[0]=3</span></span>
<span class="line"><span>结果为：a=[3,2,3]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>查找元素：</strong></h6>
<ul>
<li>
<p><strong>in判断存在</strong></p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>name="123456789"</span></span>
<span class="line"><span>find="123"</span></span>
<span class="line"><span>if find in name:</span></span>
<span class="line"><span> &nbsp; print("存在")</span></span>
<span class="line"><span>else:</span></span>
<span class="line"><span>  print("不存在")</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<p><strong>not in判断不存在</strong></p>
</li>
<li>
<p><strong>index和count和在字符串里的应用一样</strong></p>
</li>
</ul>
</li>
</ul>
<h5><strong>删除元素：list=[1,2,3]</strong></h5>
<ul>
<li>
<h6><strong>del list[1]</strong></h6>
</li>
<li>
<h6><strong>list.pop()删除最后一个元素</strong></h6>
</li>
<li>
<h6><strong>list.remove(1)</strong></h6>
</li>
</ul>
<h5><strong>排序</strong></h5>
<ul>
<li>
<h6><strong>list.sort() 从小到大排序</strong></h6>
</li>
<li>
<h6><strong>list.sort(reverse=Ture)从大到小排序</strong></h6>
</li>
<li>
<h6><strong>list.reverse()反转</strong></h6>
</li>
</ul>
<h5><strong>列表的嵌套</strong></h5>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>list=[1,[2,3],4]</span></span>
<span class="line"><span>list[1].insert(1,5)结果为list[1,[2,5,3],4]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h5><strong>字典：</strong></h5>
<ul>
<li>
<h6><strong>字典的每个元素由2部分组成，键:值。例如 ‘name’:‘班长’ ,'name’为键，'班长’为值</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>info={"name":'师玲珑',"age":18}</span></span>
<span class="line"><span>print(info["name"])  结果为：师玲珑</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>修改数据：</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>info["age"]=20</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>删除数据：</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>del info["age"]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<p>info.clear()删除所有数据</p>
<ul>
<li>
<h6><strong>查找数据：</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>###如果info中不存在'age'这个键，我就让他返回默认值18</span></span>
<span class="line"><span>age=info.get('age',18)</span></span>
<span class="line"><span>print(age)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<h6><strong>更改键名</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>思路：先删除原键值对，保存值，然后以新键插入字典</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<p>格式：dict[newkey] = dict.pop(key)</p>
<pre><code>d = {'a':1, 'aa':11}  
d['b'] = d.pop('a')  
d['bb'] = d.pop('aa')  
print(d)  
[#输出：] {'b': 1, 'bb': 11}
</code></pre>
<ul>
<li>
<h6><strong>len()测量字典中，键值对的个数</strong></h6>
</li>
<li>
<h6>**print(info.keys()) 返回一个包含字典所有的key列表 **</h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>结果为：info_keys(['name','age','sex'])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>print(info.values()) 返回一个包含字典所有的value列表</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>结果为：info_values([18,20,'女'])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6>**print(info.items()) 返回一个包含字典所有的键值对列表 **</h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>结果为：info_values([('name','age','sex'),(18,20,'女')])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<h6><strong>例子：</strong></h6>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>遍历字典的key &nbsp; 210 480  690</span></span>
<span class="line"><span>for key in info.keys():</span></span>
<span class="line"><span> &nbsp; &nbsp;  print(key)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>遍历字典的values<br>
for value in info.values():<br>
&nbsp; &nbsp; print(value)</p>
<p>遍历字典的items<br>
for item in info.items():<br>
&nbsp; print(item)<br>
或者<br>
for key,value in info.items()<br>
&nbsp; &nbsp; print(key,value)</p>
<p>如何实现带下标的遍历<br>
chars=[1,2,3,4]<br>
for i,chr in enumerate(chars):<br>
&nbsp; &nbsp; print(i,chr)<br>
结果为：<br>
0 1<br>
1 2<br>
2 3<br>
3 4</p>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Python数据类型操作</title>
      <link>https://ujava.cn/python/dataopt.html</link>
      <guid>https://ujava.cn/python/dataopt.html</guid>
      <source url="https://ujava.cn/rss.xml">Python数据类型操作</source>
      <description>一、常用内置类型（Built - in Types） Python 拥有多种内置[数据类型]，这些类型满足了各种编程需求，从简单的数据存储到复杂的数据结构表示。 1. 数值类型（Numeric Types） 整数（int）：整数在 Python 中可以表示任意大小的整数值，不受特定字节数的限制。例如，x = 10就定义了一个简单的整数变量。整数可用于计...</description>
      <category>设计Python</category>
      <pubDate>Thu, 08 May 2025 09:25:10 GMT</pubDate>
      <content:encoded><![CDATA[<h2>一、常用内置类型（Built - in Types）</h2>
<p>Python&nbsp;拥有多种内置[数据类型]，这些类型满足了各种编程需求，从简单的数据存储到复杂的数据结构表示。</p>
<h4>1. 数值类型（Numeric Types）</h4>
<p><strong>整数（int）</strong>：整数在 Python 中可以表示任意大小的整数值，不受特定字节数的限制。例如，<code>x = 10</code>就定义了一个简单的整数变量。整数可用于计数、索引等多种场景。</p>
<p><strong>浮点数（float）</strong>：用于表示带有小数点的数字，采用&nbsp;IEEE&nbsp;754 双精度浮点数格式。如<code>y = 3.14</code>。浮点数在科学计算、金融计算等需要处理小数的场景中非常有用。</p>
<p><strong>复数（complex）</strong>：以<code>a + bj</code>的形式表示，其中<code>a</code>为实部，<code>b</code>为虚部，<code>j</code>表示虚数单位。例如，<code>z = 2 + 3j</code>。复数在数学和工程领域的特定计算中发挥作用。</p>
<h4>2. 序列类型（Sequence Types）</h4>
<p><strong>列表（list）</strong>：列表是一种可变的有序序列，可以包含不同类型的元素。例如，<code>my_list = [1, 'hello', True]</code>。通过索引可以访问列表中的元素，并且可以对列表进行修改、添加或删除元素等操作。</p>
<p><strong>元组（tuple）</strong>：元组是不可变的有序序列，与列表类似，但一旦创建就不能修改。如<code>my_tuple = (1, 'world', False)</code>。元组常用于表示固定结构的数据，如函数返回多个值时。</p>
<p><strong>字符串（string）</strong>：字符串是由字符组成的不可变序列。在 Python 中，字符串可以使用单引号、双引号或三引号（用于多行字符串）来表示。例如，<code>s = "Python is great"</code>。字符串支持多种操作，如切片、连接、查找等。</p>
<h4>3. 映射类型（Mapping Types）</h4>
<p><strong>字典（dictionary）</strong>：字典是一种无序的键 - 值对[数据结构]，其中键必须是唯一的。例如，<code>my_dict = {'name': 'John', 'age': 25}</code>。通过键可以快速查找对应的值，常用于存储和查询相关联的数据。</p>
<h4>4. 集合类型（Set Types）</h4>
<p><strong>集合（set）</strong>：集合是无序的、不包含重复元素的数据结构。例如，<code>my_set = {1, 2, 3}</code>。集合支持交集、并集、差集等操作，可用于数据去重、元素关系判断等场景。</p>
<h4>5. 布尔类型（Boolean Type）</h4>
<p>布尔类型只有两个值：<code>True</code>和<code>False</code>。它在条件判断、逻辑运算中起着关键作用。例如，<code>x = 5; y = 10; result = x &lt; y</code>，这里<code>result</code>的值为<code>True</code>。</p>
<h3>二、常用内置常数（Built - in Constants）</h3>
<p>Python 提供了一些内置常数，这些常数在编程过程中具有特殊的意义和用途。</p>
<p><strong><code>None</code></strong>：表示空值或者缺失值。在函数没有明确返回值时，默认返回<code>None</code>。例如，一个函数只是执行一些操作而不需要返回特定结果时，可以使用<code>None</code>。</p>
<p><strong><code>True</code>和<code>False</code></strong>：这是布尔类型的两个值，在逻辑判断中使用。例如，在<code>if</code>语句中判断条件的真假。</p>
<p><strong><code>Ellipsis</code>（<code>...</code>）</strong>：这个常数在特定的语法结构中有特殊用途，比如在定义多维数组时可以作为占位符。</p>
<h3>三、常用内置运算符（Built - in Operators）</h3>
<h4>1. 算术运算符</h4>
<p><strong>加法（<code>+</code>）</strong>：用于数值相加，也可用于字符串连接和列表、元组等序列的连接。例如，<code>2 + 3</code>得到<code>5</code>，<code>"hello" + "world"</code>得到<code>"helloworld"</code>。</p>
<p><strong>减法（<code>-</code>）</strong>：用于数值相减。如<code>5 - 2</code>得到<code>3</code>。</p>
<p><strong>乘法（<code>*</code>）</strong>：对于数值是乘法运算，对于字符串和序列可以实现重复操作。例如，<code>3 * 4</code>得到<code>12</code>，<code>"a" * 3</code>得到<code>"aaa"</code>。</p>
<p><strong>除法（<code>/</code>）</strong>：执行浮点数除法，结果总是浮点数。例如，<code>5 / 2</code>得到<code>2.5</code>。</p>
<h4>2. 比较运算符</h4>
<p><strong>等于（<code>==</code>）</strong>：判断两个值是否相等。例如，<code>2 == 2</code>返回<code>True</code>，<code>"hello" == "world"</code>返回<code>False</code>。</p>
<p><strong>不等于（<code>!=</code>）</strong>：判断两个值是否不相等。</p>
<p><strong>大于（<code>&gt;</code>）、小于（<code>&lt;</code>）、大于等于（<code>&gt;=</code>）、小于等于（<code>&lt;=</code>）</strong>：用于比较数值的大小关系，也可以用于比较字符串按照字典序的大小关系。</p>
<h4>3. 逻辑运算符</h4>
<p><strong>与（<code>and</code>）</strong>：当两个操作数都为<code>True</code>时，结果为<code>True</code>；否则为<code>False</code>。例如，<code>True and False</code>得到<code>False</code>。</p>
<p><strong>或（<code>or</code>）</strong>：只要有一个操作数为<code>True</code>，结果就为<code>True</code>。例如，<code>True or False</code>得到<code>True</code>。</p>
<p><strong>非（<code>not</code>）</strong>：对操作数取反，<code>not True</code>得到<code>False</code>，<code>not False</code>得到<code>True</code>。</p>
<h3>四、整除（Integer Division (<code>//</code>)）</h3>
<p>整除运算符<code>//</code>用于计算两个数相除并向下取整得到整数结果。例如，<code>7 // 3</code>得到<code>2</code>，<code>-7 // 3</code>得到<code>-3</code>。整除在处理需要得到整数部分结果的场景中非常有用，比如计算将一定数量的物品平均分配到若干个容器中时，每个容器能得到的物品数量。与普通除法（<code>/</code>）不同，<code>//</code>操作更关注整数部分的结果，并且在处理负数时遵循向下取整的规则。</p>
<h3>五、模运算或余数运算符（<code>%</code>）</h3>
<p>模运算（<code>%</code>）用于计算两个数相除的余数。例如，<code>7 % 3</code>得到<code>1</code>，<code>10 % 2</code>得到<code>0</code>。在很多实际应用中都非常有用，比如判断一个数是否能被另一个数整除（余数为 0 时表示能整除），或者在循环队列、哈希表等数据结构中确定索引位置等场景。例如，在一个长度为<code>n</code>的循环队列中，如果当前位置为<code>pos</code>，要向前移动<code>m</code>个位置，可以通过<code>(pos + m) % n</code>来计算新的位置。</p>
<h3>六、类型影响语义（Types Affect Semantics）</h3>
<p>在 Python 中，数据类型对操作的语义有着重要的影响。</p>
<p><strong>数值类型</strong>：不同的数值类型之间进行操作时，可能会发生类型转换。例如，整数和浮点数进行算术运算时，整数会自动转换为浮点数，然后进行计算。这确保了计算结果的准确性和一致性。</p>
<p><strong>序列类型</strong>：对于列表、元组等序列类型，虽然它们有一些相似的操作（如索引、切片），但由于列表是可变的而元组是不可变的，在对它们进行修改操作时语义完全不同。对列表可以使用诸如<code>append</code>、<code>pop</code>等方法来改变列表的内容，但这些操作在元组上是不允许的。</p>
<p><strong>布尔类型与其他类型</strong>：布尔类型在逻辑运算中的语义是明确的，但当与其他类型进行操作时，也会遵循一定的规则。例如，在条件判断中，很多数据类型都可以被转换为布尔值，非零数值、非空字符串、非空列表等都被视为<code>True</code>，而<code>0</code>、<code>""</code>、<code>[]</code>等被视为<code>False</code>。</p>
<h3>七、运算符优先级（Operator&nbsp;Order）</h3>
<p>Python 中的运算符有明确的优先级顺序。当一个表达式中包含多个不同类型的运算符时，按照优先级顺序进行计算。</p>
<p><strong>括号优先级最高</strong>：可以使用括号来改变运算顺序，括号内的表达式先进行计算。例如，<code>(2 + 3) * 4</code>，先计算<code>2 + 3</code>得到<code>5</code>，然后再乘以<code>4</code>得到<code>20</code>。</p>
<p><strong>算术运算符优先级</strong>：先乘除后加减。例如，<code>2 + 3 * 4</code>，先计算<code>3 * 4 = 12</code>，然后再加上<code>2</code>得到<code>14</code>。其中，幂运算（<code>**</code>）优先级高于乘除运算。</p>
<p><strong>比较运算符优先级低于算术运算符</strong>：例如，<code>2 + 3 &gt; 4</code>，先计算<code>2 + 3 = 5</code>，然后再比较<code>5 &gt; 4</code>得到<code>True</code>。</p>
<p><strong>逻辑运算符优先级</strong>：<code>not</code>的优先级最高，然后是<code>and</code>，最后是<code>or</code>。例如，<code>True or False and not True</code>，先计算<code>not True</code>得到<code>False</code>，然后<code>False and False</code>得到<code>False</code>，最后<code>True or False</code>得到<code>True</code>。</p>
<h3>八、短路求值（Short - Circuit Evaluation）</h3>
<p>短路求值是逻辑运算符<code>and</code>和<code>or</code>的一个重要特性。</p>
<p><strong><code>and</code>的短路求值</strong>：当使用<code>and</code>连接两个表达式时，如果第一个表达式为<code>False</code>，则不会再计算第二个表达式，因为整个表达式必然为<code>False</code>。例如，<code>False and some_function()</code>，这里<code>some_function()</code>不会被调用。</p>
<p><strong><code>or</code>的短路求值</strong>：当使用<code>or</code>连接两个表达式时，如果第一个表达式为<code>True</code>，则不会再计算第二个表达式，因为整个表达式已经为<code>True</code>。例如，<code>True or some_function()</code>，<code>some_function()</code>不会被调用。这种特性在编写条件判断和优化代码性能时非常有用，可以避免不必要的计算。</p>
<p>Python 的数据类型和操作是其编程的基础，深入理解这些概念对于编写高效、准确的 Python 程序至关重要。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python数据类型</title>
      <link>https://ujava.cn/python/datatype.html</link>
      <guid>https://ujava.cn/python/datatype.html</guid>
      <source url="https://ujava.cn/rss.xml">Python数据类型</source>
      <description>img_12.pngimg_12.png img_13.pngimg_13.png img_14.pngimg_14.png img_15.pngimg_15.png</description>
      <category>设计Python</category>
      <pubDate>Thu, 08 May 2025 09:25:10 GMT</pubDate>
      <content:encoded><![CDATA[<figure><figcaption>img_12.png</figcaption></figure>
<figure><figcaption>img_13.png</figcaption></figure>
<figure><figcaption>img_14.png</figcaption></figure>
<figure><figcaption>img_15.png</figcaption></figure>
]]></content:encoded>
    </item>
    <item>
      <title>Python基础—集合</title>
      <link>https://ujava.cn/python/set.html</link>
      <guid>https://ujava.cn/python/set.html</guid>
      <source url="https://ujava.cn/rss.xml">Python基础—集合</source>
      <description>Python中的集合是一种无序、可变、元素唯一的数据结构。它常用于去重、成员检测以及数学运算（如并集、交集、差集等）。集合与列表和元组的主要区别是它不允许重复元素，且没有顺序。 一. 集合的[基本操作] 1. 创建集合 使用大括号 {} 来定义集合： 使用 set() 函数 来创建集合，尤其当需要从其他数据类型（如列表或元组）转换时： 2. 添加[集合...</description>
      <category>设计Python</category>
      <pubDate>Wed, 07 May 2025 11:29:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Python中的集合是一种无序、可变、元素唯一的数据结构。它常用于去重、成员检测以及数学运算（如并集、交集、差集等）。集合与列表和元组的主要区别是它不允许重复元素，且没有顺序。</p>
<h3>一. 集合的[基本操作]</h3>
<h4>1. 创建集合</h4>
<p><strong>使用大括号&nbsp;<code>{}</code></strong>&nbsp;来定义集合：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 3, 4, 5}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>使用&nbsp;<code>set()</code>&nbsp;函数</strong>&nbsp;来创建集合，尤其当需要从其他数据类型（如列表或元组）转换时：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_list </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> set</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_list)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 3}（去掉重复元素）</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>2. 添加[集合元素]</h4>
<p><strong>使用&nbsp;<code>add()</code></strong>&nbsp;向集合添加单个元素：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">add</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 3, 4}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>3. 删除集合元素</h4>
<p><strong>使用&nbsp;<code>remove()</code></strong>&nbsp;删除指定元素。如果元素不存在，会引发&nbsp;<code>KeyError</code>&nbsp;错误：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">remove</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 4}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>使用&nbsp;<code>discard()</code></strong>&nbsp;删除指定元素。如果元素不存在，不会引发错误：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">discard</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 即使 5 不在集合中，也不会报错</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 3, 4}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>使用&nbsp;<code>pop()</code></strong>&nbsp;从集合中随机删除并返回一个元素（集合是无序的，所以删除的元素是随机的）：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">element </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_set.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">pop</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(element)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出删除的随机元素</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出剩余的集合</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>4.&nbsp;[清空集合]</h4>
<p><strong>使用&nbsp;<code>clear()</code></strong>&nbsp;清空集合：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">clear</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: set()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>二. 集合的数学运算</h3>
<p>集合支持多种数学运算，像是并集、交集、差集和对称差集。</p>
<h4><strong>1. 并集</strong></h4>
<p>两个集合的并集包含所有元素（不重复）。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">set1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">set2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">union_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">|</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set2  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 使用 | 运算符</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(union_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 3, 4, 5}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>2. 交集</strong></h4>
<p>两个集合的交集包含共同的元素。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">intersection_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set2  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 使用 &amp; 运算符</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(intersection_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {3}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>3. 差集</strong></h4>
<p>集合 A 的差集是 A 中有而 B 中没有的元素。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">difference_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set2  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 使用 - 运算符</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(difference_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>4. 对称差集</strong></h4>
<p>两个集合的对称差集是两个集合中不重复的元素。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">symmetric_difference_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">^</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> set2  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 使用 ^ 运算符</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(symmetric_difference_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 4, 5}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>三. 集合的常用方法</h3>
<p><strong><code>len()</code></strong>：返回集合中元素的数量。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set))  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: 4</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong><code>in</code></strong>：检查元素是否在集合中。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_set)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: Trueprint(5 in my_set)  # 输出: False</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong><code>copy()</code></strong>：返回集合的一个副本。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set_copy </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_set.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">copy</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_set_copy)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 3, 4}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>四. 集合的使用场景</h3>
<h4><strong>1. 去重</strong></h4>
<p>利用集合自动去除重复元素。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_list </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">unique_elements </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> set</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_list)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(unique_elements)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: {1, 2, 3, 4}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>2.&nbsp;<strong>集合运算</strong></h4>
<p>集合的并集、交集、差集等运算非常适合处理数学问题或者数据集合的合并与筛选。</p>
<h4><strong>3. 成员检测</strong></h4>
<p>通过集合进行快速的成员检测，因其采用哈希表结构，查找速度非常快。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_set </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 3</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_set:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"3 is in the set."</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>**总结：**Python 中的集合是一个非常强大且灵活的数据结构，适用于很多场景，尤其是在需要处理独特元素、进行集合运算（如交集、并集、差集等）时非常有用。其无序、唯一、支持数学运算的特性，使得集合成为高效的数据处理工具。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python字符串拼接</title>
      <link>https://ujava.cn/python/str.html</link>
      <guid>https://ujava.cn/python/str.html</guid>
      <source url="https://ujava.cn/rss.xml">Python字符串拼接</source>
      <description>一、使用加号（+）[运算符] 1、适用场景 少量字符串拼接：当需要拼接的字符串数量较少时，使用加号运算符是最简单直观的方法，代码简洁易读。 动态字符串生成：在需要根据变量动态生成字符串时，加号运算符也非常方便。 拼接不同类型数据：加号运算符可以将不同类型的数据转换后的字符串拼接成一个字符串，包括文本、数字、变量等。 2、优点 语法简洁直观：加号运算符是...</description>
      <category>设计Python</category>
      <pubDate>Wed, 07 May 2025 08:42:18 GMT</pubDate>
      <content:encoded><![CDATA[<h2>一、使用加号（+）[运算符]</h2>
<h3>1、适用场景</h3>
<ul>
<li><strong>少量字符串拼接</strong>：当需要拼接的字符串数量较少时，使用加号运算符是最简单直观的方法，代码简洁易读。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> string1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Hello"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> string2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "World"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> combined_string </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> string1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ", "</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> string2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "!"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(combined_string)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: Hello, World!</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>动态字符串生成</strong>：在需要根据变量动态生成字符串时，加号运算符也非常方便。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Tom"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> greeting </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Hello, "</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "!"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(greeting)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: Hello, Tom!</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>拼接不同类型数据</strong>：加号运算符可以将不同类型的数据转换后的字符串拼接成一个字符串，包括文本、数字、变量等。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "张三"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 18</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"我叫"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "，"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "今年"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(age) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "岁。"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 输出：我叫张三，今年18岁。</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2、优点</h3>
<ul>
<li>
<p><strong>语法简洁直观</strong>：加号运算符是最基本的字符串拼接方法之一，语法简单易懂，易于理解和使用。</p>
</li>
<li>
<p><strong>灵活性高</strong>：加号运算符可以将任意类型的字符串连接在一起，包括文本字符串、数字字符串、变量等。</p>
</li>
<li>
<p><strong>适用性强</strong>：加号运算符可以在Python的各个版本中使用，并且适用于多种操作系统和平台。</p>
</li>
</ul>
<h3>3、缺点</h3>
<ul>
<li>
<p><strong>代码不够简洁</strong>：在大量拼接字符串的情况下，使用长的加号拼接语句会使代码变得不够简洁。</p>
</li>
<li>
<p><strong>性能低</strong>：在大量拼接字符串的情况下，加号运算符可能会导致性能问题。因为每次使用加号拼接字符串都需要创建一个新的字符串对象，这会消耗大量内存。</p>
</li>
<li>
<p><strong>不能直接拼接数字</strong>：加号运算符不能直接将数字和字符串连接在一起。</p>
</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 18</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"I'm "</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "."</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>Python解释器会抛出 TypeError: can only concatenate str (not "int") to str 错误。</p>
<h2>二、使用%[操作符]</h2>
<h3>1、适用场景</h3>
<ul>
<li><strong>简单格式化需求</strong>：对于少量字符串的拼接，使用&nbsp;<code>%</code>&nbsp;操作符可能看起来更简洁，尤其是在不需要频繁拼接的情况下。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "张三"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 18</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> message </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "大家好，我是</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">%s</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">，我今年</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">%d</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">岁。"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> %</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (name, age)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(message)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：大家好，我是张三，我今年18岁。</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>旧代码兼容性</strong>：在Python 2到Python 3的迁移过程中，一些旧代码可能仍在使用&nbsp;<code>%</code>&nbsp;操作符进行字符串格式化，保持这种一致性可能有助于维护旧代码。</li>
</ul>
<h3>2、优点</h3>
<ul>
<li>
<p><strong>语法简洁直观</strong>：对于简单的字符串格式化需求，<code>%</code>操作符的语法相对简单，易于理解和使用。</p>
</li>
<li>
<p><strong>功能强大</strong>：<code>%</code>操作符支持多种占位符（如<code>%s</code>、<code>%d</code>、<code>%f</code>等），可以满足基本的格式化需求。</p>
</li>
<li>
<p><strong>继承自C语言</strong>：<code>%</code>操作符的格式化方式继承自C语言，因此在很多编程语言中都有类似的实现，便于熟悉C语言的开发者快速上手。</p>
</li>
</ul>
<h3>3、缺点</h3>
<ul>
<li>
<p><strong>可读性差</strong>：当需要拼接多个变量时，<code>%</code>操作符的语法可能会变得复杂，降低代码的可读性。</p>
</li>
<li>
<p><strong>功能有限</strong>：相比于<code>str.format()</code>和f-string，<code>%</code>操作符的功能较为有限，不支持一些高级的格式化选项。</p>
</li>
<li>
<p><strong>效率较低</strong>：在拼接大量字符串时，<code>%</code>操作符的效率较低，尤其是在需要频繁拼接的情况下。</p>
</li>
</ul>
<h2>三、使用format()方法</h2>
<h3>1、适用场景</h3>
<ul>
<li><strong>复杂格式化需求</strong>：当需要对字符串进行复杂的格式化操作时，如指定数字的小数位数、对齐方式等，<code>format()</code>方法提供了强大的功能支持。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "张三"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 18</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> message </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "大家好，我是</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">，我今年</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">岁。"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">format</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(name, age)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(message)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：大家好，我是张三，我今年18岁。</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>
<p><strong>多变量拼接</strong>：在需要拼接多个变量且这些变量可能来自不同的数据结构（如字典、列表等）时，<code>format()</code>方法可以通过索引或关键字参数灵活地插入变量。</p>
</li>
<li>
<p><strong>跨版本兼容性</strong>：<code>format()</code>方法在Python 2.7及更高版本中都可用，因此适用于需要兼容旧版本Python的项目。</p>
</li>
<li>
<p><strong>动态内容生成</strong>：在需要根据用户输入或其他动态内容生成字符串时，<code>format()</code>方法可以方便地插入变量。</p>
</li>
</ul>
<h3>2、优点</h3>
<ul>
<li>
<p><strong>灵活性高</strong>：支持位置参数、关键字参数等多种方式，可以根据需要灵活地插入变量。</p>
</li>
<li>
<p><strong>功能丰富</strong>：提供了多种格式化选项，如对齐方式、填充字符、数字格式化等。</p>
</li>
<li>
<p><strong>代码清晰</strong>：通过占位符和参数分离的方式，使得代码更易于阅读和维护。</p>
</li>
</ul>
<h3>3、缺点</h3>
<ul>
<li>
<p><strong>语法相对复杂</strong>：相比于f-string，<code>format()</code>方法的语法稍显冗长。</p>
</li>
<li>
<p><strong>性能稍差</strong>：在处理大量字符串拼接时，<code>format()</code>方法的性能不如f-string高效。</p>
</li>
<li>
<p><strong>调试难度</strong>：当[格式化字符串]较为复杂时，可能会增加调试的难度。</p>
</li>
</ul>
<h2>四、使用F-strings（格式化字符串）</h2>
<h3>1、适用场景</h3>
<p>F-strings 是 Python 3.6 引入的一种字符串格式化方式，它通过在字符串前加上&nbsp;<code>f</code>&nbsp;或&nbsp;<code>F</code>&nbsp;前缀，并在大括号&nbsp;<code>{}</code>&nbsp;中包含要插入的表达式，使得字符串拼接变得更加直观和易于理解。</p>
<p>以下是 F-strings 的适用场景：</p>
<ul>
<li><strong>简单的字符串拼接</strong>：适用于需要将变量或表达式嵌入到字符串中的简单场景。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "张三"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 18</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> message </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"大家好，我是</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">name</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">，我今年</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">age</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">岁。"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(message)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：大家好，我是张三，我今年18岁。</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>复杂的表达式</strong>：F-strings 支持直接在字符串中嵌入复杂的表达式，包括函数调用和数学运算。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> power</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">x</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">     return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 4</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">x</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> * </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">x</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> = </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">power</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(x)</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(result)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: 4 * 4 = 16</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>多行字符串</strong>：F-strings 也可以用于多行字符串，只需在字符串前加上&nbsp;<code>f</code>&nbsp;或&nbsp;<code>F</code>&nbsp;前缀。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "张三"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 18</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> message </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"""</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 大家好，我是</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">name</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">。</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 我今年</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">age</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">岁。</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> """</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(message)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>性能要求高的场景</strong>：F-strings 在性能上优于其他字符串格式化方法，特别是在处理大量字符串拼接时表现更优。例如：</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> names </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Alice"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Bob"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Cindy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> greeting </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Names: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">', '</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">join</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(names)</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(greeting)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: Names: Alice, Bob, Cindy</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>需要格式化输出的场景</strong>：F-strings 支持格式化指定符，可以对表达式进行格式化输出。例如：</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> number </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1234567.89</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> formatted_number </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">number</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">:,.2f</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(formatted_number)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: 1,234,567.89</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ​</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2、优点</h3>
<ul>
<li>
<p><strong>语法简洁直观</strong>：F-strings 允许直接在字符串中嵌入表达式，无需使用字符串拼接或格式化函数，使代码更加简洁明了。</p>
</li>
<li>
<p><strong>可读性</strong>：通过在字符串中嵌入变量名，F-strings 消除了字符串拼接的必要性，使代码更加清晰易读。</p>
</li>
<li>
<p><strong>可维护性</strong>：F-strings 减少了拼接字符串时可能出现的错误，如忘记添加分隔符或使用错误的格式化占位符，从而提高了代码的可维护性。</p>
</li>
<li>
<p><strong>更高的性能</strong>：避免了多次字符串拼接带来的性能损失，提高了代码的执行效率。</p>
</li>
<li>
<p><strong>支持内置函数和方法</strong>：F-strings 支持在大括号中嵌入复杂的表达式，包括函数调用和数学运算。</p>
</li>
</ul>
<h3>3、缺点</h3>
<ul>
<li>
<p><strong>版本限制</strong>：F-strings 仅适用于 Python 3.6 及以上版本，对于旧版本的 Python 需要使用其他字符串格式化方法。</p>
</li>
<li>
<p><strong>表达式依赖性</strong>：F-strings 中的表达式依赖于后续代码逻辑，如果表达式不正确可能会导致错误。</p>
</li>
<li>
<p><strong>代码可读性问题</strong>：在处理大量字符串拼接时，F-strings 可能会降低代码的可读性，特别是在嵌入复杂的表达式时。</p>
</li>
<li>
<p><strong>不能使用行内注释</strong>：F-strings 中不能直接使用行内注释，这可能会限制某些调试场景下的使用。</p>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Python字符串操作：拼接、分割、查找、替换</title>
      <link>https://ujava.cn/python/stropt.html</link>
      <guid>https://ujava.cn/python/stropt.html</guid>
      <source url="https://ujava.cn/rss.xml">Python字符串操作：拼接、分割、查找、替换</source>
      <description>一、字符串拼接 字符串拼接是指将多个字符串组合成一个单一的字符串。Python 提供了多种方式来实现字符串拼接： 这是最简单的拼接方式，可以直接将两个或多个字符串连接在一起。 Python 的格式化字符串提供了更灵活的方式来拼接字符串。 使用加号（+）运算符 使用格式化字符串 二、字符串分割 字符串分割是将一个字符串按照指定的分隔符拆分成多个子字符串的...</description>
      <category>设计Python</category>
      <pubDate>Wed, 07 May 2025 08:42:18 GMT</pubDate>
      <content:encoded><![CDATA[<h3>一、字符串拼接</h3>
<p>字符串拼接是指将多个字符串组合成一个单一的字符串。Python 提供了多种方式来实现字符串拼接：</p>
<p>这是最简单的拼接方式，可以直接将两个或多个字符串连接在一起。</p>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">a = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Hello"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">b = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"World"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c = a + </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">" "</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> + b</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(c)  # 输出: Hello World</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Python 的格式化字符串提供了更灵活的方式来拼接字符串。</p>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Alice"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">age = </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span></span>
<span class="line"><span style="--shiki-light:white;--shiki-dark:#FFFFFF">message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"My name is {name} and I am {age} years old."</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(message)  # 输出: My </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">name</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> is</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Alice and I am </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> years old.</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>使用加号（+）运算符</strong></li>
<li><strong>使用格式化字符串</strong></li>
</ul>
<h3>二、字符串分割</h3>
<p>字符串分割是将一个字符串按照指定的分隔符拆分成多个子字符串的过程。Python 中的&nbsp;<code>split()</code>&nbsp;方法可以实现这一功能。</p>
<p>例如，我们可以用空格作为分隔符来分割字符串：</p>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Python is fun"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">words</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.split()</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">words</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  # 输出: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Python'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'is'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'fun'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>还可以指定其他分隔符：</p>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">csv_data = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"apple,banana,cherry"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">fruits = csv_data.split(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">","</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(fruits)  # 输出: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'apple'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'banana'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'cherry'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>三、字符串查找</h3>
<p>字符串查找是检查某个子字符串是否存在于另一个字符串中的操作。Python 提供了多种方法来进行字符串查找，包括&nbsp;<code>find()</code>&nbsp;和&nbsp;<code>in</code>&nbsp;关键字。</p>
<p>使用&nbsp;<code>find()</code>&nbsp;方法可以返回子字符串第一次出现的位置：</p>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Python programming is fun"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">position</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.find(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"programming"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">position</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  # 输出: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">7</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使用&nbsp;<code>in</code>&nbsp;关键字可以判断子字符串是否存在：</p>
<div class="language-php line-numbers-mode" data-highlighter="shiki" data-ext="php" data-title="php" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "fun"</span><span style="--shiki-light:#986801;--shiki-dark:#ABB2BF"> in</span><span style="--shiki-light:#986801;--shiki-dark:#ABB2BF"> text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Found the word 'fun'"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Word not found"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>四、字符串替换</h3>
<p>字符串替换是将字符串中的某些部分替换为其他内容的操作。Python 的&nbsp;<code>replace()</code>&nbsp;方法可以完成这项任务。</p>
<p>例如，将字符串中的特定单词替换为新的单词：</p>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">original_text = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"I like apples"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">new_text = original_text.replace(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"apples"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"oranges"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(new_text)  # 输出: I </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">like</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> oranges</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>此外，<code>replace()</code>&nbsp;方法还支持替换次数的限制：</p>
<div class="language-cobol line-numbers-mode" data-highlighter="shiki" data-ext="cobol" data-title="cobol" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> = </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"one two one three one"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">new_text = </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.replace(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"one"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ONE"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">print(new_text)  # 输出: ONE two ONE three one</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>总结</h3>
<p>Python 提供了强大的字符串操作工具，使得开发者能够轻松地处理各种文本数据。无论是拼接、分割、查找还是替换，Python 都提供了简单直观的方法来满足需求。掌握这些基本操作对于任何 Python 开发者来说都是非常重要的基础技能。</p>
]]></content:encoded>
    </item>
    <item>
      <title>大模型理论基础</title>
      <link>https://ujava.cn/model/base2.html</link>
      <guid>https://ujava.cn/model/base2.html</guid>
      <source url="https://ujava.cn/rss.xml">大模型理论基础</source>
      <description>第1章：什么是大模型？ 1.1 大模型的定义 大模型，顾名思义，是指拥有大规模参数和复杂结构的机器学习模型。与传统的小模型相比，大模型通常包含数亿甚至数千亿个参数，这些参数是模型学习过程中需要调整的变量。大模型的核心目标是通过海量数据的训练，捕捉数据中的复杂规律，从而实现更高的性能和更广泛的应用。 举个例子： 想象一下，传统的小模型就像是一个小学生，只...</description>
      <category>设计模型</category>
      <pubDate>Wed, 07 May 2025 06:37:06 GMT</pubDate>
      <content:encoded><![CDATA[<h3>第1章：什么是大模型？</h3>
<h4>1.1 大模型的定义</h4>
<p>大模型，顾名思义，是指拥有大规模参数和复杂结构的机器学习模型。与传统的小模型相比，大模型通常包含数亿甚至数千亿个参数，这些参数是模型学习过程中需要调整的变量。大模型的核心目标是通过海量数据的训练，捕捉数据中的复杂规律，从而实现更高的性能和更广泛的应用。</p>
<p><strong>举个例子</strong>：<br>
想象一下，传统的小模型就像是一个小学生，只能解决简单的加减乘除问题。而大模型则像是一个博士生，能够解决复杂的数学问题，甚至能够写出论文、创作诗歌、编写代码。</p>
<h4>1.2 大模型与普通模型的区别</h4>
<p>普通模型通常针对特定任务设计，例如识别猫和狗的分类模型，或者预测房价的回归模型。而大模型则具有更强的通用性，能够处理多种任务，例如GPT（Generative Pre-trained&nbsp;Transformer）不仅可以生成文本，还可以翻译、回答问题、写代码等。</p>
<p><strong>举个例子</strong>：<br>
普通模型就像是一把螺丝刀，只能用来拧螺丝。而大模型则像是一个多功能工具箱，既可以拧螺丝，也可以剪电线、钉钉子，甚至还能进行一些创意性的工作。</p>
<h4>1.3 大模型的核心技术</h4>
<p>大模型的成功离不开几项核心技术：</p>
<ul>
<li><strong>深度学习</strong>：大模型基于深度学习框架，通过多层神经网络从数据中提取特征。</li>
<li><strong>Transformer架构</strong>：这是大模型的核心结构，通过自注意力机制（Self-Attention）捕捉数据中的长距离依赖关系。</li>
<li><strong>预训练与微调</strong>：大模型通常先在大量通用数据上进行预训练，然后在特定任务上进行微调，从而提高性能。</li>
</ul>
<p><strong>举个例子</strong>：<br>
Transformer架构就像是一个超级大脑，能够同时关注输入数据中的多个部分。例如，在翻译句子时，它能够同时理解句子的开头和结尾，从而生成更准确的翻译结果。<br>
</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python JSON库</title>
      <link>https://ujava.cn/python/json.html</link>
      <guid>https://ujava.cn/python/json.html</guid>
      <source url="https://ujava.cn/rss.xml">Python JSON库</source>
      <description>一、json库概述 JSON(JavaScript Object Notation)是一种轻量级的[数据交换格式]，Python的json模块提供了[JSON数据]的编码和解码功能。该模块可以将Python对象转换为JSON字符串（序列化），也可以将JSON字符串转换为Python对象（反序列化）。 核心功能 json.dumps(): 将Python...</description>
      <category>设计Python</category>
      <pubDate>Wed, 07 May 2025 06:37:06 GMT</pubDate>
      <content:encoded><![CDATA[<h3>一、json库概述</h3>
<p>JSON(JavaScript Object Notation)是一种轻量级的[数据交换格式]，Python的<code>json</code>模块提供了[JSON数据]的编码和解码功能。该模块可以将Python对象转换为JSON字符串（序列化），也可以将JSON字符串转换为Python对象（反序列化）。</p>
<h4>核心功能</h4>
<ul>
<li><code>json.dumps()</code>: 将Python对象编码为JSON字符串</li>
<li><code>json.loads()</code>: 将JSON字符串解码为Python对象</li>
<li><code>json.dump()</code>: 将Python对象编码并写入文件</li>
<li><code>json.load()</code>: 从文件读取并解码JSON数据</li>
</ul>
<h3>二、基本使用方法</h3>
<h4>1. 序列化（Python对象 → JSON字符串）</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">data&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;{  </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"张三"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,  </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"age"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,  </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"married"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">True</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,  </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"children"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"小明"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,&nbsp;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"小红"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">],  </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"pets"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">json_str&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dumps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(data,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">ensure_ascii</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">False</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">indent</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(json_str)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>输出：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" data-title="json" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"张三"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "age"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "married"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "children"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"小明"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"小红"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">],</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "pets"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">null</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>参数说明</strong>：</p>
<ul>
<li><code>ensure_ascii=False</code>: 允许非ASCII字符（如中文）直接输出</li>
<li><code>indent=4</code>: 美化输出，使用4个空格缩进</li>
</ul>
<h4>2. 反序列化（JSON字符串 → Python对象）</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">json_data </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '{"name": "李四", "age": 25, "city": "北京"}'</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">python_obj </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">loads</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(json_data)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(python_obj[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])&nbsp;</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: 李四  </span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(python_obj))&nbsp;</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: &lt;class 'dict'&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>3. 文件读写操作</h4>
<p><strong>写入JSON文件</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">with</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> open</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'data.json'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'w'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">encoding</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'utf-8'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> f:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dump</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(data, f, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">ensure_ascii</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">False</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">indent</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>读取JSON文件</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">with</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> open</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'data.json'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'r'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">encoding</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'utf-8'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> f:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    loaded_data </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">load</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(f)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>三、高级用法</h3>
<h4>1. 处理复杂对象</h4>
<p>默认情况下，json模块只能处理基本数据类型。要序列化复杂对象，需要自定义编码器：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> __init__</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> age</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        self</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> age</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	        </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">&nbsp;user_encoder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">obj</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	if</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">&nbsp;isinstance</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(obj,&nbsp;User):  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'name'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;obj.name,&nbsp;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'age'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;obj.age}  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	raise</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF">&nbsp;TypeError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Object of type&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">obj.</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">name</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">&nbsp;is not JSON serializable'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	user&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">&nbsp;User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"王五"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">28</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	user_json&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dumps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(user,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">default</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">user_encoder)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>2. 自定义解码器</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> user_decoder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">dct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'name'</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> dct </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">and</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'age'</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> dct:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(dct[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'name'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], dct[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'age'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> dct</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">user_obj&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">loads</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(user_json,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">object_hook</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">user_decoder)  </span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(user_obj))&nbsp;</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出: &lt;class '**main**.User'&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>3. 性能优化</h4>
<p>对于大型JSON数据处理：</p>
<ul>
<li>使用<code>json.JSONEncoder</code>和<code>json.JSONDecoder</code>类提高性能</li>
<li>考虑使用<code>ujson</code>或<code>orjson</code>等第三方库（非标准库）</li>
</ul>
<h3>四、实际应用场景</h3>
<h4>1. Web API开发</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># Flask示例</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> flask </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Flask, jsonify, request</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">app&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">&nbsp;Flask</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(**name</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">@app</span><span style="--shiki-light:#4078F2;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">route</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'/api/data'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">&nbsp;methods</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'POST'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">&nbsp;receive_data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">data&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;request.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get_json</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()&nbsp;</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 自动使用json模块解析请求体</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h1>处理数据</h1>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">&nbsp;jsonify</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">({</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"status"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"success"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">})</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4>2. 配置文件管理</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 读取配置</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">with</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> open</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'config.json'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> f:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    config </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">load</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(f)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h1>修改并保存配置</h1>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">config[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'timeout'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">&nbsp;30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">with</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">&nbsp;open</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'config.json'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,&nbsp;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'w'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)&nbsp;</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;f:  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dump</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(config,&nbsp;f,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">indent</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>3. 数据交换与存储</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 将Pandas DataFrame转为JSON</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">({</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'A'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'B'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'x'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'y'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]})</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">json_str </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">to_json</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">orient</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'records'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h1>从JSON恢复DataFrame</h1>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">new_df&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">read_json</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(json_str)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>五、常见问题与解决方案</h3>
<ol>
<li>
<p><strong>中文乱码问题</strong></p>
<ul>
<li>确保使用<code>ensure_ascii=False</code></li>
<li>文件操作时指定编码为<code>utf-8</code></li>
</ul>
</li>
<li>
<p><strong>日期时间对象的处理</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> datetime </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> datetime</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">&nbsp;datetime_encoder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">obj</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	if</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">&nbsp;isinstance</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(obj,&nbsp;datetime):  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">		return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;obj.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">isoformat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()  </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	raise</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF">&nbsp;TypeError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Type not serializable"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">data&nbsp;</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;{</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'time'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:&nbsp;datetime.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">now</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()}  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dumps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(data,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">default</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">datetime_encoder)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
</ol>
<p>AI写代码- <strong>循环引用检测</strong></p>
<pre><code>- 默认情况下json不处理循环引用
- 需要自行解决循环引用问题或使用第三方库
</code></pre>
<h3>六、最佳实践</h3>
<ol>
<li>
<p>始终处理异常：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    data </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">loads</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(json_str)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> json.JSONDecodeError </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> e:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Invalid JSON: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">e</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li>
<li>
<p>对于敏感数据，考虑使用<code>json.dumps()</code>的<code>separators</code>参数压缩JSON大小：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">json.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dumps</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(data, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">separators</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">','</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">':'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">))</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p>大型文件处理时，考虑使用<code>ijson</code>库进行流式解析</p>
</li>
</ol>
<h3>七、总结</h3>
<p>Python的json模块是处理JSON数据的利器，掌握它可以：</p>
<ul>
<li>轻松实现前后端数据交互</li>
<li>高效管理配置文件</li>
<li>处理各种数据交换场景</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Python Pandas库</title>
      <link>https://ujava.cn/python/pandas.html</link>
      <guid>https://ujava.cn/python/pandas.html</guid>
      <source url="https://ujava.cn/rss.xml">Python Pandas库</source>
      <description>对象的创建 导入 Pandas 时，通常给其一个别名“pd”，即 import pandas as pd。 作为标签库，Pandas 对象在 NumPy 数组基础上给予其行列标签。可以说，列表之于字典，就如 NumPy 之于 Pandas。 Pandas 中，所有数组特性仍在，Pandas 的数据以 NumPy 数组的方式存储。 一维对象的创建 字典创...</description>
      <category>设计Python</category>
      <pubDate>Wed, 07 May 2025 06:37:06 GMT</pubDate>
      <content:encoded><![CDATA[<h2>对象的创建</h2>
<ul>
<li>导入 Pandas 时，通常给其一个别名“pd”，即 import pandas as pd。</li>
<li>作为标签库，Pandas 对象在 NumPy 数组基础上给予其行列标签。可以说，列表之于字典，就如 NumPy 之于 Pandas。</li>
<li>Pandas 中，所有数组特性仍在，Pandas 的数据以 NumPy 数组的方式存储。</li>
</ul>
<h3>一维对象的创建</h3>
<ol>
<li>字典创建法<br>
NumPy 中，可以通过 np.array()函数，将 Python 列表转化为 NumPy 数组；同样，Pandas 中，可以通过 pd.Series()函数，将 Python 字典转化为 Series 对象。</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建字典</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">dict_v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.25</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'d'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.75</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'e'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> }</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用字典创建对象</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( dict_v )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:a    0.00</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    b    0.25</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    c    0.50</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    d    0.75</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    e    1.00</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    dtype: float64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li>数组创建法<br>
最直接的创建方法即直接给 pd.Series()函数参数，其需要两个参数。第一个参数是值 values（列表、数组、张量均可），第二个参数是键 index（索引）。</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 先定义键与值</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.25</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.75</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'d'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'e'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 用列表创建对象</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:a    0.00</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    b    0.25</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    c    0.50</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    d    0.75</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    e    1.00</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    dtype: float64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>其中，参数 index 可以省略，省略后索引即从 0 开始的顺序数字。</p>
<h3>一维对象的属性</h3>
<p>Series 对象有两个属性：values 与 index。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> numpy </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> np</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用数组创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> np.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">array</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    4 号    82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    dtype: int32</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 查看 values 属性</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.values               </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:array([53, 64, 72, 82])</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 查看 index 属性</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.index               </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:Index(['1 号', '2 号', '3 号', '4 号'], dtype='object')</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>事实上，无论是用列表、数组还是张量来创建对象，最终 values 均为数组。虽然 Pandas 对象的第一个参数 values 可以传入列表、数组与张量，但传进去后默认的存储方式是&nbsp;<a href="https://so.csdn.net/so/search?q=NumPy&amp;spm=1001.2101.3001.7020" target="_blank" rel="noopener noreferrer">NumPy</a>&nbsp;数组。这一点更加提醒我们，Pandas 是建立在 NumPy 基础上的库，没有 NumPy 数组库就没有 Pandas 数据处理库。当想要 Pandas 退化为 NumPy 时，查看其 values 属性即可。</p>
<h3>二维对象的创建</h3>
<p>二维对象将面向矩阵，其不仅有行标签 index，还有列标签 columns。</p>
<ol>
<li>字典创建法<br>
用字典法创建二维对象时，必须基于多个 Series 对象，每一个 Series 就是一列数据，相当于对一列一列的数据作拼接。</li>
</ol>
<ul>
<li>创建 Series 对象时，字典的键是 index，其延展方向是竖直方向；</li>
<li>创建 DataFrame 对象时，字典的键是 columns，其延展方向是水平方向。</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr1：各个病人的年龄</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1                     </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    4 号    82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    dtype: int32</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 创建 sr2：各个病人的性别</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2                     </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    2 号    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    3 号    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    4 号    女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    dtype: object</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 df 对象</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( { </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr1, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr2 } )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	   年龄  性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    1 号	53	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    2 号	64	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    3 号	72	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    4 号	82	  女</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果 sr1 和 sr2 的 index 不完全一致，那么二维对象的 index 会取 sr1 与 sr2的所有 index，相应的，该对象就会产生一定数量的缺失值（NaN）。<br>
2. 数组创建法<br>
最直接的创建方法即直接给 pd.DataFrame 函数参数，其需要三个参数。第一个参数是值 values（数组），第二个参数是行标签 index，第三个参数是列标签columns。其中，index 和 columns 参数可以省略，省略后即从 0 开始的顺序数字。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> numpy </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> np</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 设定键值</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> np.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">array</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 数组创建法</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	   年龄  性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    1 号	53	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    2 号	64	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    3 号	72	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    4 号	82	  女</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>上述 NumPy 数组居然又含数字又含字符串，上一篇博文中明明讲过数组只能容纳一种变量类型。这里的原理是，数组默默把数字转为了字符串，于是 v 就是一个字符串型数组。</p>
<h3>二维对象的属性</h3>
<p>DataFrame 对象有三个属性：values、index 与 columns。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 设定键值</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 数组创建法</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	   年龄  性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    1 号	53	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    2 号	64	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    3 号	72	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #    4 号	82	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 查看 values 属性 # 查看 index 属性</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.index                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:array([[53, '女'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #           [64, '男'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #           [72, '男'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        #           [82, '女']], dtype=object)</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 查看 index 属性</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.index                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:Index(['1 号', '2 号', '3 号', '4 号'], dtype='object')</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 查看 columns 属性</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.columns              </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:Index(['年龄', '性别'], dtype='object')</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>当想要 Pandas 退化为 NumPy 时，查看其 values 属性即可。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 提取完整的数组</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df.values</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr)                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:[['53' '女']</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #     ['64' '男']</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #     ['72' '男']</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #     ['82' '女']]</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 提取第[0]列，并转化为一个整数型数组</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr[:,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">].</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">astype</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr)                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:[53 64 72 82]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>由于数组只能容纳一种变量类型，因此需要 .astype(int) 的操作。但对象不用，对象每一列的存储方式是单独的，这就很好的兼容了大数据的特性。</p>
<h2>对象的索引</h2>
<p>在学习 Pandas 的索引之前，需要知道</p>
<ul>
<li>Pandas 的索引分为显式索引与隐式索引。显式索引是使用 Pandas 对象提供的索引，而隐式索引是使用数组本身自带的从 0 开始的索引。</li>
<li>现假设某演示代码中的索引是整数，这个时候显式索引和隐式索引可能会出乱子。于是，Pandas 作者发明了索引器 loc（显式）与 iloc（隐式），手动告诉程序自己这句话是显式索引还是隐式索引。</li>
</ul>
<h3>一维对象的索引</h3>
<ol>
<li>访问元素</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号    82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 访问元素</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.loc[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]          </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:72    显示索引</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.iloc[ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]              </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:72    隐式索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 花式索引</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.loc[ [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] ]  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53    显示索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.iloc[ [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] ]          </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53    隐式索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 修改元素</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.loc[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                           </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号     53    显示索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    2 号     64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    3 号    100</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    4 号     82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 修改元素</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.iloc[ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                           </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号     53    隐式索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    2 号     64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    3 号    100</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    4 号     82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                             #    dtype: int64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li>访问切片<br>
使用显式索引时，‘1 号’:‘3 号’ 可以涵盖最后一个’3 号’，但隐式与之前一样。</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号    82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 访问切片</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.loc[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]   </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 1 号    53    显示索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.iloc[ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]            </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53    隐式索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 切片仅是视图</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr.loc[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut.loc[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 1 号    53    显示索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr.iloc[ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut.iloc[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53    隐式索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 对象赋值仅是绑定</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut.loc[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 200</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    100    显示索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号     64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    200</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号     82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">cut.iloc[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 200</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    100    隐式索引</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号     64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号    200</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号     82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    dtype: int64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>若想创建新变量，与 NumPy 一样，使用.copy()方法即可。如果去掉 .loc 和 .iloc ，此时与 NumPy 中的索引语法完全一致。</p>
<h3>二维对象的索引</h3>
<p>在二维对象中，索引器不能去掉，否则会报错，因此必须适应索引器的存在。</p>
<ol>
<li>访问元素：</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 字典创建法</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( { </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr1, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr2 } )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #        年龄  性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    1 号	53	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号	64    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号	72	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号	82	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 访问元素</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.loc[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]   </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:53</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.iloc[ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]           </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 花式索引</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.loc[ [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] , [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]   </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	性别    年龄</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                          #    1 号  女	    53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                          #    3 号	 男	    72</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.iloc[ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]                      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	性别    年龄</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                          #    1 号  女	    53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                          #    3 号	 男	    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 修改元素</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.loc[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #        年龄  性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    1 号	53	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号	64    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号	100	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号	82	  女</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.iloc[ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #        年龄  性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    1 号	53	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号	64    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号	100	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号	82	  女</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在 NumPy 数组中，花式索引输出的是一个向量。但在 Pandas 对象中，考虑到其行列标签的信息不能丢失，所以输出一个向量就不行了。<br>
2. 访问切片</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 数组创建法</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #        年龄  性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    1 号	53	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    2 号	64    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    3 号	72	  男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                          #    4 号	82	  女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 切片</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.loc[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> , </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:  1 号  53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                 #      2 号  64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                 #      3 号  72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                 #      Name: 年龄, dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.iloc[ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> , </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]               </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:  1 号  53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                 #      2 号  64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                 #      3 号  72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                                 #      Name: 年龄, dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 提取二维对象的行  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.loc[&nbsp;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;,&nbsp;:&nbsp;]&nbsp;[</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT](app://obsidian.md/index.html#OUT): 年龄 72  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 性别 男  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># Name: 3 号, dtype: object  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.iloc[&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;,&nbsp;:&nbsp;]&nbsp;[</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT](app://obsidian.md/index.html#OUT): 年龄 72  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 性别 男  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># Name: 3 号, dtype: object  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 提取矩阵对象的列  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.loc[&nbsp;:&nbsp;,&nbsp;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;]&nbsp;[</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT](app://obsidian.md/index.html#OUT): 1 号 53  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 2 号 64  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 3 号 72  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 4 号 82  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># Name: 年龄, dtype: int64  </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.iloc[&nbsp;:&nbsp;,&nbsp;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&nbsp;]&nbsp;[</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT](app://obsidian.md/index.html#OUT): 1 号 53  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 2 号 64  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 3 号 72  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 4 号 82  </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># Name: 年龄, dtype: int64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在显示索引中，提取矩阵的行或列还有一种简便写法，即</p>
<ul>
<li>提取二维对象的行：df.loc[ ‘3 号’]（原理是省略后面的冒号，隐式也可以）</li>
<li>提取二维对象的列：df [‘年龄’ ]（原理是列标签本身就是二维对象的键）</li>
</ul>
<h2>对象的变形</h2>
<h3>对象的转置</h3>
<p>有时候提供的大数据很畸形，行是特征，列是个体，这必须要先进行转置。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建畸形 df</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	1 号	2 号	3 号	4 号</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #年龄  53      64      72      82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #性别  女      男       男      女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 转置</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df.T</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #          年龄   性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #1 号       53	女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #2 号	      64	男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #3 号	      72	男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #4 号	      82	女</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>对象的翻转</h3>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 左右翻转</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df.iloc[ : , : : </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #       性别   年龄   </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #1 号    女     53	</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #2 号	   男     64	</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #3 号	   男     72	</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #4 号	   女     82	</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 上下翻转</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df.iloc[ : : </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> , : ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #       性别   年龄   </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #4 号	   女     82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #3 号	   男     72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #2 号	   男     64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #1 号    女     53</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>对象的重塑</h3>
<p>考虑到对象是含有行列标签的，.reshape()已不再适用，因此对象的重塑没有那么灵活。但可以做到将 sr 并入 df，也可以将 df 割出 sr。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 数组法创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">40</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v3 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr3 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v3, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1, sr2, sr3        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:(1 号 10 1 号 女 1 号 1</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     #OUT:2 号 20 2 号 男 2 号 2</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     #OUT:3 号 30 3 号 男 3 号 3</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     #OUT:4 号 40 4 号 女 4 号 4</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     #OUT:dtype: int64, dtype: object, dtype: int64)</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 字典法创建 df</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( { </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr1, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr2 } )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                            年龄     性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #1 号	10       女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #2 号 20       男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #3 号 30       男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #4 号 40       女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 把 sr 并入 df 中</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr3</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	年龄   性别   牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #1 号  10    女      1</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #2 号  20    男      2</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #3 号  30    男      3</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #4 号  40    女      4</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 把 df['年龄']分离成 sr4</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr4 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr4                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    10</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #2 号    20</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #3 号    30</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #4 号    40</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      #Name: 年龄, dtype: int64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>对象的拼接</h3>
<p>Pandas 中有一个 pd.concat()函数，与 np.concatenate()函数语法相似。</p>
<ol>
<li>一维对象的合并</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 创建 sr1 和 sr2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">40</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">40</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">50</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">60</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'5 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'6 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> k1 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> k2 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1, sr2                    </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:(1 号    10</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     2 号    20</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     3 号    30</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     4 号    40</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     dtype: int64,</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     4 号    40</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     5 号    50</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     6 号    60</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     dtype: int64)</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 合并</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">concat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( [sr1, sr2] )     </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    10</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     2 号    20</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     3 号    30</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     4 号    40</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     4 号    40</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     5 号    50</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     6 号    60</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #     dtype: int64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>值得注意的是，上述出现了两个“4 号”，这是因为 Pandas 对象的属性，放弃了集合与字典索引中“不可重复”的特性，实际中，这可以拓展大数据分析与处理的应用场景。那么，如何保证索引是不重复的呢？对对象的属性 .index 或 .columns 使用 .is_unique 即可检查，返回 True表示行或列不重复，False 表示有重复</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr3 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">concat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( [sr1, sr2] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr3.index.is_unique        </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:False</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li>一维对象与二维对象的合并<br>
一维对象与二维对象的合并，即可理解为：给二维对象加上一列或者一行。因此，不必使用 pd.concat()函数，只需要借助 2.2 小节“二维对象的索引”语法。</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr1 与 sr2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1, sr2            </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:(1 号    10</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                    #     2 号    20</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                    #      3 号    30</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                    #      dtype: int64,</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                    #      1 号    女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                    #      2 号    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                    #      3 号    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                    #      dtype: object)</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 df</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( { </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr1, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:sr2 } )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                 </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #     年龄     性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号  10       女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号  20       男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号  30       男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 加上一列</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                 </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #     年龄	性别     牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号  10     女       1</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号  20     男       2</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号  30     男       3</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 加上一行</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.loc[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">40</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                 </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #     年龄   性别   牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号  10     女     1</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号  20     男     2</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号  30     男     3</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #4 号  40     女     4</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="3">
<li>二维对象的合并<br>
二维对象合并仍然用 pd.concat()函数，不过其多了一个 axis 参数。</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 设定 df1、df2、df3</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">40</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'否'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v3 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">50</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">60</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i3 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'5 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'6 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'ikun'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c3 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'ikun'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c1 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c2 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df3 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v3, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i3, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c3 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #     年龄   性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号  10     女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号  20     男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号  30     男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #4 号  40     女</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df2                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #     牌照   ikun</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号  1      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号  2      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号  3      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #4 号  4      否</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df3                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #     年龄   性别   牌照   ikun</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #5 号  50    男     5      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #6 号  60    女     6      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 合并列对象（添加列特征）</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">concat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( [df1,df2], </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">axis</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	年龄   性别   牌照   ikun</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号	10     女     1      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号	20     男     2      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号	30     男     3      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号	40     女     4      否</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 合并行对象（添加行个体）</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">concat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( [df,df3] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #     年龄   性别   牌照   ikun</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号  10	   女     1      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号  20	   男     2      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号  30	   男     3      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号  40	   女     4      否</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #5 号  50	   男     5      是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #6 号  60	   女     6      是</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>对象的运算</h2>
<h3>对象与系数之间的运算</h3>
<ol>
<li>一维对象</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] , </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    53</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    2 号    64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    3 号    72</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    63</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    2 号    74</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    3 号    82</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">*</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    630</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    2 号    740</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    3 号    820</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号    396900</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    2 号    547600</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    3 号    672400</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #    dtype: int64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li>二维对象</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 df</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ], </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	年龄   性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号  53     女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号  64     男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号  72     男</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	年龄   性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号  63     女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号  74     男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号  82     男</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">*</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	 年龄    性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号  630     女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号  740     男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号  820     男</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	 年龄     性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号 396900     女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 547600     男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 672400     男</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>对象与对象之间的运算</h3>
<p>对象做运算，必须保证其都是数字型对象，两个对象之间的维度可以不同。</p>
<ol>
<li>一维对象之间的运算</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 创建 sr1</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">40</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> k1 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号   10</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    2 号   20</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    3 号   30</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    4 号   40</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> k2 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr2                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 1 号   1</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    2 号   2</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    3 号   3</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    dtype: int64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr2          </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号   11.0   加法</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    2 号   22.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    3 号   33.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    4 号   NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr2          </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号   9.0   减法</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    2 号   18.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    3 号   27.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    4 号   NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr2          </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号   10.0   乘法</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    2 号   40.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    3 号   90.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    4 号   NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">/</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr2          </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号   10.0   乘法</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    2 号   10.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    3 号   10.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    4 号   NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> sr2         </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号   10.0   乘法</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    2 号   400.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    3 号   27000.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    4 号   NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    dtype: float64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li>二维对象之间的运算</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 设定 df1 和 df2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'男'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">40</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'女'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]; c1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'6 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]; c2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i1, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c1 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df2 </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i2, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c2 )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #    年龄   性别</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号 10    女</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号 20    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号 30    男</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #4 号 40    女</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df2                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #       牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号    1</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号    2</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号    3</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #6 号    6</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 加法</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'加法'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df2[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #       年龄   性别   加法</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号    10    女    11.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号    20    男    22.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号    30    男    33.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #4 号    40    女    NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 减法、乘法、除法、幂方</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'减法'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df2[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'乘法'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df2[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'除法'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">/</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df2[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'幂方'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df1[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">**</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df2[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df1                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #       年龄   性别   加法   减法   乘法   除法   幂方</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #1 号	10    女	11.0   9.0	10.0	10.0	10.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #2 号	20    男	22.0   18.0	40.0	10.0	400.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #3 号	30    男	33.0   27.0	90.0	10.0	27000.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   #4 号	40    女	NaN    NaN	NaN  	NaN	     NaN</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>使用 np.abs()、np.cos()、np.exp()、np.log() 等数学函数时，会保留索引；</li>
<li>Pandas 中仍然存在布尔型对象，用法与 NumPy 无异，会保留索引。</li>
</ul>
<h2>对象的缺失值</h2>
<h3>发现缺失值</h3>
<p>发现缺失值使用 .isnull() 方法。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 df</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 年龄    牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号 NaN     1.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 64.0    NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0    3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0    4.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 发现 sr 的缺失值</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">isnull</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()       </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:  1 号   False</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #      2 号   True</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #      3 号   False</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #      4 号   False</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #      dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">isnull</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()       </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 年龄    牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号 True    False</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 False    True</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 False    False</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 False    False</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>除了.isnull() 方法，还有一个与之相反的 .notnull() 方法，但不如在开头加一个非号“~”即可。</p>
<h3>剔除缺失值</h3>
<p>剔除缺失值使用 .dropna() 方法，一维对象很好剔除；二维对象比较复杂，要么单独剔除 df 中含有缺失值的行，要么剔除 df 中含有缺失值的列。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">k )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 剔除 sr 的缺失值</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dropna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()       </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> # 创建 df</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 年龄    牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号 NaN     NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 64.0    NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0    3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0    4.0</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dropna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()       </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 年龄    牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0    3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0    4.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>把含有 NaN 的行剔除掉了，你也可以通过 df.dropna(axis=‘columns’)的方式剔除列。但请警惕，一般都是剔除行，只因大数据中行是个体，列是特征。<br>
有些同学认为，只要某行含有一个 NaN 就剔除该个体太过残忍，我们可以设定一个参数，只有当该行全部是 NaN，才剔除该列特征。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">dropna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">how</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'all'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)       </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT: 年龄    牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                           #2 号 64.0    NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                           #3 号 72.0    3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                           #4 号 82.0    4.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>ps:也可以设置缺失值大于几行时剔除。</p>
<h3>填补缺失值</h3>
<p>填充缺失值使用 .fillna() 方法，实际的数据填充没有统一的方法，很灵活。</p>
<ol>
<li>一维对象</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 创建 sr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">53</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ] </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Series</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用常数（0）填充</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 0.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用常数（均值）填充</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> numpy </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> np</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(np.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">mean</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(sr))      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #2 号 69.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用前值填充</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">method</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'ffill'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)   </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #2 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #dtype: float64</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用后值填充</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">sr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">method</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'bfill'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)   </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:1 号 53.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #2 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #3 号 72.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #4 号 82.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                            #dtype: float64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="2">
<li>二维对象</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 设定 df</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">v </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">64</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">82</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'1 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'2 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'3 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'4 号'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]; c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'牌照'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">DataFrame</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( v, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">c )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df                </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #     年龄    牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号 NaN    NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 64.0   NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0   3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0   4.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用常数（0）填充</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)      </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #     年龄    牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #1 号 0.0    0.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #2 号 64.0   0.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #3 号 72.0   3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  #4 号 82.0   4.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用常数（均值）填充</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> numpy </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> np</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( np.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">mean</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(df))</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                       #     年龄   牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                       #1 号 72.69  3.5</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                       #2 号 64.0   3.5</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                       #3 号 72.0   3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                       #4 号 82.0   4.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用前值填充</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">method</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'ffill'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #     年龄   牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #1 号 NaN    NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #2 号 64.0   NaN</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #3 号 72.0   3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #4 号 82.0   4.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 用后值填充</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fillna</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">method</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'bfill'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #     年龄   牌照</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #1 号 64.0   3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #2 号 64.0   3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #3 号 72.0   3.0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         #4 号 82.0   4.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>导入Excel文件</h2>
<h3>创建Excel文件</h3>
<p>首先，创建 Excel 文件，录入信息，第一列为 index，第一行为 columns。（字体选择微软雅黑即可）<br>
<br>
如果你的数据没有 index 和 columns，也即你只是想导入一个数组，那么也请先补上行列标签，后续用 .values 属性就能将二维对象转换为数组。<br>
接着，将其另存为为 CSV 文件（在另存为的弹窗里面的保存类型选择.csv ）。</p>
<h3>放入项目文件夹</h3>
<p>将刚刚另存为的 CSV 文件放置工程文件下（不一定是默认路径）。</p>
<h3>导入Excel信息</h3>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 导入 Pandas 对象</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">read_csv</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'Data.csv'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index_col</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df           </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:	</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #    age   Mgender   num   kun</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #1号 10.0    女       1     是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #2号 20.0    男       2     是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #3号 30.0    男       3     是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #4号 40.0    女       4     否</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #5号 50.0    男       5     是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #6号 60.0    女       6     是</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 提取纯数组</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> df.values</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">arr          </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">#OUT:array([[10.0, '女', 1, '是'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #           [20.0, '男', 2, '是'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #           [30.0, '男', 3, '是'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #           [40.0, '女', 4, '否'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #           [50.0, '男', 5, '是'],</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">             #           [60.0, '女', 6, '是']], dtype=object)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>数据分析</h2>
<h3>导入信息</h3>
<p>按上一章内容导入信息</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 导入 Pandas 对象</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">read_csv</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'行星数据.csv'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index_col</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">encoding</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'gbk'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><figcaption>img_4.png</figcaption></figure>
<h3>聚合方法</h3>
<p>可在输出 df 时，对其使用 .head() 方法，使其仅输出前五行。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">read_csv</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'行星数据.csv'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index_col</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">encoding</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'gbk'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p><br>
NumPy 中所有的聚合函数对 Pandas 对象均适用。此外，Pandas 将这些函数变为对象的方法，这样，不导入 NumPy 也可使用。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 最大值函数 np.max( )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">max</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 最小值函数 np.min( )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">min</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 均值函数 np.mean( )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">mean</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 标准差函数 np.std( )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">std</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 求和函数 np.sum( )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">sum</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><br>
在这些方法中，像 NumPy 中一样，有默认值为 0 的参数 axis。一般不要将其数值手动设定为 1，因为这种情况在数据分析中毫无意义。此外，这些方法都忽略了缺失值，属于 NumPy 中聚合函数的安全版本。</p>
<h3>描述方法</h3>
<p>在数据分析中，用以上方法挨个查看未免太过麻烦，可以使用 .describe() 方法直接查看所有聚合函数的信息。<br>
</p>
<ul>
<li>第 1 行 count 是计数项，统计每个特征的有效数量（即排除缺失值），从 count可以看出，行星质量的缺失值比较多，需要考虑一定的办法填充或舍弃。</li>
<li>第 2 行至第 3 行的 mean 与 std 统计每列特征的均值与标准差。</li>
<li>第 4 行至第 8 行的 min、25%、50%、75%、max 的意思是五个分位点，即把数组从小到大排序后，0%、25%、50%、75%、100%五个位置上的数值的取值。显然，50%分位点即中位数。</li>
</ul>
<h3>数据透视</h3>
<ol>
<li>两个特征内的数据透视<br>
数据透视，对数据分析来讲十分重要。<br>
现以泰坦尼克号的生还数据为例，以“是否生还”特征为考察的核心（或者说是神经网络的输出），研究其它特征（输入）与之的关系，如示例所示。</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pandas </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 导入 Pandas 对象</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">read_csv</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'泰坦尼克.csv'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index_col</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 一个特征：性别</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">pivot_table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是否生还'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 两个特征：性别、船舱等级</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">pivot_table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是否生还'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'船舱等级'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><figcaption>img_8.png</figcaption></figure>
<figure><figcaption>img_9.png</figcaption></figure>
<ul>
<li>在上述示例中，数据透视表中的数值默认是输出特征“是否生还”的均值（mean），行标签和列标签变成了其它的输入特征。</li>
<li>值得注意的是，pivot_table() 方法有一个很重要的参数：aggfunc，其默认值是’mean’，除此以外，所有的聚合函数 ‘max’、‘min’、‘sum’、‘count’ 均可使用。显然，对于这里的“是否生还”来说，'mean’就是最好的选择，其刚好为概率</li>
</ul>
<ol start="2">
<li>多个特征的数据透视<br>
前面的示例只涉及到两个特征，有时需要考察更多特征与输出特征的关系。<br>
这里，将年龄和费用都加进去。但是，这两个特征的数值很分散，之前的性别和船舱等级都可以按照类别分，现在已经不能再按类别分了。因此，需要涉及到数据透视表配套的两个重要函数：pd.cut()与 pd.qcut()</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 三个特征：性别、船舱等级、年龄</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">age </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">cut</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'年龄'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">18</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">120</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] ) </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 以 18 岁为分水岭</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">pivot_table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是否生还'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, age], </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'船舱等级'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><figcaption>img_10.png</figcaption></figure>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 四个特征：性别、船舱等级、年龄、费用</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">fare </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pd.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">qcut</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">( df[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'费用'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ) </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 将费用自动分为两部分</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">df.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">pivot_table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'是否生还'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'船舱等级'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,fare], </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">columns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'性别'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, age])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><figcaption>img_11.png</figcaption></figure>
<ul>
<li>pd.cut()函数需要手动设置分割点，也可以设置为[0,18,60,120]。</li>
<li>pd.qcut()函数可自动分割，如果需要分割成 3 部分，可以设置为 3。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>大模型基础</title>
      <link>https://ujava.cn/model/base.html</link>
      <guid>https://ujava.cn/model/base.html</guid>
      <source url="https://ujava.cn/rss.xml">大模型基础</source>
      <description>模型架构与基础概念 1. LLM（大语言模型, Large Language Model）： 基于海量文本数据训练的[深度学习模型]，如GPT系列、BERT等，能够理解和生成自然语言文本，能够进行复杂对话、文本创作等任务。 2. AGI（通用人工智能, Artificial General Intelligence）： 这是AI研究的理想目标，追求创造...</description>
      <category>设计模型</category>
      <pubDate>Wed, 07 May 2025 03:57:02 GMT</pubDate>
      <content:encoded><![CDATA[<h3><strong>模型架构与基础概念</strong></h3>
<p><strong>1. LLM（大语言模型, Large Language Model）：</strong>&nbsp;基于海量文本数据训练的[深度学习模型]，如GPT系列、BERT等，能够理解和生成自然语言文本，能够进行复杂对话、文本创作等任务。</p>
<p><strong>2. AGI（通用人工智能, Artificial General Intelligence）：</strong>&nbsp;这是AI研究的理想目标，追求创造能像人类一样学习新技能、解决广泛问题的智能体，目前仍处于理论探索和初步实践阶段。</p>
<p><strong>3. AIGC (人工智能生成内容):</strong>&nbsp;利用AI技术生成的各种内容，从文本、图像到视频，利用算法创造新颖、个性化的内容，如AI艺术画作或定制文章。</p>
<p><strong>4. Prompt（提示词）：</strong>&nbsp;在AI大模型中用于引导模型生成特定类型输出的上下文信息或指令，例如，告诉模型“写一篇科幻故事”。</p>
<p><strong>5. 提示工程（Prompt Engineering）：</strong>&nbsp;设计和优化输入提示以获得所需模型输出的过程，涉及精心设计输入提示，以优化模型输出的准确性、创意或特定风格，是提高AI大模型响应质量的关键策略。</p>
<p><strong>6. 多模态（Multimodal）：</strong>&nbsp;文本、图像、音频等都是一种模态，多模态指能够处理文本、图像、音频等多种类型数据的模型，实现对多模态信息的综合理解和分析。</p>
<p><strong>7. 推理（Inference）：</strong>&nbsp;大模型的推理（Inference）是指使用已经训练好的模型进行实际应用，生成预测或输出结果的过程。例如：大模型根据问题生成答案，根据文本描述生成图片等。</p>
<p><strong>8. 涌现（Emergence）：</strong>&nbsp;指的是系统中新的性质、模式或行为在更简单的组件相互作用下自发形成的现象。</p>
<p><strong>9. 对齐：</strong>&nbsp;AI价值对齐是指让大模型的能力和行为跟人类的价值、真实意图和伦理原则相一致，确保人类与人工智能协作过程中的安全与信任。</p>
<p><strong>10. Token：</strong>&nbsp;通常指的是文本或数据中的一个基本单元或符号，在自然语言处理中，单词是最常见的 token。例如，“你好，世界！”会被分解为“你”、“好”、“，”、“世界”和“！”这样的token，便于机器理解和处理。</p>
<p><strong>11. 智能体（Agent）：</strong>&nbsp;在环境中感知、思考并采取行动的自主AI系统。参见：AI智能体的6种形态</p>
<p><strong>12. 世界模型：</strong>&nbsp;指AI系统内部构建的对现实世界的抽象认知模型，用于预测、规划和决策，是实现高级人工智能的关键组成部分。</p>
<p><strong>13. Scaling Law：</strong>&nbsp;指的是在机器学习中，模型性能随其规模增大（如参数数量、数据量）而提高的现象，是指导模型设计和资源分配的重要原则。</p>
<p><strong>14. 大模型幻觉：</strong>&nbsp;幻觉是指大型[语言模型]生成的内容看似合理但实际上不准确或虚构的信息。原因是尽管模型可以生成符合语言结构的文本，但它们并不具备真正的理解能力，只是基于概率生成下一个词语。</p>
<p><strong>15. Copilot：</strong>&nbsp;AI辅助工具的代名词，例如Github Copilot能够辅助程序员编程，Office Copilot能够辅助编写文档、制作PPT等。</p>
<p><strong>16. 具身智能：</strong>&nbsp;拥有物理实体的智能体（如机器人），通过与环境的互动学习和适应，实现更接近生物体的智能表现。</p>
<h3>大模型面试题</h3>
<ol>
<li>
<p>目前 主流的开源模型体系 有哪些？</p>
</li>
<li>
<p>prefix LM 和 causal LM 区别是什么？</p>
</li>
<li>
<p>涌现能力是啥原因？</p>
</li>
<li>
<p>大模型LLM的架构介绍？大模型（LLMs）进阶面</p>
</li>
<li>
<p>llama 输入句子长度理论上可以无限长吗？</p>
</li>
<li>
<p>什么是 LLMs 复读机问题？</p>
</li>
<li>
<p>为什么会出现 LLMs 复读机问题？</p>
</li>
<li>
<p>如何缓解 LLMs 复读机问题？</p>
</li>
<li>
<p>LLMs 复读机问题</p>
</li>
<li>
<p>llama 系列问题</p>
</li>
<li>
<p>什么情况用Bert模型，什么情况用LLaMA、ChatGLM类大模型，咋选？</p>
</li>
<li>
<p>各个专业领域是否需要各自的大模型来服务？</p>
</li>
<li>
<p>如何让大模型处理更长的文本？大模型（LLMs）微调面</p>
</li>
<li>
<p>如果想要在某个模型基础上做全参数微调，究竟需要多少显存？</p>
</li>
<li>
<p>为什么SFT之后感觉LLM傻了?</p>
</li>
<li>
<p>SFT 指令微调数据 如何构建?</p>
</li>
<li>
<p>领域模型Continue PreTrain 数据选取？</p>
</li>
<li>
<p>领域数据训练后，通用能力往往会有所下降，如何缓解模型遗忘通用能力？</p>
</li>
<li>
<p>领域模型Continue PreTrain ，如何 让模型在预训练过程中就学习到更多的知识？</p>
</li>
<li>
<p>进行SFT操作的时候，基座模型选用Chat还是Base?</p>
</li>
<li>
<p>领域模型微调 指令&amp;数据输入格式 要求？</p>
</li>
<li>
<p>领域模型微调 领域评测集 构建？</p>
</li>
<li>
<p>领域模型词表扩增是不是有必要的？</p>
</li>
<li>
<p>如何训练自己的大模型？</p>
</li>
<li>
<p>训练中文大模型有啥经验？</p>
</li>
<li>
<p>指令微调的好处？</p>
</li>
<li>
<p>预训练和微调哪个阶段注入知识的？</p>
</li>
<li>
<p>想让模型学习某个领域或行业的知识，是应该预训练还是应该微调？</p>
</li>
<li>
<p>多轮对话任务如何微调模型？</p>
</li>
<li>
<p>微调后的模型出现能力劣化，灾难性遗忘是怎么回事？</p>
</li>
<li>
<p>微调模型需要多大显存？</p>
</li>
<li>
<p>大模型LLM进行SFT操作的时候在学习什么？</p>
</li>
<li>
<p>预训练和SFT操作有什么不同</p>
</li>
<li>
<p>样本量规模增大，训练出现OOM错</p>
</li>
<li>
<p>大模型LLM进行SFT 如何对样本进行优化？</p>
</li>
<li>
<p>模型参数迭代实验 大模型（LLMs）langchain面</p>
</li>
<li>
<p>基于LLM+向量库的文档对话 基础面</p>
</li>
<li>
<p>基于LLM+向量库的文档对话 优化面</p>
</li>
<li>
<p>基于LLM+向量库的文档对话 工程示例面</p>
</li>
<li>
<p>LLMs 存在模型幻觉问题，请问如何处理？</p>
</li>
<li>
<p>基于LLM+向量库的文档对话 思路是怎么样？</p>
</li>
<li>
<p>基于LLM+向量库的文档对话 核心技术是什么？</p>
</li>
<li>
<p>基于LLM+向量库的文档对话 prompt 模板 如何构建？</p>
</li>
<li>
<p>痛点1：文档切分粒度不好把控，既担心噪声太多又担心语义信息丢失</p>
</li>
<li>
<p>痛点2：在基于垂直领域 表现不佳</p>
</li>
<li>
<p>痛点3：langchain 内置 问答分句效果不佳问题</p>
</li>
<li>
<p>痛点4：如何 尽可能召回与query相关的Document 问题</p>
</li>
<li>
<p>痛点5：如何让LLM基于query和context得到高质量的response</p>
</li>
<li>
<p>避坑记录</p>
</li>
<li>
<p>本地知识库问答系统（Langchain-chatGLM）</p>
</li>
<li>
<p>什么是 LangChain?</p>
</li>
<li>
<p>LangChain 包含哪些 核心概念？</p>
</li>
<li>
<p>什么是 LangChain Agent?</p>
</li>
<li>
<p>如何使用 LangChain ?</p>
</li>
<li>
<p>LangChain 支持哪些功能?</p>
</li>
<li>
<p>什么是 LangChain model?</p>
</li>
<li>
<p>LangChain 包含哪些特点?</p>
</li>
<li>
<p>LangChain 如何使用?</p>
</li>
<li>
<p>LangChain 存在哪些问题及方法方案？</p>
</li>
<li>
<p>LoRA权重是否可以合入原模型？</p>
</li>
<li>
<p>ChatGLM-6B LoRA后的权重多大？</p>
</li>
<li>
<p>LoRA 微调优点是什么？</p>
</li>
<li>
<p>LoRA微调方法为啥能加速训练？</p>
</li>
<li>
<p>如何在已有LoRA模型上继续训练？</p>
</li>
<li>
<p>微调方法批处理大小模式GPU显存速度？</p>
</li>
<li>
<p>Peft 和 全量微调区别？</p>
</li>
<li>
<p>多种不同的高效微调方法对比</p>
</li>
<li>
<p>当前高效微调技术存在的一些问题</p>
</li>
<li>
<p>高效微调技术最佳实践</p>
</li>
<li>
<p>PEFT 存在问题？</p>
</li>
<li>
<p>能不能总结一下各种参数高效微调方法？</p>
</li>
</ol>
<h3><strong>训练方法与技术</strong></h3>
<p><strong>训练数据集：</strong>&nbsp;大模型训练所需的大规模数据集，包含了各种语言样本，用于模型的学习、验证和测试其性能。它不仅支持模型的基础学习过程，还通过验证和测试集来评估和优化模型的表现。</p>
<p>Deepseek通俗版解释：训练数据集就像是一本“学习秘籍”。比如说你想让一个机器学会识别猫和狗的照片。那这个训练数据集里就会装满各种各样猫和狗的照片。这些照片就是用来教机器怎么分辨猫和狗的特征的。</p>
<p><strong>参数量</strong>：模型中可调节的数值，用于调整神经网络的行为。</p>
<p><strong>深度学习：一种基于多层神经网络的机器学习方法，特别适合处理大规模数据。深度学习不仅仅适用于大规模数据处理，它还特别擅长自动提取数据中的复杂特征，减少了手工设计特征的需求。</strong></p>
<p><strong>预训练（Pre-training）</strong>：在大规模无标注数据上训练模型，学习通用的语言规律。</p>
<p><strong>微调（Fine-tuning）</strong>：在预训练模型基础上，用特定领域的小规模数据进一步训练。</p>
<p><strong>监督微调（Supervised Fine-Tuning，SFT）</strong>：使用标注好的数据集对模型进行进一步训练，使其在特定任务上表现更好。</p>
<p><strong>少样本学习（Few-shot Learning）</strong>：在只有少量标注数据的情况下训练模型，使其能够快速适应新任务。</p>
<p><strong>超参数调优（Hyperparameter Tuning）</strong>：对模型的超参数进行优化，以提高模型性能。</p>
<p><strong>对抗训练（Adversarial Training）</strong>：通过生成对抗样本来训练模型，增强其鲁棒性。</p>
<p><strong>Scaling Law（缩放定律）</strong>：描述模型性能如何随着模型规模（如参数数量）、数据集大小和计算资源的增加而变化的规律。Scaling Law表明，模型性能通常会按照幂律关系改善。</p>
<p><strong>人类反馈的强化学习（Reinforcement Learning from Human Feedback，RLHF）</strong>：通过人类反馈优化模型输出，使其更符合人类价值观。</p>
<p><strong>迁移学习（Transfer Learning）</strong>：将一个领域的知识迁移到另一个领域以改进学习效率和效果的方法。</p>
<p><strong>梯度下降（Gradient Descent）</strong>：一种优化算法，通过最小化损失函数来更新模型参数，以改进模型性能。<strong>元学习（Meta-learning）</strong></p>
<p><strong>学习率（Learning Rate）</strong>：控制梯度下降步骤大小的超参数，对模型训练速度和最终性能有重要影响。</p>
<p><strong>早停法（Early Stopping）</strong>：一种防止过拟合的技术，在验证集上的性能不再提高时停止训练。</p>
<p><strong>数据增强（Data Augmentation）</strong>：通过对训练数据进行变换（如旋转、缩放等），生成更多样化的训练样本，以增加模型的泛化能力。</p>
<p><strong>联合学习（Federated Learning）</strong>：是一种分布式机器学习方法，旨在允许多个参与者在不共享原始数据的情况下共同训练模型。这种方法特别适用于隐私保护和数据安全要求较高的场景，如医疗、金融和移动设备等领域。</p>
<h3><strong>模型优化与压缩</strong></h3>
<p><strong>知识蒸馏/模型蒸馏（Knowledge Distillation/Model Distillation）</strong>：一种技术，通过训练一个小模型（学生模型）来模仿大模型（教师模型）的行为，以达到减少计算复杂度和资源消耗的目的。这种技术不仅限于大小模型之间的转换，也可以用于模型间的知识迁移。</p>
<p>Deepseek通俗版解释：假设你是一个学生，有一个超级学霸同学（这个学霸同学就像是原始的大模型）。这个学霸同学知道好多好多知识，包括很多复杂的解题技巧、对各种概念深入的理解等。现在你想快速掌握这些知识，但是你没有那么多时间和精力像学霸同学那样去学习每一个细节。于是，学霸同学就把他的知识总结成了一些重点内容、解题思路的精华部分（这就是蒸馏的过程），然后告诉你。你通过学习这些精华内容，也能够解决很多问题，虽然你可能没有学霸同学知道的知识那么全面深入，但已经足够应对很多常见情况了。</p>
<p><strong>量化（Quantization）</strong>：将模型的参数和激活值映射到较低的位数（如从32位浮点数降至8位整数），以减少模型的存储需求和计算复杂度。这有助于降低内存占用并加速推理过程。</p>
<p><strong>模型压缩（Model Compression）</strong>：通过一系列技术手段，如知识蒸馏、量化、剪枝等，减少模型的参数量和计算量，使其能够在资源有限的设备上高效运行。</p>
<p><strong>稀疏激活（Sparse Activation）</strong>：采用特定类型的激活函数（如ReLU变体）或通过结构化稀疏训练，使得神经网络的激活函数在大部分情况下输出零值，从而减少计算量和存储需求。</p>
<p><strong>低秩分解（Low-Rank Factorization）</strong>：通过近似高维矩阵为两个或多个低维矩阵的乘积来减少模型参数量的技术，这种方法可以有效降低计算成本和存储需求。</p>
<p><strong>权重共享（Weight Sharing）</strong>：</p>
<p>是卷积神经网络（CNN）中的一个核心概念，主要目的是减少模型的参数数量，提高计算效率和泛化能力。以下是关于权重共享的详细解释：</p>
<p>是指在卷积层中，卷积核（Filter）在输入图像的每个位置上使用相同的权重参数进行卷积操作。这意味着卷积核在滑动过程中，每个位置的计算都使用相同的权重矩阵。</p>
<h3><strong>计算与性能优化</strong></h3>
<p><strong>混合精度训练（Mixed-Precision Training）</strong>：通过结合使用16位和32位浮点数来加速深度学习模型的训练过程，同时减少内存占用。这不仅提高了计算效率，还允许在相同的硬件上训练更大规模的模型。</p>
<p><strong>批处理（Batching）</strong>：一次性处理多个样本以提高计算效率的技术，通过充分利用现代硬件（如GPU）的并行处理能力，显著加快训练速度。</p>
<p><strong>硬件加速（Hardware Acceleration）</strong>：利用专门设计用于加速特定类型计算任务的硬件（如GPU、TPU）来加速模型的训练和推理过程，提供比通用CPU更高的计算能力和效率。<strong>自适应计算（Adaptive Computation）</strong></p>
<p><strong>分布式训练（Distributed Training）</strong>：通过在网络中的多台机器之间分配训练任务来加速训练过程，特别适用于处理极其庞大的数据集和模型参数。</p>
<p><strong>内存优化（Memory Optimization）</strong>：采用各种技术减少训练过程中所需的内存消耗，使得可以在有限的硬件资源上训练更大的模型，如梯度累积和检查点机制等。</p>
<h3><strong>推理与应用</strong></h3>
<p><strong>推理（Inference）</strong>：模型在训练完成后，利用学到的知识根据输入数据预测输出结果，用于解决实际问题或做出决策。</p>
<p><strong>深度强化学习（Deep Reinforcement Learning）</strong>：结合深度学习和强化学习的方法，使代理能够在复杂环境中通过试错学习最优策略，广泛应用于游戏、机器人控制等领域。</p>
<p><strong>多模态学习（Multimodal Learning）</strong>：训练能够处理多种输入形式（如文本、图像、语音等）的模型，使得模型能够理解和处理来自不同信息源的数据。</p>
<p><strong>迁移学习（Transfer Learning）</strong>：一种技术，通过将在一个领域或任务上学到的知识应用到另一个领域或任务上，以改进学习效率和效果。这种方法特别适用于目标领域数据稀缺的情况，通过利用源领域的丰富知识来加速学习过程并提高模型性能</p>
<p><strong>提示词（Prompt）</strong>：在生成式模型中，用于引导模型生成特定内容的输入文本。精心设计的提示词可以显著影响模型输出的质量，适用于文本生成、问答系统等多种任务。</p>
<p>Deepseek通俗版解释：大模型提示词，就是你给AI的“问题”或“指令”，就像你教小朋友画画时说的话。比如：</p>
<ul>
<li>如果你说：“随便画点什么”，小朋友可能画一朵花🌼。</li>
<li>但如果你说：“画一只戴帽子的蓝色小狗🐶”，小朋友就会按你的要求画。</li>
</ul>
<p>AI（比如ChatGPT）就像这个小朋友，<strong>提示词越清楚，AI的回答就越准</strong>！</p>
<p><strong>上下文窗口（Context Window）</strong>：模型在处理输入数据时能够“看到”的上下文范围，对于捕捉序列数据中的依赖关系至关重要。</p>
<p><strong>在线学习（Online Learning）</strong>：模型能够实时更新其参数以适应不断变化的数据环境，特别适用于数据流持续到达的应用场景，如推荐系统和金融市场分析。</p>
<h3><strong>数据与标签</strong></h3>
<p><strong>数据清洗（Data Cleaning）</strong>：是一个关键步骤，用于改善数据的质量和可靠性，确保数据的准确性、一致性和完整性。以下是数据清洗的主要目的和关键活动： 提高数据质量：通过识别和纠正数据中的错误、缺失值、异常值和重复值，数据清洗显著提高数据的准确性和完整性。 保证数据一致性：数据清洗确保数据在不同数据源之间保持一致，通过标准化、转换和合并数据，消除格式差异和数据冲突。 支持数据分析和决策：清洗后的数据更适合进行深入分析，通过消除数据中的噪声和干扰，突出数据的关键特征和趋势，为决策提供有力支持。 提高可视化效果：清洗后的数据更规范、一致，有助于在可视化中减少混乱和误导，提供清晰、易懂的信息。</p>
<p>Deepseek通俗版解释：就是把“脏”数据变成“干净”数据的过程。想象一下，你有一堆杂乱无章的文件，里面有很多错误、重复和缺失的信息，这种情况下数据的效用肯定是达不到理想标准的，需要提前对数据集进行预处理之后才可使用。数据清洗这一步骤要完成的任务就是要整理这些数据，让它们变得整洁、准确和有用。</p>
<p><strong>特征工程（Feature Engineering）</strong>：从原始数据中提取有用的特征，以便更好地训练机器学习模型。这包括特征选择、特征创建和转换等过程。</p>
<p><strong>数据标注（Data Annotation）</strong>：为训练监督学习模型而对数据进行标记的过程，涉及将类别标签或其他注释附加到数据点上。</p>
<p><strong>合成数据（Synthetic Data）</strong>：通过算法生成的人工数据，用于补充或替代真实世界的数据。合成数据可以在数据稀缺、敏感或难以收集的情况下提供帮助，尤其是在需要保护隐私的环境中。它广泛应用于自动驾驶汽车、医疗影像分析等领域，通过模拟不同的场景来扩展训练数据集。</p>
<p><strong>数据增强（Data Augmentation）</strong>：通过生成新的训练样本来增加训练数据的多样性，如图像旋转、缩放等，以提高模型的泛化能力和鲁棒性。</p>
<p><strong>软标签（Soft Labels）</strong>：不同于硬标签的确定性分类，软标签提供了教师模型预测的概率分布，反映了每个类别的可能性。这种方法可以传递更多的信息，例如在知识蒸馏中，使用软标签可以帮助学生模型更好地学习教师模型的知识。</p>
<h3>大模型工具划分</h3>
<p>• 🚀 LLM Training：专注于 LLM 训练和微调的工具，帮助你更快、更高效地优化模型。</p>
<p>• 🧱 LLM Application Development：从框架到多 API 接入，再到缓存和低代码开发，为应用开发提供全方位支持。</p>
<p>• 🩸 LLM RAG：Retrieval-Augmented Generation（检索增强生成）相关的库，提升模型的知识检索能力。</p>
<p>• 🟩 LLM Inference：推理加速和优化工具，让模型运行更流畅。</p>
<p>• 🚧 LLM Serving：模型部署和推理服务的解决方案。</p>
<p>• 📤 LLM Data Extraction：数据提取工具，帮助你从各种来源获取高质量数据。</p>
<p>• 🌠 LLM Data Generation：生成合成数据，丰富你的训练集。</p>
<p>• 💎 LLM Agents：构建智能代理，实现自动化任务和多代理协作。</p>
<p>• ⚖️ LLM Evaluation：评估工具，确保模型性能达到预期。</p>
<p>• 🔍 LLM Monitoring：监控模型运行状态，及时发现并解决问题。</p>
<p>• 📅 LLM Prompts：优化和管理提示词，提升模型输出质量。</p>
<p>• 📝 LLM Structured Outputs：生成结构化输出，让模型结果更易用。</p>
<p>• 🛑 LLM Safety and Security：保障模型的安全性和可靠性。</p>
<p>• 💠 LLM Embedding Models：提供先进的文本嵌入模型。</p>
<p>• ❇️ Others：其他实用工具，涵盖更多开发场景。</p>
<h3><strong>特征与数据处理</strong></h3>
<p><strong>特征提取（Feature Extraction）</strong>：将高维、复杂的原始数据转换为低维且具有代表性的特征集合。原始数据往往包含大量冗余或无关信息，直接使用这些数据进行模型训练不仅会增加计算成本，还可能导致模型性能下降。通过特征提取，我们可以去除这些冗余信息，保留最能反映数据本质特征的部分，从而提高模型的效率和准确性。</p>
<p><strong>数据标准化/归一化（Data Standardization / Normalization）</strong>：将不同尺度的数据转换到相同的尺度上，以便于某些机器学习算法的处理。标准化通常是基于均值和标准差进行的，而归一化则是将数值缩放到一个特定范围（如0到1之间）。</p>
<p><strong>特征构建（Feature Construction）</strong>：创建新的特征或修改现有特征以更好地捕捉数据中的模式。这可以通过数学变换、组合现有特征等方式实现。</p>
<h3><strong>模型评估与调试</strong></h3>
<p><strong>对抗样本（Adversarial Examples）</strong>：是通过算法在原始输入中添加人眼难以察觉的微小扰动所形成的新样本，以该样本作为模型的输入，会使得模型以高置信度将其分类错误[1]。虽然，对抗样本可对机器学习模型产生攻击效果[2]，但目前对抗样本在深度学习领域中的研究较为广泛。</p>
<p><strong>局部搜索（Local Search）</strong>：一种优化算法，通过在解空间中寻找局部最优解，并试图从局部最优解出发找到全局最优解。尽管不是直接与模型评估相关，但在某些情况下可用于优化模型参数。</p>
<p><strong>模型的可扩展性（Scalability）</strong>：可扩展性是指系统处理不断增长的用户、数据、并发、业务的能力或其适应业务、数据增长的潜力 • 当请求负载或用户数据增加时，能够保持甚至提高其性能、效率和可靠性的系统具有良好的可扩展性。 • 可扩展性对于确保系统能够处理增加的用户流量、数据量或计算需求，而不会显著降低性能或需要完全重新设计至关重要</p>
<p><strong>可解释性（Explainability）</strong>：指的是模型决策过程的透明度和可理解性，即能够清楚地解释模型为什么做出特定预测的能力。这对于确保模型的公平性、避免偏见以及增强用户信任至关重要。<strong>精确率、召回率和F1分数（Precision, Recall, F1 Score）</strong></p>
<p><strong>模型的泛化能力（Generalization）</strong>：模型在未见过的新数据上表现良好的能力，是衡量模型是否过拟合的重要指标。良好的泛化能力意味着模型不仅能在训练数据上表现良好，在新数据上也能有出色的表现。</p>
<p><strong>交叉验证（Cross-validation）</strong>：一种统计方法，通过将数据集划分为几个子集并循环使用这些子集进行训练和测试来评估模型性能。这种方法有助于更准确地估计模型的泛化能力，并减少因数据划分不同而导致的结果波动。</p>
<p><strong>混淆矩阵（Confusion Matrix）</strong>：用于描述分类模型性能的一种表格，显示了每个类别的实际值与预测值之间的对比情况，提供了关于分类器误差类型的详细信息。</p>
<p><strong>AUC-ROC曲线（Area Under the Curve - Receiver Operating Characteristic Curve）</strong>：用于评估二分类模型性能的一个图形工具，展示了模型区分正负类的能力。AUC值越接近于1，表示模型的分类效果越好。</p>
<p><strong>模型校准（Model Calibration）</strong>：确保模型预测的概率反映了真实发生的概率的过程。良好的校准对于需要概率估计的任务非常重要。</p>
<p><strong>偏差-方差权衡（Bias-Variance Tradeoff）</strong>：描述了模型复杂度与误差之间的关系。高偏差通常意味着模型过于简单而欠拟合，高方差则意味着模型过于复杂而过拟合。</p>
<h3><strong>伦理与公平性</strong></h3>
<p><strong>模型的伦理和偏见（Ethics and Bias）</strong>：指模型在训练和应用过程中可能存在的伦理问题和偏见。这些问题包括但不限于性别、种族、年龄等方面的歧视性偏差，以及隐私保护、数据使用合法性等伦理考量。解决这些问题对于构建公平、透明和负责任的人工智能系统至关重要。</p>
<p>Deepseek通俗版解释：模型伦理就像是给模型的行为制定一套规则。比如说，我们希望一个预测天气的模型是准确可靠的。如果这个模型总是故意给出错误的天气预报来误导农民播种或者航海者出行，那就是不道德的。再比如，在医疗领域，有一个根据病人症状预测疾病的模型。如果这个模型为了某些利益（比如推销某种昂贵的药物），把普通感冒诊断为重病，这就是违背了模型伦理。</p>
<p><strong>问责制（Accountability）</strong>：指确定谁对AI系统的决策负责的过程。这涉及到法律、伦理和技术层面的问题，确保当模型出现错误或造成伤害时，有明确的责任人或机制来处理。</p>
<p><strong>公平性（Fairness）</strong>：指机器学习模型在不同群体之间的表现是否公正。评估模型的公平性通常涉及检查是否存在对某些群体不利的偏见，并采取措施减轻这种偏见，以确保所有用户都能得到公平对待。</p>
<h3>大模型和程序员的关系</h3>
<p>（1）目前ChatGPT对程序员到底有哪些实质性的帮助？</p>
<p>第一点：Code Review ChatGPT能够理解代码，并针对代码给出针对性的建议和优化方案；</p>
<p>第二点：写测试用例、单元测试、集成测试等，这些ChatGPT都很擅长！</p>
<p>第三点：对线上问题的定位和分析 线上问题的各种疑难杂症，ChatGPT都能胜任！</p>
<p>第四点：SQL的翻译 实现两种数据库的SQL语言转换，比如将Oracle的SQL脚本转换成MySQL的SQL脚本。</p>
<p>（2）有了AI编程，还需要程序员吗？</p>
<p>第一，在冯诺依曼架构体系下，程序需要的是确定性计算；</p>
<p>第二，由于大模型本身的概率性，目前大模型生成的代码还具备一定的随意性和不确定性；</p>
<p>第三，目前大模型更擅长的是一些抽象层次比较低的工作，比如一段代码或一个算法的实现，写一个单元测试等等。而一些抽象层次比较高的工作，比如需求分析、架构设计、领域设计、架构选型等，这些工作反而是大模型不擅长的，而这些工作是比较具备有竞争力的，这恰恰是一些高级程序员以及系统架构师的价值所在。</p>
<p>（3）应用实践AIGC有几层境界？</p>
<p>第一层境界：简单对话； 通过ctrl-c/v出结果，人人都会。</p>
<p>第二层境界：系统掌握Prompt Engineering； 通过系统掌握好提示词工程，真正赋能工作提效。</p>
<p>第三层境界：将AIGC融入业务流程，指挥AIGC完成复杂的任务； 通过掌握AIGC的技能，并完成业务领域知识的深入结合。</p>
<p>第四层境界：拥有自己的大模型； 熟悉大模型的架构原理，通过开源大模型微调，最好能够拥有一定的行业数据壁垒。</p>
<p>第五层境界：参与设计训练大模型； 比如从事ChatGPT等研发工作。 目前，Edison还处于第二层即提示词工程，我们整理了很多针对SDLC（软件开发生命周期）过程中的经典场景的提示词模板来做提效。 那么，你处于哪一层呢？</p>
]]></content:encoded>
    </item>
    <item>
      <title>大模型核心</title>
      <link>https://ujava.cn/model/core.html</link>
      <guid>https://ujava.cn/model/core.html</guid>
      <source url="https://ujava.cn/rss.xml">大模型核心</source>
      <description>近年来，以ChatGPT为代表的大模型技术掀起了人工智能领域的革命。它们不仅能生成流畅的文本，还能完成代码编写、图像生成等复杂任务。本文将深入解析大模型的核心原理，揭开其智能化的底层逻辑。 一、大模型的定义与特点 大模型（Large Language Model, LLM） 是指参数规模达到数亿甚至数千亿的深度学习模型。其核心特点是： 参数规模庞大：例...</description>
      <category>设计模型</category>
      <pubDate>Wed, 07 May 2025 03:57:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>近年来，以ChatGPT为代表的大模型技术掀起了人工智能领域的革命。它们不仅能生成流畅的文本，还能完成代码编写、图像生成等复杂任务。本文将深入解析大模型的核心原理，揭开其智能化的底层逻辑。</p>
<h2>一、大模型的定义与特点</h2>
<p><strong>大模型（Large Language Model, LLM）</strong>&nbsp;是指参数规模达到数亿甚至数千亿的深度学习模型。其核心特点是：</p>
<ol>
<li><strong>参数规模庞大</strong>：例如GPT-3参数达1750亿，通过海量数据训练捕捉复杂的语言规律。</li>
<li><strong>数据需求量大</strong>：训练数据通常涵盖互联网文本、书籍、代码等多源信息，规模可达TB级。</li>
<li><strong>任务泛化能力强</strong>：通过预训练学习通用知识，可适配翻译、问答、创作等多样化任务。</li>
</ol>
<h2>二、大模型的核心原理</h2>
<p>1.&nbsp;<strong>架构基础：Transformer与注意力机制</strong></p>
<p>大模型普遍采用<strong>Transformer架构</strong>，其核心是<strong>自注意力机制（Self-Attention）</strong>，能够动态衡量输入序列中每个词的重要性，捕捉长距离依赖关系。例如，“猫吃鱼”中，“吃”的动作会同时关注“猫”和“鱼”。</p>
<p>2.&nbsp;<strong>训练三阶段</strong></p>
<ul>
<li><strong>预训练（Pretraining）</strong><br>
模型通过无监督学习从海量文本中学习语言模式。例如，给定句子“天空是__”，模型预测下一个词为“蓝色”的概率。</li>
<li><strong>指令微调（Instruction Tuning）</strong><br>
引入有监督数据，教会模型理解人类指令。例如，将“翻译成英文：你好”与“Hello”配对训练，使模型适配具体任务。</li>
<li><strong>对齐微调（Alignment Tuning）</strong><br>
通过人类反馈强化学习（RLHF）或直接偏好优化（DPO），让模型输出更符合人类价值观。例如，优先选择“帮助用户”而非“误导用户”的回答。</li>
</ul>
<p>3.&nbsp;<strong>生成逻辑：Token预测与迭代</strong></p>
<p>大模型通过<strong>逐Token预测</strong>生成内容：</p>
<ul>
<li><strong>Token化</strong>：文本被切分为最小语义单元（如“Chat”→“GPT”可能拆分为两个Token）。</li>
<li><strong>概率采样</strong>：基于上下文预测下一个Token的概率分布，通过温度参数（Temperature）控制生成多样性。例如，高温增加随机性，低温输出确定性结果。</li>
</ul>
<h2>三、大模型的典型架构形式</h2>
<p>|架构类型|特点与应用场景|代表模型|<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>默认值</title>
      <link>https://ujava.cn/python/question.html</link>
      <guid>https://ujava.cn/python/question.html</guid>
      <source url="https://ujava.cn/rss.xml">默认值</source>
      <description>python 没有key时不报异常怎么设置 在Python中，当你尝试从一个字典中获取一个不存在的键时，默认情况下会抛出一个KeyError异常。如果你希望在键不存在时不抛出异常，你有几种不同的方法可以实现这一点： 1. 使用get()方法 这是最简单也是最常用的方法。get()方法允许你指定一个默认值，如果键不存在，将返回这个默认值，而不是抛出异常。...</description>
      <category>设计Python</category>
      <pubDate>Wed, 07 May 2025 03:57:02 GMT</pubDate>
      <content:encoded><![CDATA[
<p>在Python中，当你尝试从一个字典中获取一个不存在的键时，默认情况下会抛出一个<code>KeyError</code>异常。如果你希望在键不存在时不抛出异常，你有几种不同的方法可以实现这一点：</p>
<h3>1. 使用<code>get()</code>方法</h3>
<p>这是最简单也是最常用的方法。<code>get()</code>方法允许你指定一个默认值，如果键不存在，将返回这个默认值，而不是抛出异常。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">value </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_dict.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'默认值'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 如果'c'不存在，返回'默认值'</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(value)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：默认值</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2. 使用字典的<code>setdefault()</code>方法</h3>
<p><code>setdefault()</code>方法也可以用于在字典中添加一个新的键值对，如果键不存在的话。它同样可以接受一个默认值。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">value </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_dict.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">setdefault</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'默认值'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 如果'c'不存在，则添加'c': '默认值'</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(value)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：默认值</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>3. 使用异常处理</h3>
<p>虽然这不是推荐的方法（因为它会降低代码的性能），但你可以使用<code>try-except</code>语句来捕获<code>KeyError</code>异常。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    value </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_dict[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">except</span><span style="--shiki-light:#0184BC;--shiki-dark:#ABB2BF"> KeyError</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    value </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '默认值'</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(value)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：默认值</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>4. 使用字典推导式和条件表达式（Python 3.8+）</h3>
<p>从Python 3.8开始，你可以使用<code>|</code>运算符和字典推导式结合条件表达式来提供一个默认值。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">value </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (my_dict </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">|</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'默认值'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">})[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 使用字典合并和条件访问</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(value)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：默认值</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>5. 使用<code>collections.defaultdict</code></h3>
<p>如果你经常需要从字典中获取不存在的键，并且想要避免每次都进行错误处理，可以考虑使用<code>collections.defaultdict</code>。这个类在初始化时接受一个默认的工厂函数，当尝试访问一个不存在的键时，会自动创建一个新的键，并使用工厂函数返回的默认值。</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> collections </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> defaultdict</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> defaultdict</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">lambda</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'默认值'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 指定一个lambda函数作为默认工厂</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'a'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">my_dict[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'b'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_dict[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'c'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])  </span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 输出：默认值</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>以上方法都可以帮助你在Python中优雅地处理字典键不存在的情况。选择哪种方法取决于你的具体需求和偏好。通常，使用<code>get()</code>方法是最简单和最直接的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python数据类型</title>
      <link>https://ujava.cn/python/type.html</link>
      <guid>https://ujava.cn/python/type.html</guid>
      <source url="https://ujava.cn/rss.xml">Python数据类型</source>
      <description>基础知识与数据类型 一、数字类型 1.整型(int) 2.浮点型 [浮点数]类型与数学中实数的概念一致，表示带有小数的数值 Python语言要求所有浮点数必须带有小数部分，小数部分可以是0，目的是区分浮点数和整数类型 浮点数有两种表示方法：十进制表示和科学计数法表示 例：0.0，77.，-3.14，96e4，4.3e-3，9.6E5 3.复数(comp...</description>
      <category>设计模型</category>
      <pubDate>Wed, 07 May 2025 03:57:02 GMT</pubDate>
      <content:encoded><![CDATA[<h2>基础知识与数据类型</h2>
<h3>一、数字类型</h3>
<h4>1.整型(int)</h4>
<p>| 进制种类 | 引导符号  | 描述                       |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Docling</title>
      <link>https://ujava.cn/model/docling.html</link>
      <guid>https://ujava.cn/model/docling.html</guid>
      <source url="https://ujava.cn/rss.xml">Docling</source>
      <description>**[Docling]**‌是一个由[IBM]开发的开源文档解析工具，旨在简化文档处理流程，支持多种文档格式的解析和转换，并与人工智能生态系统无缝集成。Docling的主要功能包括： ‌多格式支持‌：Docling支持多种文档格式的解析和转换，包括PDF、DOCX、PPTX、图像、HTML、[AsciiDoc]和[Markdown]，并能将这些文档导出...</description>
      <category>设计模型</category>
      <pubDate>Wed, 16 Apr 2025 06:22:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>**[Docling]**‌是一个由[IBM]开发的开源文档解析工具，旨在简化文档处理流程，支持多种文档格式的解析和转换，并与人工智能生态系统无缝集成。Docling的主要功能包括：</p>
<ol>
<li>‌<strong>多格式支持</strong>‌：Docling支持多种文档格式的解析和转换，包括PDF、DOCX、PPTX、图像、HTML、[AsciiDoc]和[Markdown]，并能将这些文档导出为Markdown或JSON格式‌。</li>
<li>‌<strong>高级PDF理解</strong>‌：Docling具备对PDF文档的高级理解能力，能够识别页面布局、阅读顺序和表格结构，特别适合处理复杂的PDF文档‌。</li>
<li>‌<strong>OCR支持</strong>‌：Docling支持光学字符识别（OCR），能够识别扫描PDF中的文字，适用于处理扫描或手写的文档‌。</li>
<li>‌<strong>统一文档表示</strong>‌：Docling提供了一个统一且富有表现力的文档表示格式，确保文档集成和分析的一致性和可靠性‌。</li>
<li>‌<strong>工具集成</strong>‌：Docling易于与[LlamaIndex]和[LangChain]等工具集成，增强文档的检索和问答能力，适用于构建检索增强生成（RAG）和问答（QA）应用程序‌。</li>
<li>‌<strong>命令行界面</strong>‌：Docling提供一个简洁的命令行界面（CLI），方便用户快速处理单个或批量文档转换‌。</li>
</ol>
<h3>技术原理</h3>
<p>Docling使用专门的解析器读取和解析不同格式的文档，将其内容转换为内部数据结构。对于PDF等格式，Docling基于布局分析来识别页面布局、表格结构和阅读顺序。</p>
]]></content:encoded>
    </item>
    <item>
      <title>MinerU-API</title>
      <link>https://ujava.cn/model/mineru-api.html</link>
      <guid>https://ujava.cn/model/mineru-api.html</guid>
      <source url="https://ujava.cn/rss.xml">MinerU-API</source>
      <description>‌**[MinerU-API]**‌是一个基于[MinerU]的[PDF解析]API，支持一键启动，主要用于将PDF文档高效转换为[Markdown]和[JSON]等结构化格式。MinerU-API的核心功能包括文本、图片、表格和公式的提取，特别适用于多语言文档和复杂布局的PDF文件批量处理‌。 功能特点 ‌多模态内容提取‌：支持提取PDF中的文本、图...</description>
      <category>设计模型</category>
      <pubDate>Wed, 16 Apr 2025 06:22:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>‌**[MinerU-API]**‌是一个基于[MinerU]的[PDF解析]API，支持一键启动，主要用于将PDF文档高效转换为[Markdown]和[JSON]等结构化格式。MinerU-API的核心功能包括文本、图片、表格和公式的提取，特别适用于多语言文档和复杂布局的PDF文件批量处理‌。</p>
<h3>功能特点</h3>
<ol>
<li>‌<strong>多模态内容提取</strong>‌：支持提取PDF中的文本、图像、表格和公式等内容。</li>
<li>‌<strong>结构化输出</strong>‌：可以将提取的内容转换为Markdown和JSON格式，便于后续处理和分析。</li>
<li>‌<strong>高效处理</strong>‌：支持批量处理，适用于大量文档的快速转换。</li>
<li>‌<strong>多语言支持</strong>‌：OCR功能支持84种语言的检测和识别，适用于多语言文档的处理。</li>
<li>‌<strong>可视化结果</strong>‌：支持布局可视化和跨度可视化，便于高效确认输出质量。</li>
<li>‌<strong>跨平台兼容性</strong>‌：支持[Windows]和[Mac]平台，具有良好的兼容性。</li>
</ol>
<h3>技术规格</h3>
<ul>
<li>‌<strong>支持环境</strong>‌：支持纯CPU环境运行，并支持[GPU]（[CUDA]）/[NPU]（[CANN]）/[MPS]加速。</li>
<li>‌<strong>硬件要求</strong>‌：推荐使用NVIDIA显卡（8GB显存及以上），并安装CUDA。</li>
<li>‌<strong>操作系统</strong>‌：支持[Linux]（2009年后版本）、[Windows 10或11]、[macOS 11+]</li>
</ul>
<h3>使用场景</h3>
<p>MinerU-API适用于需要高效处理PDF文档的场景，如[AI训练数据]准备、[知识库]建设、文档管理等领域。其强大的多模态内容提取和结构化输出功能，使得它在处理复杂文档时尤为有效。</p>
]]></content:encoded>
    </item>
    <item>
      <title>MinerU</title>
      <link>https://ujava.cn/model/mineru.html</link>
      <guid>https://ujava.cn/model/mineru.html</guid>
      <source url="https://ujava.cn/rss.xml">MinerU</source>
      <description>‌**[MinerU]**‌是一款开源的PDF、Word、PPT数据提取工具，能够将复杂多模态的文档转化为结构化数据格式，如Markdown和JSON。其主要功能包括OCR文字识别、语义一致性处理、人类可读性优化、公式转换、多语言支持、内容提取和跨平台兼容性等‌。 主要功能 ‌OCR功能‌：能够检测扫描版PDF并启用OCR功能进行文字识别，支持84种语...</description>
      <category>设计模型</category>
      <pubDate>Wed, 16 Apr 2025 06:22:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>‌**[MinerU]**‌是一款开源的PDF、Word、PPT数据提取工具，能够将复杂多模态的文档转化为结构化数据格式，如Markdown和JSON。其主要功能包括OCR文字识别、语义一致性处理、人类可读性优化、公式转换、多语言支持、内容提取和跨平台兼容性等‌。</p>
<h3>主要功能</h3>
<ol>
<li>‌<strong>OCR功能</strong>‌：能够检测扫描版PDF并启用OCR功能进行文字识别，支持84种语言的检测与识别‌。</li>
<li>‌<strong>语义一致性</strong>‌：移除页眉、页脚、脚注等元素，保持核心内容连贯‌。</li>
<li>‌<strong>人类可读性</strong>‌：支持单列和多列排列，优化阅读格式‌。</li>
<li>‌<strong>公式转换</strong>‌：识别文档中的公式并将其转换为LaTeX格式‌。</li>
<li>‌<strong>多语言支持</strong>‌：提供语言检测和识别功能‌。</li>
<li>‌<strong>内容提取</strong>‌：支持提取文档中的图像和表格，并将其转换为Markdown格式‌。</li>
<li>‌<strong>结构保留</strong>‌：保留文档原有的标题和段落结构‌。</li>
<li>‌<strong>跨平台兼容性</strong>‌：支持Windows、Linux和Mac等主流操作系统平台‌。</li>
</ol>
<h3>应用场景</h3>
<p>MinerU在多个场景中都有广泛应用：</p>
<ul>
<li>‌<strong>学术研究</strong>‌：批量处理学术论文PDF和讲稿PPT，建立学术文献知识库，支持智能检索和分析。</li>
<li>‌<strong>企业文档处理</strong>‌：处理商业合同、报告等，提取会议记录、培训材料等内容，实现智能归档和知识管理‌。</li>
<li>‌<strong>教育培训</strong>‌：将教材、讲义等教学资源数字化，支持在线学习系统建设‌。</li>
<li>‌<strong>AI训练</strong>‌：批量处理文档生成高质量训练语料，提取专业领域文档构建垂直领域知识库‌。</li>
<li>‌<strong>档案管理</strong>‌：政府公文、历史档案、图书馆馆藏资料的智能数字化和结构化存储‌。</li>
<li>‌<strong>医疗健康</strong>‌：处理病历、检验报告等医疗文档，提取医学文献用于研究分析，建立医疗知识库支持临床决策‌。</li>
<li>‌<strong>法律文书</strong>‌：提取法律文件关键信息，构建法律知识库支持案例检索‌。</li>
</ul>
<h3>技术特点</h3>
<p>MinerU支持纯CPU环境运行，并支持GPU（CUDA）/NPU（CANN）/MPS加速。</p>
]]></content:encoded>
    </item>
    <item>
      <title>olmOCR</title>
      <link>https://ujava.cn/model/olmocr.html</link>
      <guid>https://ujava.cn/model/olmocr.html</guid>
      <source url="https://ujava.cn/rss.xml">olmOCR</source>
      <description>**[olmocr]**‌（Open Language Model for OCR）是一个由[AllenAI]团队开发的开源工具包，旨在高效地将PDF和其他文档转换为结构化的纯文本，同时保持自然的阅读顺序。该工具支持多种文件格式，包括PDF、JPG和PNG，特别适用于处理复杂布局的文档，如表格、数学公式和手写内容‌。 功能特点 ‌高准确性和低错误率‌：...</description>
      <category>设计模型</category>
      <pubDate>Wed, 16 Apr 2025 06:22:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>**[olmocr]**‌（Open Language Model for OCR）是一个由[AllenAI]团队开发的开源工具包，旨在高效地将PDF和其他文档转换为结构化的纯文本，同时保持自然的阅读顺序。该工具支持多种文件格式，包括PDF、JPG和PNG，特别适用于处理复杂布局的文档，如表格、数学公式和手写内容‌。</p>
<h3>功能特点</h3>
<ol>
<li>‌<strong>高准确性和低错误率</strong>‌：olmocr经过大量学术论文、技术文档等内容的训练，采用独特的提示技术来提高识别的准确性，减少错误信息的生成‌。</li>
<li>‌<strong>支持复杂布局</strong>‌：该工具能够处理多栏排版、嵌入表格、数学公式和手写文本等复杂布局，特别适合需要高精度文本提取的场景‌。</li>
<li>‌<strong>Markdown格式输出</strong>‌：olmocr生成的文本以Markdown格式输出，便于后续使用，如与语言模型集成或文档编辑‌。</li>
<li>‌<strong>成本效益高</strong>‌：处理00万页PDF的成本仅为90美元，相比使用GPT-o API的成本降低了倍，特别适合预算有限的用户‌。</li>
<li>‌<strong>开源和可扩展</strong>‌：olmocr完全开源，用户可以自由部署使用，并支持多GPU扩展，适合企业级PDF批量转换需求‌。</li>
</ol>
<h3>技术细节</h3>
<p>olmocr基于一个70亿参数的视觉语言模型（VLM），在超过60,000页的PDF数据集上进行了微调。其核心创新包括“文档锚定”技术，将文本元数据与基于图像的分析相结合，直接从PDF嵌入的数据中提取文本元素，并与相应的视觉表示对齐‌。此外，olmocr还提供了评估工具包、语言过滤和SEO垃圾邮件移除等功能，方便用户进行进一步处理‌。</p>
]]></content:encoded>
    </item>
    <item>
      <title>蒸馏原理</title>
      <link>https://ujava.cn/model/distill.html</link>
      <guid>https://ujava.cn/model/distill.html</guid>
      <source url="https://ujava.cn/rss.xml">蒸馏原理</source>
      <description>蒸馏原理 ‌**[知识蒸馏]**‌是一种机器学习技术，其核心思想是将一个大型、复杂的模型（通常称为“教师”模型）的知识转移到一个小型、简单的模型（称为“学生”模型）中。这个过程不仅涉及模型输出的复制，更重要的是教学生模型模仿教师模型的内部处理方式和数据分布见解。‌12 知识蒸馏的基本原理 ‌教师模型训练‌：首先，教师模型在一个大型数据集上进行训练，以达...</description>
      <category>设计模型</category>
      <pubDate>Thu, 13 Feb 2025 12:31:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>蒸馏原理<br>
<mark>‌**[知识蒸馏]**‌</mark>是一种机器学习技术，其核心思想是将一个大型、复杂的模型（通常称为“教师”模型）的知识转移到一个小型、简单的模型（称为“学生”模型）中。这个过程不仅涉及模型输出的复制，更重要的是教学生模型模仿教师模型的内部处理方式和数据分布见解。‌12</p>
<h3>知识蒸馏的基本原理</h3>
<ol>
<li><mark>‌<strong>教师模型训练</strong>‌</mark>：首先，教师模型在一个大型数据集上进行训练，以达到高精度。教师模型通常是一个大型、复杂的深度学习模型，如深度卷积神经网络（CNN）或变换器（Transformer），经过充分训练，具有较高的准确率和鲁棒性。</li>
<li><mark>‌<strong>学生模型初始化</strong>‌</mark>：构建一个小型且简单的神经网络作为学生模型。学生模型的目的是在保持较高性能的同时降低计算复杂性。</li>
<li><mark>‌<strong>知识转移</strong>‌</mark>：学生模型从原始训练数据和教师模型生成的软目标中学习。这些软目标提供了比硬标签更丰富的信息，因为它们包含了教师模型对数据分布的见解。通过最小化学生模型预测与教师模型输出之间的差异（通常使用KL散度作为损失函数），学生模型能够逐渐逼近教师模型的性能。</li>
<li><mark>‌<strong>损失函数计算</strong>‌</mark>：知识蒸馏中的损失函数通常由两个部分组成：蒸馏损失和学生损失。蒸馏损失衡量教师模型产生的软目标与学生模型预测之间的差异，通常通过Kullback-Leibler散度或交叉熵来计算；学生损失是学生模型预测与真实标签之间的标准交叉熵损失。</li>
</ol>
<h3>知识蒸馏的优势</h3>
<ol>
<li><mark>‌<strong>提高模型效率</strong>‌</mark>：通过将学生模型的复杂度降低，可以在保持模型性能的同时减少计算资源和存储需求。</li>
<li><mark>‌<strong>提升学生模型性能</strong>‌</mark>：通过学习教师模型的内部处理方式和数据分布见解，学生模型可以在资源受限的环境中运行，同时保持与教师模型相似的性能。</li>
<li><mark>‌<strong>适应不同应用场景</strong>‌</mark>：知识蒸馏技术可以应用于各种机器学习任务，如图像分类、自然语言处理等，帮助在不同设备上部署高效且准确的模型。</li>
</ol>
<p>通过以上步骤和原理，知识蒸馏技术在大模型时代具有重要的应用价值，能够有效提升模型的效率和性能。</p>
]]></content:encoded>
    </item>
    <item>
      <title>RetrievalChain跟RetrievalQA区别</title>
      <link>https://ujava.cn/model/retrieval.html</link>
      <guid>https://ujava.cn/model/retrieval.html</guid>
      <source url="https://ujava.cn/rss.xml">RetrievalChain跟RetrievalQA区别</source>
      <description>‌**[RetrievalChain]和[RetrievalQA]的主要区别在于它们的应用场景和功能特点。**‌ 应用场景 ‌RetrievalChain‌：主要用于从外部数据源检索信息，并与[大型语言模型]（LLM）集成。它能够处理包含聊天历史记录的对话链路，利用整个对话的上下文来生成更精准的答案‌12。 ‌RetrievalQA‌：专注于问答系统，...</description>
      <category>Python</category>
      <pubDate>Thu, 13 Feb 2025 12:31:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>‌**[RetrievalChain]和[RetrievalQA]的主要区别在于它们的应用场景和功能特点。**‌</p>
<h3>应用场景</h3>
<ul>
<li>‌<strong>RetrievalChain</strong>‌：主要用于从外部数据源检索信息，并与[大型语言模型]（LLM）集成。它能够处理包含聊天历史记录的对话链路，利用整个对话的上下文来生成更精准的答案‌12。</li>
<li>‌<strong>RetrievalQA</strong>‌：专注于问答系统，通过“先检索，后生成”的方式工作。它首先通过检索器（retriever）找到相关的文档，然后将这些文档与LLM结合生成答案‌3。</li>
</ul>
<h3>功能特点</h3>
<ul>
<li>‌<strong>RetrievalChain</strong>‌：
<ul>
<li>‌<strong>上下文利用</strong>‌：能够利用整个对话的历史记录，理解前文的语境，从而生成更精准的后续问题和答案‌1。</li>
<li>‌<strong>模块化设计</strong>‌：LangChain框架提供了许多模块化的组件，如[Document Loaders]、[Text Splitters]、[Vector Stores]等，这些组件可以组合成复杂的Chain，提高开发效率和代码的可读性及可维护性‌45。</li>
</ul>
</li>
<li>‌<strong>RetrievalQA</strong>‌：
<ul>
<li>‌<strong>检索增强生成</strong>‌：通过检索器找到相关文档后，结合LLM生成答案。这种方式在处理复杂问题和需要大量背景知识的情况下表现更好‌3。</li>
</ul>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Gradio库</title>
      <link>https://ujava.cn/python/gradio.html</link>
      <guid>https://ujava.cn/python/gradio.html</guid>
      <source url="https://ujava.cn/rss.xml">Gradio库</source>
      <description>Python的一个非常cool的库Gradio Gradio简介 Gradio是一个开源的Python库，它允许用户为机器学习模型、API或任何Python函数快速构建演示或Web应用程序。Gradio的目标是简化AI模型的可视化和交互过程，使得即使没有前端开发背景的用户也能够轻松地创建和分享他们的工作。 Gradio的特点 自动生成页面且可交互：Gr...</description>
      <category>设计Python</category>
      <pubDate>Thu, 13 Feb 2025 12:31:16 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Python的一个非常cool的库Gradio</h2>
<h4>Gradio简介</h4>
<p>Gradio是一个开源的Python库，它允许用户为机器学习模型、API或任何Python函数快速构建演示或Web应用程序。Gradio的目标是简化AI模型的可视化和交互过程，使得即使没有前端开发背景的用户也能够轻松地创建和分享他们的工作。</p>
<h4>Gradio的特点</h4>
<ul>
<li><strong>自动生成页面且可交互</strong>：Gradio可以自动生成带有交互功能的网页，用户可以通过这些网页与AI模型进行实时互动。</li>
<li><strong>改动几行代码就能完成</strong>：用户只需要在原有的代码中增加少量的Gradio调用代码，就能将函数转化为可交互的Web界面。</li>
<li><strong>支持自定义多种输入输出</strong>：Gradio支持多种输入输出类型，如文本、图像、音频等，可以灵活地适应不同的应用场景。</li>
<li><strong>支持生成可外部访问的链接</strong>：Gradio可以生成可以通过互联网访问的链接，方便用户分享他们的工作成果。</li>
</ul>
<h4>Gradio的使用方法</h4>
<ol>
<li>
<p>安装Gradio</p>
<p>：首先，确保你的系统中已安装Python 3.8或更高版本。然后，使用pip命令安装Gradio：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">pip</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gradio</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong>编写函数</strong>：定义一个[Python函数]，作为Gradio界面的处理函数。</p>
</li>
<li>
<p><strong>创建接口</strong>：使用<code>gr.Interface</code>类创建一个新的接口实例，传递你的函数以及输入和输出的类型。</p>
</li>
<li>
<p><strong>启动服务器</strong>：使用<code>launch</code>方法启动Gradio服务器，它会在本地打开一个网页，你可以通过这个网页与你的函数进行交互。</p>
</li>
</ol>
<p>例如，以下是一个简单的"Hello World"示例：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gradio </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gr</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> greet</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Hello "</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> name </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "!"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">demo </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Interface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">fn</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">greet, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">inputs</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"text"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">outputs</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"text"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">demo.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">launch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在浏览器中输入<code>http://localhost:7860</code>，即可看到运行结果。</p>
<h4>Gradio的应用场景</h4>
<p>Gradio广泛应用于[机器学习模型]的演示和测试，尤其适合那些需要与用户进行实时交互的场景。例如，图像分类、自然语言处理、推荐系统等领域的模型都可以通过Gradio进行可视化展示。此外，Gradio还被用于创建教育工具、游戏、艺术作品等多种有趣的应用。</p>
<h4>应用案例</h4>
<h5>1. 查看自己上网的公网IP</h5>
<p>虽然这个小工具软件很简单，但是用起来很方便而且界面也不错。还可以增加其他功能，大家自己体验。</p>
<p>源码如下：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gradio </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gr</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> requests</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> get_public_ip</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        response </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> requests.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'https://api.ipify.org'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        public_ip </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> response.text.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">strip</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> public_ip</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    except</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> requests.exceptions.RequestException </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> e:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">        print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Error: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">e</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> None</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    ip_textbox </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Textbox</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">placeholder</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Public IP Address"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> update_ip</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        public_ip </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> get_public_ip</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> public_ip:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> public_ip</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            return</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Failed to retrieve your public IP address."</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    iface </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Interface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">        fn</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">update_ip,</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">        inputs</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">        outputs</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">ip_textbox,</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">        title</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Public IP Address"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    )</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    iface.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">launch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "__main__"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">    main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>运行结果如下图：<br>
</p>
<h5>2. 小型资料检索</h5>
<p>我平时学习用到一些资料和工具，为了方便，正好利用gradio库实现这个功能。</p>
<p>源码如下：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gradio </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gr</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"># 工具字典，你可以根据实际情况进行修改</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">security_tools </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    "网络安全"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"工具1"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"http://example.com/tool1"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "usage"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"工具1的使用方法..."</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">        # 添加更多的网络安全工具</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    ],</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    "Rootkit病毒查杀"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"chkrootkit"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"http://www.chkrootkit.org"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "usage"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"rkhunter"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">         "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"http://rkhunter.sourceforge.net"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">         "usage"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"wget https://nchc.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.4/rkhunter-1.4.4.tar.gz"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">         },],</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    "病毒查杀"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:[</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Clamav"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"http://www.clamav.net/download.html"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "usage"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"wget http://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },],</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    "webshell查杀"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:[</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"河马webshell查杀"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"http://www.shellpub.com"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"深信服webshell网站后门检测工具"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"http://edr.sangfor.com.cn/backdoor_detection.html"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    ],</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # 添加其他类别的工具</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    "网络安全在线工具箱"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"个人安全检查表"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://digital-defense.io/"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"感染IOT设备的在线地图统计"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://dashboard.shadowserver.org/zh-hans/"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"在线 C2 追踪"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://tracker.viriback.com/"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"调查互联网上任何主机的威胁情报网站"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://threatyeti.com/"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"源代码搜索引擎"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://publicwww.com/"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        {</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"在线靶场"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "url"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://labs.hackxpert.com/"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> display_tools</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">category</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    tools </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> security_tools.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(category)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tools:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ''</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tool </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tools:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">工具名称: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">tool[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'name'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"网址: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">tool[</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'url'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"使用方法: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">tool.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'usage'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'请在网站上看说明'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> result</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "对不起，我们没有这个类别的工具。"</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">iface </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Interface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">fn</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">display_tools,</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">                     inputs</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">gr.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">Dropdown</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">choices</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">list</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(security_tools.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">keys</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">())),</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">                     outputs</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'text'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "__main__"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    iface.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">launch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>运行结果如下图：<br>
</p>
<figure><figcaption>img_2.png</figcaption></figure>
]]></content:encoded>
    </item>
    <item>
      <title>WHL后缀是什么文件</title>
      <link>https://ujava.cn/python/whl.html</link>
      <guid>https://ujava.cn/python/whl.html</guid>
      <source url="https://ujava.cn/rss.xml">WHL后缀是什么文件</source>
      <description>‌**[whl文件]**‌是[Python]的一种标准内置包格式，全称为Wheel文件。它是一种预编译的二进制包，包含了Python模块的压缩形式（.py文件和经过编译的.pyd文件），以及这些模块的元数据。whl文件使用[Zip]压缩算法进行压缩，使得Python解释器可以直接加载和使用这些文件。‌12 whl文件的优点 ‌快速安装‌：由于whl文件...</description>
      <category>设计Python</category>
      <pubDate>Thu, 13 Feb 2025 12:31:16 GMT</pubDate>
      <content:encoded><![CDATA[<p><mark>‌**[whl文件]**‌</mark>是[Python]的一种标准内置包格式，全称为Wheel文件。它是一种预编译的二进制包，包含了Python模块的压缩形式（.py文件和经过编译的.pyd文件），以及这些模块的元数据。whl文件使用[Zip]压缩算法进行压缩，使得Python解释器可以直接加载和使用这些文件。‌12</p>
<h3>whl文件的优点</h3>
<ol>
<li><mark>‌<strong>快速安装</strong>‌</mark>：由于whl文件是预编译的二进制包，安装过程通常比从源代码安装要快得多。</li>
<li><mark>‌<strong>跨平台兼容性</strong>‌</mark>：whl文件可以针对不同的操作系统和Python版本进行编译，从而实现跨平台的兼容性。</li>
<li><mark>‌<strong>减少依赖问题</strong>‌</mark>：通过安装whl文件，用户可以确保所需的依赖项已经包含在内，减少了手动安装依赖项的麻烦。</li>
</ol>
<h3>如何安装whl文件</h3>
<p>安装whl文件非常简单，只需要使用pip命令即可。例如，要安装xxx.whl文件，可以执行以下命令：</p>
<p>bashCopy Code</p>
<p><code>pip install xxx.whl</code></p>
<p>pip会自动识别并安装whl文件及其依赖项。</p>
<h3>whl文件的命名规则</h3>
<p>whl文件的命名通常包含文件名、对应的Python版本、操作系统和平台信息。例如，文件名<code>pyWinhook-1.6.2-cp38-cp38-win_amd64.whl</code>中，<code>pyWinhook</code>是文件名，<code>cp38</code>表示对应的Python版本（即Python 3.8），<code>win</code>表示操作系统为Windows，<code>amd64</code>表示64位。</p>
]]></content:encoded>
    </item>
    <item>
      <title>鲁棒性和泛化性</title>
      <link>https://ujava.cn/model/robust.html</link>
      <guid>https://ujava.cn/model/robust.html</guid>
      <source url="https://ujava.cn/rss.xml">鲁棒性和泛化性</source>
      <description>1、含义 鲁棒是Robust的音译，也就是健壮和强壮的意思。它也是在异常和危险情况下系统生存的能力。比如说，计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下，能否不死机、不崩溃，就是该软件的[鲁棒性]。所谓“鲁棒性”，也是指控制系统在一定（结构，大小）的参数摄动下，维持其它某些性能的特性。根据对性能的不同定义，可分为稳定鲁棒性和性能鲁棒性。以闭...</description>
      <category>设计模型</category>
      <pubDate>Wed, 22 Jan 2025 10:30:16 GMT</pubDate>
      <content:encoded><![CDATA[<h2>1、含义</h2>
<p>鲁棒是Robust的音译，也就是健壮和强壮的意思。它也是在异常和危险情况下系统生存的能力。比如说，计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下，能否不死机、不崩溃，就是该软件的[鲁棒性]。所谓“鲁棒性”，也是指控制系统在一定（结构，大小）的参数摄动下，维持其它某些性能的特性。根据对性能的不同定义，可分为稳定鲁棒性和性能鲁棒性。以闭环系统的鲁棒性作为目标设计得到的固定控制器称为鲁棒控制器。</p>
<p>鲁棒性包括稳定鲁棒性和品质鲁棒性。一个[控制系统]是否具有鲁棒性，是它能否真正实际应用的关键。因此，现代控制系统的设计已将鲁棒性作为一种最重要的设计指标。</p>
<p>AI模型的鲁棒可以理解为模型对数据变化的容忍度。假设数据出现较小偏差，只对模型输出产生较小的影响，则称模型是鲁棒的。 Huber从稳健统计的角度给出了鲁棒性的3个要求：</p>
<blockquote>
<ol>
<li>模型具有较高的精度或有效性。</li>
<li>对于模型假设出现的较小偏差（noise），只能对算法性能产生较小的影响。</li>
<li>对于模型假设出现的较大偏差（outlier），不能对算法性能产生“灾难性”的影响。</li>
</ol>
</blockquote>
<figure><figcaption>img_19.png</figcaption></figure>
<h2>2、鲁棒性和稳定性的区别</h2>
<p>鲁棒性即稳健性，外延和内涵不一样；稳定性只做本身特性的描述。鲁棒性指一个具体的控制器，如果对一个模型族中的每个对象都能保证反馈系统内稳定，那么就称其为鲁棒稳定的。稳定性指的是系统在某个稳定状态下受到较小的扰动后仍能回到原状态或另一个稳定状态。</p>
<h2>3、鲁棒性和泛化性的区别</h2>
<p>鲁棒性是控制论中的词语，主要指在某些参数略微改变或控制量稍微偏离最优值时系统仍然保持稳定性和有效性。泛化能力指根据有限样本得到的网络模型对其他变量域也有良好的预测能力。根据泛化能力好的网络设计的神经网络控制器的鲁棒性也会有所改善。鲁棒性指自己主动去改变网络中的相关参数，细微地修改(破坏)模型，也能得到理想的效果；而泛化能力是指，在不主动修改(破坏)模型的前提下，被动接受不同的外界输入，都能得到相应的理想的效果。</p>
<h2>4、如何提升模型鲁棒性</h2>
<h3>研究方向</h3>
<p>为了提升模型的鲁棒性, 现在主流的研究大致分为三个方向:<br>
1、修改模型输入数据, 包括在训练阶段修改训练数据以及在测试阶段修改输入的样本数据。<br>
2、修改网络结构, 比如添加更多的网络层数,改变损失函数或激活函数等方法。<br>
3、添加外部模块作为原有网络模型的附加插件, 提升网络模型的鲁棒性。</p>
<h3>常用的方法</h3>
<h4>1、Dropout</h4>
<p>解决的问题：co-adaptation（在神经网络中，隐藏层单元之间有很高的相关性）。Dropout可以看作一个噪声 [公式] 和全连接矩阵 [公式] 作乘积，随机导致一部分连接权重为0。Dropout能够有效缓解神经元之间的co-adaptation（之前一起发挥作用的神经元现在可能单独出现了）。训练时，每次dropout都会得到一个新的子网络。预测时，所有的神经元都会发生作用，可以看作多个子网络的平均。因此dropout类似于bagging和 [公式] 正则，不同之处在于dropout的多个子网络之间共享参数，同时神经元是被随机丢弃的。<br>
</p>
<h4>2、Batch/Layer&nbsp;Normalization</h4>
<p>Normalization将激活层的输入标准化，使得标准化后的输入能够落在激活函数的非饱和区。<br>
</p>
<h4>3、Label Smoothing</h4>
<p>label smoothing就是把原来的one-hot表示，在每一维上都添加了一个随机噪音。这是一种简单粗暴，但又十分有效的方法，目前已经使用在很多的图像分类模型中了。<br>
<br>
<strong>Label Smoothing 优势：</strong></p>
<blockquote>
<p>1、一定程度上，可以缓解模型过于武断的问题，也有一定的抗噪能力<br>
弥补了简单分类中监督信号不足（信息熵比较少）的问题，增加了信息量；<br>
2、提供了训练数据中类别之间的关系（数据增强）；<br>
3、可能增强了模型泛化能力<br>
4、降低feature norm （feature normalization）从而让每个类别的样本聚拢的效果（文章[10]提及）<br>
5、产生更好的校准网络，从而更好地泛化，最终对不可见的生产数据产生更准确的预测。（文章[11]提及）</p>
</blockquote>
<p><strong>Label Smoothing 劣势：</strong></p>
<blockquote>
<p>1、单纯地添加随机噪音，也无法反映标签之间的关系，因此对模型的提升有限，甚至有欠拟合的风险。<br>
2、它对构建将来作为教师的网络没有用处，hard 目标训练将产生一个更好的教师神经网络。（文章[11]提及）</p>
</blockquote>
<h4>4、Mixup</h4>
<p>mixup是一种非常规的数据增强方法，一个和数据无关的简单数据增强原则，其以线性插值的方式来构建新的训练样本和标签。最终对标签的处理如下公式所示，这很简单但对于增强策略来说又很不一般。</p>
<p><br>
( x i , y i ) \left ( x_{i},y_{i} \right )&nbsp;(xi​,yi​),&nbsp;( x j , y j ) \left ( x_{j},y_{j} \right )&nbsp;(xj​,yj​)两个数据对是原始数据集中的训练样本对（训练样本和其对应的标签）。其中&nbsp;λ \lambda&nbsp;λ是一个服从B分布的参数,&nbsp;λ ∼ B e t a ( α , α ) \lambda\sim Beta\left ( \alpha ,\alpha \right )&nbsp;λ∼Beta(α,α)&nbsp;。Beta分布的概率密度函数如下图所示，其中&nbsp;α ∈ [ 0 , + ∞ ] \alpha \in \left [ 0,+\infty \right ]&nbsp;α∈[0,+∞]</p>
<p><br>
因此&nbsp;α \alpha&nbsp;α是一个超参数，随着&nbsp;α \alpha&nbsp;α的增大，网络的训练误差就会增加，而其泛化能力会随之增强。而当&nbsp;α → ∞ \alpha \rightarrow \infty&nbsp;α→∞时，模型就会退化成最原始的训练策略。参考：<a href="https://www.jianshu.com/p/d22fcd86f36d" target="_blank" rel="noopener noreferrer">https://www.jianshu.com/p/d22fcd86f36d</a></p>
<h4>5、半监督学习，利用伪标签增加模型的泛化性</h4>
<h4>6、Focal Loss</h4>
<p>Focal loss 主要是为了解决目标检测中正负样本比例严重失衡的问题，并不是通常的正则化化方法。该损失函数降低了大量简单样本在训练中所占的权重，让模型更加关注困难、错分的样本。<br>
</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python常用库</title>
      <link>https://ujava.cn/python/ku.html</link>
      <guid>https://ujava.cn/python/ku.html</guid>
      <source url="https://ujava.cn/rss.xml">Python常用库</source>
      <description>Python作为一门功能强大的编程语言，拥有丰富的第三方库，能够大大提升开发效率。在本文中，我们将介绍30个实用的[Python库]，并提供相应的实例代码，帮助你更好地掌握它们的用法。 1. NumPy（数值计算）：NumPy是Python科学计算的基础库，提供了高效的多维数组操作功能。示例代码： 2. Pandas（数据分析）：Pandas是处理和分...</description>
      <category>设计Python</category>
      <pubDate>Wed, 22 Jan 2025 10:30:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>Python作为一门功能强大的编程语言，拥有丰富的第三方库，能够大大提升开发效率。在本文中，我们将介绍30个实用的[Python库]，并提供相应的实例代码，帮助你更好地掌握它们的用法。</p>
<p><strong>1. NumPy（数值计算）</strong>：NumPy是Python科学计算的基础库，提供了高效的多维数组操作功能。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import numpy as np``arr = np.array([1, 2, 3, 4, 5])``print(arr.mean())  # 计算平均值</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>2. Pandas（数据分析）</strong>：Pandas是处理和分析数据的强大工具，提供了高效的数据结构和数据操作功能。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import pandas as pd``data = {'Name': ['Tom', 'John', 'Emily'], 'Age': [25, 30, 28]}``df = pd.DataFrame(data)``print(df.head())  # 显示前几行数据</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>3. Matplotlib（数据可视化）</strong>：Matplotlib是一个绘图库，可以创建各种类型的图表和可视化效果。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import matplotlib.pyplot as plt``x = [1, 2, 3, 4, 5]``y = [10, 8, 6, 4, 2]``plt.plot(x, y)``plt.show()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>4. Requests（网络请求）</strong>：Requests库是一个简洁而友好的HTTP请求库，用于发送各种类型的HTTP请求。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import requests``response = requests.get('https://www.example.com')``print(response.status_code)  # 打印状态码</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>5. Beautiful Soup（网页解析）</strong>：Beautiful Soup库是用于解析HTML和XML文档的库，可以方便地提取网页中的数据。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from bs4 import BeautifulSoup``html = '&lt;html&gt;&lt;body&gt;&lt;h1&gt;Hello, World!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;'``soup = BeautifulSoup(html, 'html.parser')``print(soup.h1.text)  # 提取&lt;h1&gt;标签的文本内容</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>6. Scikit-learn（机器学习）</strong>：Scikit-learn是一个流行的机器学习库，提供了丰富的机器学习算法和工具。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from sklearn.linear_model import LinearRegression``   ``   ``X = [[1], [2], [3], [4]]``y = [2, 4, 6, 8]``model = LinearRegression()``model.fit(X, y)``print(model.predict([[5]]))  # 预测新数据</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>7. TensorFlow（深度学习）</strong>：TensorFlow是一个强大的深度学习库，用于构建和训练神经网络模型。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import tensorflow as tf``x = tf.constant(2.0)``y = tf.constant(3.0)``z = tf.add(x, y)``with tf.Session() as sess:`    `result = sess.run(z)``print(result)  # 执行计算并打印结果</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>8. Flask（Web开发）</strong>：Flask是一个简单易用的Web开发框架，用于构建Web应用程序。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from flask import Flask``app = Flask(__name__)``@app.route('/')``def hello():`    `return 'Hello, World!'``if __name__ == '__main__':`    `app.run()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>9. Django（Web开发）</strong>：Django是一个功能强大的Web开发框架，提供了许多用于快速开发Web应用程序的工具和功能。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from django.http import HttpResponse``   ``   ``def hello(request):`    `return HttpResponse('Hello, World!')</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>10. SQLAlchemy（数据库操作）</strong>：SQLAlchemy是一个Python SQL工具包和对象关系映射器，用于简化数据库操作。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from sqlalchemy import create_engine, Column, Integer, String``from sqlalchemy.ext.declarative import declarative_base``Base = declarative_base()``class User(Base):`    `__tablename__ = 'users'`    `id = Column(Integer, primary_key=True)`    `name = Column(String)``engine = create_engine('sqlite:///database.db')``Base.metadata.create_all(engine)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>11. Celery（任务队列）</strong>：Celery是一个分布式任务队列，用于处理异步任务和定时任务。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from celery import Celery``app = Celery('tasks', broker='redis://localhost:6379/0')``@app.task``def add(x, y):`    `return x + y</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>12. Pillow（图像处理）</strong>：Pillow库是一个图像处理库，提供了各种图像处理功能，如裁剪、缩放、滤镜等。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from PIL import Image``image = Image.open('image.jpg')``image.thumbnail((200, 200))``image.save('thumbnail.jpg')</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>13. Pygame（游戏开发）</strong>：Pygame是一个用于开发2D游戏的库，提供了游戏开发所需的各种功能和工具。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import pygame``pygame.init()``screen = pygame.display.set_mode((800, 600))``running = True``while running:`    `for event in pygame.event.get():`        `if event.type == pygame.QUIT:`            `running = False`    `screen.fill((255, 255, 255))`    `pygame.display.flip()``pygame.quit()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>14. OpenCV（计算机视觉）</strong>：OpenCV是一个计算机视觉库，提供了各种图像处理和计算机视觉算法。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import cv2``image = cv2.imread('image.jpg')``gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)``cv2.imshow('Gray Image', gray)``cv2.waitKey(0)``cv2.destroyAllWindows()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>15. PyTorch（深度学习）</strong>：PyTorch是一个开源的深度学习库，提供了灵活的神经网络构建和训练功能。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import torch``x = torch.tensor([1, 2, 3])``y = torch.tensor([4, 5, 6])``z = x + y``print(z)  # 打印张量相加的结果</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>16. Redis（缓存和消息队列）</strong>：Redis是一个快速的键值存储数据库，常用于缓存和消息队列的实现。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import redis``r = redis.Redis(host='localhost', port=6379, db=0)``r.set('key', 'value')``print(r.get('key'))  # 获取键对应的值</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>17. Twisted（异步网络编程）</strong>：Twisted是一个事件驱动的网络编程框架，用于构建高性能的异步网络应用程序。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from twisted.internet import reactor``from twisted.web.client import getPage``   ``   ``def callback(result):`    `print(result)``   ``   ``getPage('https://www.example.com').addCallback(callback)``reactor.run()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>18. PyPDF2（PDF处理）</strong>：PyPDF2库是用于处理PDF文件的库，可以提取文本、合并、拆分和加密PDF文件。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import PyPDF2``pdf = open('document.pdf', 'rb')``reader = PyPDF2.PdfReader(pdf)``page = reader.pages[0]``text = page.extract_text()``print(text)  # 提取第一页的文本内容``pdf.close()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ol start="19">
<li>Faker（数据生成）：Faker库是用于生成测试数据的库，可以生成各种类型的随机数据。示例代码：</li>
</ol>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from faker import Faker``fake = Faker()``print(fake.name())  # 生成随机姓名</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>20. Pygame Zero（简化游戏开发）</strong>：Pygame Zero是一个简化游戏开发的库，提供了易于使用的API和工具。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import pgzrun``def draw():`    `screen.fill((255, 255, 255))``pgzrun.go()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>21. NetworkX（图论与复杂网络）</strong>：NetworkX是一个用于创建、操作和研究复杂网络的库。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import networkx as nx``G = nx.Graph()``G.add_edge('A', 'B')``G.add_edge('B', 'C')``print(G.nodes())  # 打印节点列表</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>22. Pytest（单元测试）</strong>：Pytest是一个简单而强大的Python测试框架，用于编写和运行单元测试。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>def add(x, y):`    `return x + y``   ``   ``def test_add():`    `assert add(2, 3) == 5</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>23. PyYAML（YAML解析）</strong>：PyYAML是一个用于解析和生成YAML数据的库，可以方便地处理YAML格式的配置文件。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import yaml``config = yaml.load(open('config.yaml'))``print(config['name'])  # 打印配置文件中的名称</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ol start="24">
<li>PyMongo（MongoDB操作）：PyMongo是一个用于操作MongoDB数据库的库，提供了方便的API和工具。示例代码：</li>
</ol>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from pymongo import MongoClient``   ``   ``client = MongoClient('mongodb://localhost:27017/')``db = client['test']``collection = db['users']``users = collection.find()``for user in users:`    `print(user['name'])</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>25. PyInstaller（打包应用程序）</strong>：PyInstaller是一个用于将Python应用程序打包成独立可执行文件的库。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span># 打包成可执行文件``pyinstaller myscript.py``# 运行可执行文件``dist/myscript/myscript</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>26. Gensim（文本处理与主题建模）</strong>：Gensim是一个用于文本处理和主题建模的库，提供了各种文本分析和建模算法。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from gensim.models import Word2Vec``sentences = [['I', 'love', 'Python'], ['Python', 'is', 'great']]``model = Word2Vec(sentences, min_count=1)``print(model.wv['Python'])  # 打印词向量</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>27. Pygame-sdl2（跨平台游戏开发）</strong>：Pygame-sdl2是一个基于SDL2的跨平台游戏开发库，提供了更好的性能和兼容性。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import pygame_sdl2 as pygame``pygame.init()``screen = pygame.display.set_mode((800, 600))``running = True``while running:`    `for event in pygame.event.get():`        `if event.type == pygame.QUIT:`            `running = False`    `screen.fill((255, 255, 255))`    `pygame.display.flip()``pygame.quit()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>28. PyTesseract（OCR文本识别）</strong>：PyTesseract是一个用于OCR文本识别的库，可以从图像中提取文本信息。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import pytesseract``from PIL import Image``   ``   ``image = Image.open('image.png')``text = pytesseract.image_to_string(image)``print(text)  # 提取图像中的文本信息</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>29. Pygame_gui（游戏界面开发）</strong>：Pygame_gui是一个用于游戏界面开发的库，提供了创建游戏界面和用户界面的工具和组件。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import pygame``import pygame_gui``pygame.init()``screen = pygame.display.set_mode((800, 600))``manager = pygame_gui.UIManager((800, 600))``button = pygame_gui.elements.UIButton(relative_rect=pygame.Rect((350, 275), (100, 50)), text='Click Me!', manager=manager)``running = True``while running:`    `for event in pygame.event.get():`        `if event.type == pygame.QUIT:`            `running = False`        `manager.process_events(event)`    `manager.update(1 / 60.0)`    `screen.fill((255, 255, 255))`    `manager.draw_ui(screen)`    `pygame.display.flip()``pygame.quit()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>30. PySide（GUI应用程序开发）：</strong>：PySide是一个用于创建GUI应用程序的库，提供了丰富的GUI组件和功能。示例代码：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>from PySide6.QtWidgets import QApplication, QLabel``   ``   ``app = QApplication([])``label = QLabel('Hello, World!')``label.show()``app.exec()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>大模型命名中的B是什么意思</title>
      <link>https://ujava.cn/model/b.html</link>
      <guid>https://ujava.cn/model/b.html</guid>
      <source url="https://ujava.cn/rss.xml">大模型命名中的B是什么意思</source>
      <description>字母&amp;quot;B&amp;quot;通常代表“Billion”，即“十亿”。这是模型训练中所使用到参数的数量。 例如，GPT-3模型有175B个参数，这里的“175B”就是表示该模型有1750亿个参数。参数越多，代表模型训练的越复杂，模型的能力也就越强。 通常1B，意味着需要1G以上的内存，7B需要8G以上的内存才能成功运行大模型。</description>
      <category>设计模型</category>
      <pubDate>Thu, 19 Dec 2024 12:45:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>字母"B"通常代表“Billion”，即“十亿”。这是模型训练中所使用到参数的数量。</p>
<p>例如，GPT-3模型有175B个参数，这里的“175B”就是表示该模型有1750亿个参数。参数越多，代表模型训练的越复杂，模型的能力也就越强。</p>
<p>通常1B，意味着需要1G以上的内存，7B需要8G以上的内存才能成功运行大模型。</p>
]]></content:encoded>
    </item>
    <item>
      <title>SFT（Supervised Fine-Tuning）</title>
      <link>https://ujava.cn/model/sft.html</link>
      <guid>https://ujava.cn/model/sft.html</guid>
      <source url="https://ujava.cn/rss.xml">SFT（Supervised Fine-Tuning）</source>
      <description>1.SFT 监督微调 1.1 SFT 监督微调基本概念 SFT（Supervised Fine-Tuning）监督微调是指在源数据集上预训练一个神经网络模型，即源模型。然后创建一个新的神经网络模型，即目标模型。目标模型复制了源模型上除了输出层外的所有模型设计及其参数。这些模型参数包含了源数据集上学习到的知识，且这些知识同样适用于目标数据集。源模型的输出...</description>
      <category>设计模型</category>
      <pubDate>Thu, 19 Dec 2024 12:45:34 GMT</pubDate>
      <content:encoded><![CDATA[<h2>1.SFT 监督微调</h2>
<h3>1.1 SFT 监督微调基本概念</h3>
<p>SFT（Supervised Fine-Tuning）监督微调是指在源数据集上预训练一个神经网络模型，即源模型。然后创建一个新的神经网络模型，即目标模型。目标模型复制了源模型上除了输出层外的所有模型设计及其参数。这些模型参数包含了源数据集上学习到的知识，且这些知识同样适用于目标数据集。源模型的输出层与源数据集的标签紧密相关，因此在目标模型中不予采用。微调时，为目标模型添加一个输出大小为目标数据集类别个数的输出层，并随机初始化该层的模型参数。在目标数据集上训练目标模型时，将从头训练到输出层，其余层的参数都基于源模型的参数微调得到。</p>
<h3>1.2 监督微调的步骤</h3>
<p>具体来说，监督式微调包括以下几个步骤：</p>
<ul>
<li><strong>预训练：</strong> 首先在一个大规模的数据集上训练一个深度学习模型，例如使用自监督学习或者无监督学习算法进行预训练；</li>
<li><strong>微调：</strong> 使用目标任务的训练集对预训练模型进行微调。通常，只有预训练模型中的一部分层被微调，例如只微调模型的最后几层或者某些中间层。在微调过程中，通过反向传播算法对模型进行优化，使得模型在目标任务上表现更好；</li>
<li><strong>评估：</strong> 使用目标任务的测试集对微调后的模型进行评估，得到模型在目标任务上的性能指标。</li>
</ul>
<h3>1.3 监督微调的特点</h3>
<p>监督式微调能够利用预训练模型的参数和结构，避免从头开始训练模型，从而加速模型的训练过程，并且能够提高模型在目标任务上的表现。监督式微调在计算机视觉、[自然语言处理]等领域中得到了广泛应用。然而监督也存在一些缺点。首先，需要大量的标注数据用于目标任务的微调，如果标注数据不足，可能会导致微调后的模型表现不佳。其次，由于预训练模型的参数和结构对微调后的模型性能有很大影响，因此选择合适的预训练模型也很重</p>
]]></content:encoded>
    </item>
    <item>
      <title>CV（Computer Vision）</title>
      <link>https://ujava.cn/model/cv.html</link>
      <guid>https://ujava.cn/model/cv.html</guid>
      <source url="https://ujava.cn/rss.xml">CV（Computer Vision）</source>
      <description>‌CV大模型是计算机视觉（Computer Vision）大模型的缩写‌。计算机视觉（CV）是指让计算机拥有类似于人类视觉感知和理解的能力，而CV大模型则是指在计算机视觉领域中，采用大规模神经网络模型进行图像识别、目标检测、图像生成等任务的算法。这类模型通常具有参数量巨大、计算复杂度高、训练数据量庞大的特点‌。 CV大模型的定义和特点 ‌定义‌：CV大...</description>
      <category>设计模型</category>
      <pubDate>Mon, 16 Dec 2024 10:28:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>‌<strong>CV大模型是计算机视觉（Computer Vision）大模型的缩写</strong>‌。计算机视觉（CV）是指让计算机拥有类似于人类视觉感知和理解的能力，而CV大模型则是指在计算机视觉领域中，采用大规模神经网络模型进行图像识别、目标检测、图像生成等任务的算法。这类模型通常具有参数量巨大、计算复杂度高、训练数据量庞大的特点‌。</p>
<h3>CV大模型的定义和特点</h3>
<ol>
<li>‌<strong>定义</strong>‌：CV大模型指的是在计算机视觉领域，采用大规模神经网络模型进行图像识别、目标检测、图像生成等任务的算法。这类模型通常具有参数量巨大、计算复杂度高、训练数据量庞大的特点‌。</li>
<li>‌<strong>技术特点</strong>‌：
<ul>
<li>‌<strong>参数量巨大</strong>‌：大模型通常具有上亿甚至百亿级别的参数量，这使得模型具有更强的表达能力‌。</li>
<li>‌<strong>计算复杂度高</strong>‌：在训练和推理过程中，计算量较大，对硬件设备提出了更高的要求‌。</li>
<li>‌<strong>数据依赖性</strong>‌：大模型需要大量的训练数据，以充分学习数据的分布特征‌。</li>
<li>‌<strong>模型压缩与加速</strong>‌：为了满足实际应用需求，研究人员需要对大模型进行压缩和加速，如知识蒸馏、模型剪枝等‌。</li>
</ul>
</li>
</ol>
<h3>CV大模型的应用场景和发展趋势</h3>
<ol>
<li>‌<strong>应用场景</strong>‌：CV大模型广泛应用于图像识别、目标检测、图像生成等领域，能够处理复杂的视觉任务，提高图像识别的准确性和效率‌。</li>
<li>‌<strong>发展趋势</strong>‌：
<ul>
<li>‌<strong>模型结构优化</strong>‌：研究人员将继续探索更高效的神经网络结构，以提高模型性能和降低计算复杂度‌。</li>
<li>‌<strong>多模态学习</strong>‌：结合文本、音频等多模态信息，提升计算机视觉任务的泛化能力和准确性‌。</li>
<li>‌<strong>小样本学习</strong>‌：研究在小样本情况下，如何利用大模型的优势，提高图像识别等任务的性能‌。</li>
</ul>
</li>
</ol>
<p>CV大模型是指用于计算机视觉任务的大型深度学习模型，通常采用卷积神经网络（Convolutional Neural Network，CNN）等深度学习算法来实现。</p>
<p>近年来，随着深度学习技术的发展和计算能力的提升，CV大模型在计算机视觉领域取得了很多重要成果，例如图像分类、目标检测、图像分割等任务。CV大模型的基本思想是通过学习从输入图像到输出结果的映射，将输入图像转换为输出结果，例如识别图像中的物体类别或位置等信息。</p>
<p>目前，一些著名的CV大模型包括ResNet、Inception、VGG、EfficientNet、MobileNet等。这些模型都采用了不同的架构和优化技术，以提高其计算效率和精度。</p>
<p>CV大模型的优势在于可以自动地从输入图像中提取特征，并生成高质量的图像结果。这使得它们可以应用于很多需要处理大量图像数据的场景，例如自动驾驶、人脸识别、安防监控、医疗图像分析等领域。</p>
<p>然而，CV大模型也存在一些问题和局限性。例如，它们需要大量的计算资源和数据支持，而且在面对一些特定场景和数据时表现不佳。此外，CV大模型的计算复杂度很高，因此在某些场景下可能会不太实用。</p>
]]></content:encoded>
    </item>
    <item>
      <title>NLP（Natural Language Processing）</title>
      <link>https://ujava.cn/model/nlp.html</link>
      <guid>https://ujava.cn/model/nlp.html</guid>
      <source url="https://ujava.cn/rss.xml">NLP（Natural Language Processing）</source>
      <description>自然语言处理（NLP, Natural Language Processing）大模型是人工智能领域的一个重要分支，专注于让计算机能够理解、生成和处理人类语言。这些大模型通常拥有海量的参数，通过深度学习和大规模数据集的训练，实现了对语言的深入理解和高效处理。以下是对[NLP]大模型的详细介绍： 一、NLP大模型的主要类型 GPT系列 GPT（Gener...</description>
      <category>设计模型</category>
      <pubDate>Mon, 16 Dec 2024 10:28:10 GMT</pubDate>
      <content:encoded><![CDATA[<p><strong>自然语言处理（NLP, Natural Language Processing）大模型</strong>是人工智能领域的一个重要分支，专注于让计算机能够理解、生成和处理人类语言。这些大模型通常拥有海量的参数，通过深度学习和大规模数据集的训练，实现了对语言的深入理解和高效处理。以下是对[NLP]大模型的详细介绍：</p>
<h4>一、NLP大模型的主要类型</h4>
<ol>
<li><strong>GPT系列</strong>
<ul>
<li><strong>GPT（Generative Pre-trained Transformer）</strong>：由OpenAI开发的一系列NLP大模型，采用多层Transformer结构来预测下一个单词的概率分布。该系列模型通过预训练学习到语言模式，并能在多种NLP任务上表现出色。
<ul>
<li><strong>GPT-1</strong>：发布于2018年，参数规模为1.17亿，是GPT系列的开山之作。</li>
<li><strong>GPT-2</strong>：发布于2019年，参数规模提升至15亿，生成的文本质量更高、更自然流畅，能够生成更长的文本段落。</li>
<li><strong>GPT-3</strong>：发布于2020年，参数规模达到惊人的1750亿，是迄今为止最大的NLP模型之一。GPT-3在自然语言处理方面的表现十分出色，可以完成文本自动补全、将网页描述转换为相应代码、模仿人类叙事等多种任务。此外，GPT-3还具备零样本学习的能力，即在没有进行监督训练的情况下，可以生成合理的文本结果。</li>
<li><strong>GPT-4</strong>：发布于2023年，是一个大型多模态模型，支持图像和文本输入，再输出文本回复。GPT-4在多个专业和学术测试中表现出色，甚至在某些测试中达到了专业人士的水平。</li>
</ul>
</li>
</ul>
</li>
<li><strong>BERT（Bidirectional Encoder Representations from Transformers）</strong>
<ul>
<li>由谷歌在2018年提出，是一种基于Transformer的双向编码器的表示学习模型。BERT通过预训练任务（如掩码语言模型和下一句预测）学习了大量的语言知识，并在多个NLP任务上刷新了记录。BERT的双向编码器结构使其能够同时考虑上下文信息，从而提高了模型的性能。</li>
</ul>
</li>
</ol>
<h4>二、NLP大模型的技术特点</h4>
<ol>
<li>
<p><strong>参数规模庞大</strong>：NLP大模型通常拥有数十亿甚至数千亿个参数，这使得它们能够存储和处理更多的信息，从而更准确地捕捉语言中的复杂模式和特征。</p>
</li>
<li>
<p><strong>深度学习能力</strong>：这些模型利用深度学习技术，通过多层神经网络和大量的训练数据来学习语言的表示和生成。这种学习方式使得模型能够自动发现语言中的规律和模式，并用于处理各种NLP任务。</p>
</li>
<li>
<p><strong>泛化能力强</strong>：由于NLP大模型在训练过程中接触了大量的数据，它们通常具有较强的泛化能力，即能够对未见过的数据做出准确的预测和处理。</p>
</li>
<li>
<p><strong>多任务处理能力</strong>：一些NLP大模型（如GPT系列和BERT）被设计为可以处理多种NLP任务。它们通过微调（Fine-tuning）的方式，在保持模型结构不变的情况下，针对不同的任务进行适应性调整。</p>
</li>
</ol>
<h4>三、NLP大模型的应用场景</h4>
<p>NLP大模型在多个领域都有广泛的应用场景，包括但不限于：</p>
<ol>
<li>
<p><strong>机器翻译</strong>：利用NLP大模型进行高效的机器翻译，实现不同语言之间的快速转换。</p>
</li>
<li>
<p><strong>文本分类</strong>：对文本进行自动分类，如新闻分类、情感分析等。</p>
</li>
<li>
<p><strong>问答系统</strong>：根据用户的问题自动生成答案，提供便捷的信息查询服务。</p>
</li>
<li>
<p><strong>文本生成</strong>：根据给定的上下文或指令生成连贯、自然的文本，如文章写作、摘要生成等。</p>
</li>
<li>
<p><strong>对话系统</strong>：构建智能对话系统，实现人机之间的自然交互。</p>
</li>
</ol>
<h4>四、面临的挑战</h4>
<p>尽管NLP大模型在多个方面取得了显著进展，但它们也面临着一些挑战：</p>
<ol>
<li>
<p><strong>算力要求高</strong>：NLP大模型的训练需要大量的计算资源和时间，这对硬件设备和训练环境提出了很高的要求。</p>
</li>
<li>
<p><strong>数据隐私和安全性</strong>：在处理敏感信息时，如何保护用户数据隐私和模型安全性是一个重要问题。</p>
</li>
<li>
<p><strong>模型可解释性</strong>：由于NLP大模型通常具有复杂的结构和大量的参数，它们的决策过程往往难以解释和理解。这在一定程度上限制了模型的可信度和可用性。</p>
</li>
</ol>
<p>综上所述，NLP大模型是[自然语言处理]领域的重要技术成果之一，它们在多个方面都具有广泛的应用前景。然而，我们也需要关注并解决它们面临的挑战和问题，以推动NLP技术的持续发展和创新。</p>
<p><strong>计算机视觉（CV）大模型</strong>是指用于计算机视觉任务的大型深度学习模型，它们通常采用卷积神经网络（Convolutional Neural Network, CNN）等深度学习算法来实现。随着深度学习技术的发展和计算能力的提升，CV大模型在计算机视觉领域取得了许多重要成果，广泛应用于图像分类、目标检测、图像分割、人脸识别等多个领域。</p>
<h4>一、CV大模型的特点</h4>
<ol>
<li><strong>大规模参数</strong>：CV大模型通常拥有数以亿计的参数，能够在海量数据中提取特征并进行高效识别。</li>
<li><strong>强大的特征提取能力</strong>：通过深度学习算法，CV大模型能够自动从输入图像中提取高级特征，这些特征对于后续的图像处理和识别任务至关重要。</li>
<li><strong>高准确率</strong>：在多个计算机视觉任务中，CV大模型表现出了超越传统方法的性能，具有较高的准确率。</li>
<li><strong>泛化能力强</strong>：经过大规模数据集的训练，CV大模型能够较好地适应未见过的数据，表现出较强的泛化能力。</li>
</ol>
<h4>二、CV大模型的常见类型</h4>
<ol>
<li><strong>ResNet（残差网络）</strong>：由微软研究院的何恺明等人提出，通过引入残差学习解决了深度神经网络的退化问题，使得网络可以训练得更深，从而提高了模型的性能。</li>
<li><strong>Inception（Inception网络）</strong>：由谷歌提出，通过在网络中并行使用不同大小的卷积核来捕捉不同尺度的特征，提高了模型的表达能力和计算效率。</li>
<li><strong>VGG（VGG网络）</strong>：由牛津大学的视觉几何组（Visual Geometry Group）提出，通过堆叠多个小卷积核的卷积层来构建网络，展示了深度对于提高模型性能的重要性。</li>
<li><strong>EfficientNet（高效网络）</strong>：由谷歌提出，通过综合考虑模型的深度、宽度和分辨率等维度，实现了在相同计算资源下更高的效率和精度。</li>
<li><strong>MobileNet（移动网络）</strong>：专为移动和嵌入式设备设计，通过采用深度可分离卷积等轻量化技术，减少了模型的参数量和计算量，提高了模型的实用性。</li>
</ol>
<h4>三、CV大模型的应用场景</h4>
<ol>
<li><strong>图像分类</strong>：将输入图像划分为不同的类别，如动植物、风景、建筑等。</li>
<li><strong>目标检测</strong>：在图像中准确地识别并定位出感兴趣的目标，如行人、车辆、人脸等。</li>
<li><strong>图像分割</strong>：将图像中的每个像素分配给相应的类别，实现图像的精细分割。</li>
<li><strong>人脸识别</strong>：通过训练大量人脸数据，实现对人脸的高效、准确识别，应用于身份验证、安全监控等场景。</li>
<li><strong>自动驾驶</strong>：利用CV大模型进行道路识别、车辆检测、行人检测等任务，提高自动驾驶系统的安全性和可靠性。</li>
</ol>
<h4>四、CV大模型的挑战与未来</h4>
<p>尽管CV大模型在计算机视觉领域取得了显著进展，但它们仍面临一些挑战，如计算量大、训练时间长、调参难度高等。未来，随着计算资源的不断丰富和算法的持续创新，CV大模型有望在更多领域大放异彩。同时，跨模态融合、端到端学习、可解释性研究等方向也将成为CV大模型未来的重要发展趋势。</p>
<p>综上所述，CV大模型作为计算机视觉领域的重要技术成果之一，正逐步改变着我们的生活和工作方式。随着技术的不断进步和应用场景的不断拓展，相信CV大模型将在未来发挥更加重要的作用。</p>
<p><strong>多模态大模型</strong>是指一种能够处理多种媒体数据（如文本、图像、音频、视频等）的深度学习模型。这些模型能够从不同的数据模态中学习到它们的共同语义，从而实现不同模态之间的跨媒体理解和生成。以下是对[多模态]大模型的详细介绍：</p>
<h4>一、定义与特点</h4>
<p><strong>定义</strong>：多模态大模型是深度学习领域的一个重要分支，旨在整合并处理来自不同模态的信息，如文本、图像、音频和视频等，以实现更全面、准确的任务处理。</p>
<p><strong>特点</strong>：</p>
<ol>
<li><strong>多模态处理能力</strong>：能够同时处理并融合多种模态的数据，如文本和图像、音频和视频等。</li>
<li><strong>跨模态理解和生成</strong>：能够在不同模态之间建立联系，实现信息的有效传递和利用，从而进行跨模态的理解和生成。</li>
<li><strong>大规模参数</strong>：通常拥有数十亿甚至数千亿个参数，以捕捉复杂的数据模式和特征。</li>
<li><strong>自监督学习与预训练</strong>：多采用自监督学习的方式进行训练，通过海量无标注数据进行预训练，再使用少量有标注数据进行微调。</li>
</ol>
<h4>二、技术原理</h4>
<p><strong>核心算法步骤</strong>：</p>
<ol>
<li><strong>模态预处理</strong>：对不同模态的数据进行预处理，如图像的特征提取、文本的词向量化等。</li>
<li><strong>模态融合</strong>：将预处理后的模态特征整合到统一的空间中，通常采用注意力机制、加权合并等方式。</li>
<li><strong>联合学习</strong>：基于融合后的特征进行联合训练，提升模型在多模态数据上的表现。</li>
<li><strong>跨模态推理</strong>：在训练过程中，引入跨模态的损失函数，促进模态之间的信息共享和互补。</li>
</ol>
<p><strong>关键技术</strong>：</p>
<ul>
<li><strong>注意力机制</strong>：在多模态融合过程中，通过注意力机制关注重要信息，忽略不相关信息，提高模型性能。</li>
<li><strong>预训练模型</strong>：利用海量无标注数据进行预训练，获得良好的初始化参数，有助于后续任务的快速收敛。</li>
<li><strong>跨模态损失函数</strong>：设计同时考虑不同模态损失的损失函数，促进模型在多模态数据上的学习。</li>
</ul>
<h4>三、应用场景</h4>
<p>多模态大模型具有广泛的应用场景，包括但不限于：</p>
<ol>
<li><strong>智能客服与语音助手</strong>：通过融合文本和语音信息，提供更自然、流畅的交互体验。</li>
<li><strong>医疗诊断</strong>：结合图像和文本信息，提高疾病检测和病理分析的准确性。</li>
<li><strong>教育转型</strong>：利用多模态数据丰富教学内容，提升学习体验。</li>
<li><strong>机器人助手</strong>：融合视觉、听觉和触觉等多模态信息，提升机器人的智能水平和任务执行能力。</li>
<li><strong>智能交通与安防</strong>：通过多模态数据分析，提高交通系统的安全性和效率，增强安防系统的监控能力。</li>
</ol>
<h4>四、挑战与未来</h4>
<p>尽管多模态大模型在多个领域取得了显著进展，但它们仍面临一些挑战：</p>
<ol>
<li><strong>数据不一致性</strong>：不同模态的数据在质量、格式和分布上存在差异，如何有效整合这些数据是一个难题。</li>
<li><strong>模态间的语义鸿沟</strong>：不同模态之间的语义理解和表示存在差异，如何实现跨模态的语义对齐是一个挑战。</li>
<li><strong>计算效率和存储问题</strong>：多模态大模型需要处理大量数据，对计算资源和存储能力提出了更高要求。</li>
</ol>
<p>未来，随着技术的不断进步和算法的优化，多模态大模型有望在更多领域得到应用，并推动人工[智能技术]的进一步发展。同时，如何解决上述挑战也是该领域需要进一步研究和探讨的重要方向。</p>
]]></content:encoded>
    </item>
    <item>
      <title>OCR（Optical Character Recognition）</title>
      <link>https://ujava.cn/model/ocr.html</link>
      <guid>https://ujava.cn/model/ocr.html</guid>
      <source url="https://ujava.cn/rss.xml">OCR（Optical Character Recognition）</source>
      <description>‌OCR大模型（Optical Character Recognition，光学字符识别）是一种将图像中的文字转换为机器编码文本的技术‌。它通过扫描或拍照的方式将纸质文档中的文字转换为电子格式，便于编辑、存储和检索。OCR技术在许多领域都有广泛应用，如数据录入、文献数字化、辅助阅读设备等。 OCR大模型的工作原理 OCR大模型的工作原理主要包括以下几个...</description>
      <category>设计模型</category>
      <pubDate>Mon, 16 Dec 2024 10:28:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>‌<strong>OCR大模型（Optical Character Recognition，光学字符识别）是一种将图像中的文字转换为机器编码文本的技术</strong>‌。它通过扫描或拍照的方式将纸质文档中的文字转换为电子格式，便于编辑、存储和检索。OCR技术在许多领域都有广泛应用，如数据录入、文献数字化、辅助阅读设备等。</p>
<h3>OCR大模型的工作原理</h3>
<p>OCR大模型的工作原理主要包括以下几个步骤：</p>
<ol>
<li>‌<strong>去噪声</strong>‌：使用滤波器（如中值滤波器、高斯滤波器）减少图像中的噪声，如尘埃、划痕等。</li>
<li>‌<strong>灰度化</strong>‌：将彩色图像转化为灰度图像，降低计算复杂度同时保留主要信息。</li>
<li>‌<strong>二值化</strong>‌：将图像转换为只包含黑白两色的图像，通过设定阈值强化文字与背景的对比度。</li>
<li>‌<strong>去斜和校正</strong>‌：自动纠正图像中的扭曲和倾斜，确保文本的正确识别‌3。</li>
</ol>
<h3>OCR大模型的应用场景</h3>
<p>OCR技术广泛应用于多个领域：</p>
<ul>
<li>‌<strong>数据录入</strong>‌：自动读取纸质文档中的文字信息，提高数据录入效率。</li>
<li>‌<strong>文献数字化</strong>‌：将纸质文献转化为电子格式，方便存储和检索。</li>
<li>‌<strong>辅助阅读设备</strong>‌：帮助视力障碍者阅读纸质书籍和文档。</li>
<li>‌<strong>银行票据处理</strong>‌：自动识别和处理银行票据中的文字信息。</li>
<li>‌<strong>车牌识别</strong>‌：在交通管理中识别车牌号码‌。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>POC（Proof of Concept）</title>
      <link>https://ujava.cn/model/poc.html</link>
      <guid>https://ujava.cn/model/poc.html</guid>
      <source url="https://ujava.cn/rss.xml">POC（Proof of Concept）</source>
      <description>‌POC（Proof of Concept）大模型‌是指在进行大规模应用之前，通过概念验证（Proof of Concept，简称POC）来测试大模型在实际应用中的可行性和效果。POC测试是大模型落地应用的重要环节，旨在验证大模型在特定场景下的性能和稳定性，确保其在正式部署前能够满足业务需求。 POC测试在大模型落地中的应用 ‌验证大模型的性能和稳定性...</description>
      <category>设计模型</category>
      <pubDate>Mon, 16 Dec 2024 10:28:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>‌<strong>POC（Proof of Concept）大模型</strong>‌是指在进行大规模应用之前，通过概念验证（Proof of Concept，简称POC）来测试大模型在实际应用中的可行性和效果。POC测试是大模型落地应用的重要环节，旨在验证大模型在特定场景下的性能和稳定性，确保其在正式部署前能够满足业务需求。</p>
<h3>POC测试在大模型落地中的应用</h3>
<ol>
<li>‌<strong>验证大模型的性能和稳定性</strong>‌：通过POC测试，可以评估大模型在处理特定任务时的准确性和效率，确保其在正式环境中能够稳定运行。</li>
<li>‌<strong>优化大模型的参数和架构</strong>‌：根据POC测试的结果，可以对大模型的参数和架构进行优化，提高其在实际应用中的表现。</li>
<li>‌<strong>降低风险</strong>‌：POC测试可以帮助发现潜在的问题和缺陷，从而在正式部署前进行修正，降低项目风险。</li>
</ol>
<h3>POC测试的具体流程</h3>
<ol>
<li>‌<strong>需求分析</strong>‌：明确测试的目标和场景，确定需要验证的功能和性能指标。</li>
<li>‌<strong>环境搭建</strong>‌：搭建测试环境，包括硬件和软件资源的准备。</li>
<li>‌<strong>测试设计</strong>‌：设计测试用例和测试场景，确保覆盖大模型的主要功能和边界情况。</li>
<li>‌<strong>执行测试</strong>‌：按照测试用例执行测试，记录测试结果和数据。</li>
<li>‌<strong>结果分析</strong>‌：对测试结果进行分析，评估大模型的性能和稳定性。</li>
<li>‌<strong>优化和调整</strong>‌：根据测试结果对大模型进行优化和调整，确保其满足业务需求。</li>
<li>‌<strong>报告撰写</strong>‌：撰写POC测试报告，总结测试结果和建议。</li>
</ol>
<p>通过以上流程，可以有效地进行大模型的POC测试，确保其在正式部署前的可靠性和稳定性。</p>
]]></content:encoded>
    </item>
    <item>
      <title>向量数据库</title>
      <link>https://ujava.cn/model/vectordatabase.html</link>
      <guid>https://ujava.cn/model/vectordatabase.html</guid>
      <source url="https://ujava.cn/rss.xml">向量数据库</source>
      <description>1、Chroma img_8.pngimg_8.png 关键词： 轻量级、易用性、开源 功能特性：快速搭建小型语义搜索 提供高效的近似最近邻搜索（ANN） 支持多种向量数据类型和索引方法 易于集成到现有的应用程序中 适用于小型到中型数据集 应用系统：小型语义搜索原型、研究或教学项目 推荐指数：⭐⭐⭐（适合初学者和小型项目） Chroma是一个轻量级、易...</description>
      <category>设计模型</category>
      <pubDate>Mon, 16 Dec 2024 10:28:10 GMT</pubDate>
      <content:encoded><![CDATA[<h3>1、Chroma</h3>
<figure><figcaption>img_8.png</figcaption></figure>
<p><strong>关键词：</strong>&nbsp;轻量级、易用性、开源</p>
<p>功能特性：快速搭建小型语义搜索</p>
<ol>
<li>
<p>提供高效的近似最近邻搜索（ANN）</p>
</li>
<li>
<p>支持多种向量数据类型和索引方法</p>
</li>
<li>
<p>易于集成到现有的应用程序中</p>
</li>
<li>
<p>适用于小型到中型数据集</p>
</li>
</ol>
<p>应用系统：小型语义搜索原型、研究或教学项目</p>
<p><strong>推荐指数：⭐⭐⭐（适合初学者和小型项目）</strong></p>
<p>Chroma是一个<strong>轻量级、易用的向量数据库</strong>，专注于提供<strong>高效的近似最近邻搜索（ANN）</strong>。它支持多种向量数据类型和索引方法，使得用户可以轻松集成到现有的应用程序中。<strong>Chroma特别适用于小型到中型数据集</strong>，是初学者和小型项目的理想选择。通过Chroma，用户可以快速构建语义搜索原型、研究或教学项目，并实现准确的数据匹配和检索。</p>
<h3>2、Pinecone</h3>
<figure><figcaption>img_9.png</figcaption></figure>
<p><strong>关键词：</strong>&nbsp;实时性、高性能、可扩展</p>
<p><strong>功能特性：</strong>&nbsp;大规模数据集上的实时搜索</p>
<ol>
<li>
<p>亚秒级的查询响应时间</p>
</li>
<li>
<p>支持大规模向量集的高效索引和检索</p>
</li>
<li>
<p>提供高度可伸缩的分布式架构</p>
</li>
<li>
<p>适用于实时推荐和内容检索场景</p>
</li>
</ol>
<p><strong>应用系统：</strong>&nbsp;实时推荐系统、大规模电商搜索引擎、社交媒体内容过滤</p>
<p><strong>推荐指数：⭐⭐⭐⭐⭐（适合需要高性能和实时性的大型应用）</strong></p>
<p>Pinecone是一个<strong>实时、高性能的向量数据库</strong>，专为大规模向量集的高效索引和检索而设计。它提供亚秒级的查询响应时间，确保用户可以迅速获取所需信息。Pinecone采用高度可伸缩的分布式架构，可以轻松应对不断增长的数据量。它特别适用于实时推荐和内容检索场景，如电商搜索引擎、社交媒体内容过滤等。<strong>通过Pinecone，企业可以为用户提供个性化、精准的内容推荐和搜索体验</strong>。</p>
<h3>3、Weaviate</h3>
<figure><figcaption>img_10.png</figcaption></figure>
<p><strong>关键词：</strong>&nbsp;语义搜索、图数据库、多模态</p>
<p>功能特性：构建智能助手、知识图谱</p>
<ol>
<li>
<p>结合了向量搜索和图数据库的特性</p>
</li>
<li>
<p>支持多模态数据（文本、图像等）的语义搜索</p>
</li>
<li>
<p>提供强大的查询语言和推理能力</p>
</li>
<li>
<p>适用于复杂的知识图谱和知识检索应用</p>
</li>
</ol>
<p><strong>应用系统：</strong>&nbsp;复杂知识图谱应用、智能问答系统、多模态内容管理平台</p>
<p><strong>推荐指数：⭐⭐⭐⭐（适合需要复杂查询和推理能力的知识密集型应用）</strong></p>
<p>Weaviate是一个结合了<strong>向量搜索和图数据库特性的多模态语义搜索引擎</strong>。它支持多模态数据（文本、图像等）的语义搜索，让用户能够以前所未有的方式探索和理解数据。Weaviate提供强大的查询语言和推理能力，<strong>使得用户可以轻松构建复杂的知识图谱和知识检索应用</strong>。<strong>它适用于需要复杂查询和推理能力的知识密集型应用</strong>，如智能问答系统、多模态内容管理平台等。通过Weaviate，企业可以充分挖掘和利用数据的价值，推动业务创新和发展。</p>
<h3>4、Milvus</h3>
<figure><figcaption>img_11.png</figcaption></figure>
<p><strong>关键词：大规模数据、云原生、高可用性</strong></p>
<p>功能特性：大规模内容检索、图像和视频搜索</p>
<ol>
<li>
<p>专为处理超大规模向量数据而设计</p>
</li>
<li>
<p>提供云原生的分布式架构和存储方案</p>
</li>
<li>
<p>支持多种索引类型和查询优化策略</p>
</li>
<li>
<p>适用于大规模内容检索、图像和视频搜索等场景</p>
</li>
</ol>
<p><strong>应用系统：大规模内容检索平台、图像和视频搜索引擎、智能安防系统</strong></p>
<p><strong>推荐指数：⭐⭐⭐⭐⭐（适合需要处理超大规模数据的云端应用）</strong></p>
<p>Milvus是一个专为<strong>处理超大规模向量数据而设计的云原生向量数据库</strong>。它采用分布式架构和存储方案，确保用户可以高效、可靠地管理和检索大规模数据。Milvus支持多种索引类型和查询优化策略，提供卓越的查询性能和扩展性。<strong>它特别适用于大规模内容检索、图像和视频搜索等场景</strong>，如智能安防系统、图像和视频搜索引擎等。通过Milvus，企业可以轻松应对不断增长的数据挑战，实现快速、准确的内容检索和分析。</p>
<h3>5、Faiss</h3>
<figure><figcaption>img_12.png</figcaption></figure>
<p><strong>关键词：高效性、灵活性、Facebook支持</strong></p>
<p><strong>功能特性：轻松将向量检索功能嵌入到深度学习</strong></p>
<ol>
<li>
<p>提供高效的相似度搜索和稠密向量聚类能力</p>
</li>
<li>
<p>支持多种索引构建方法和查询策略优化</p>
</li>
<li>
<p>易于与深度学习框架集成（如PyTorch）</p>
</li>
<li>
<p>在Facebook内部广泛应用，有丰富的社区支持和文档资源</p>
</li>
</ol>
<p><strong>应用系统：Facebook内部语义搜索和推荐系统、广告技术平台、深度学习应用中的向量检索模块</strong></p>
<p><strong>推荐指数：⭐⭐⭐⭐⭐（适合需要高效相似度搜索和丰富社区支持的大型应用）</strong></p>
<p>Faiss是一个<strong>高效、灵活的向量数据库库</strong>，由Facebook于2017年发布并持续维护至今。它提供高效的相似度搜索和稠密向量聚类能力，支持多种索引构建方法和查询策略优化。<strong>Faiss易于与深度学习框架集成</strong>（如PyTorch），使得用户可以轻松将向量检索功能嵌入到深度学习应用中。<strong>它在Facebook内部广泛应用，拥有丰富的社区支持和文档资源</strong>。通过Faiss，企业可以构建高效的语义搜索和推荐系统、广告技术平台等应用，实现数据的精准匹配和价值最大化。</p>
]]></content:encoded>
    </item>
    <item>
      <title>大模型难点</title>
      <link>https://ujava.cn/model/modelhard.html</link>
      <guid>https://ujava.cn/model/modelhard.html</guid>
      <source url="https://ujava.cn/rss.xml">大模型难点</source>
      <description>自从[GPT模型]诞生以来，其参数规模就在不停的扩大。但模型并非简单的直接变大，需要在数据、调度、并行计算、算法和机器资源上做相应的改变。 今天就来总结下，什么是大模型，模型变大的难在哪里以及对于CV/NLP或者搜推广场景上有什么应对策略。 什么是大模型？ 大模型，顾名思义主打的就是“大”。主要包括几个方面： 数据规模大，通过大量的数据提高模型的[泛化...</description>
      <category>设计模型</category>
      <pubDate>Sun, 15 Dec 2024 05:54:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>自从[GPT模型]诞生以来，其参数规模就在不停的扩大。但模型并非简单的直接变大，需要在数据、调度、并行计算、算法和机器资源上做相应的改变。</p>
<p>今天就来总结下，什么是大模型，模型变大的难在哪里以及对于CV/NLP或者搜推广场景上有什么应对策略。</p>
<h3><strong>什么是大模型？</strong></h3>
<p>大模型，顾名思义主打的就是“大”。主要包括几个方面：</p>
<ol>
<li>数据规模大，通过大量的数据提高模型的[泛化能力]和性能。</li>
<li>大规模并行计算能力，随着计算硬件的不断进步，如GPU和TPU的普及，大规模并行计算能力的提升使得训练和推理大模型成为可能。</li>
<li>更“大”模型复杂性：大模型具备更深层次、更复杂的网络结构，可以捕捉更丰富的特征和关系，提高了模型的表达能力。</li>
</ol>
<p>大模型主要分为两类：一个是稀疏大模型，另一个是稠密大模型。</p>
<ol>
<li>稀疏大模型：稀疏大模型是指模型中存在大量稀疏参数的情况，一般是搜索、推荐、广告类任务。它的特点是海量样本及大规模[稀疏参数]（sparse embeddings），适合使用 CPU/GPU&nbsp;[参数服务器模式]（PS）进行训练。</li>
<li>[稠密大模型]：稠密大模型是指模型中的参数大多数都是非零值，没有明显的稀疏性特征，一般是CV、NLP 任务。它的特点是常规样本数据及大规模稠密参数，它适合用纯 GPU 集合通信模式（Collective）进行训练。</li>
</ol>
<p><strong>对于搜推广类的稀疏大模型来说</strong>，一般包含稀疏特征的嵌入（embedding）和稠密模型两个部分。</p>
<p>其中，[稀疏特征]的嵌入计算是稀疏大模型的关键，而稠密模型部分一般往往较小，可以放到一个GPU内，因此可以进行data并行以及all reduce通讯。</p>
<p>在训练中，需要在[特征嵌入表]（embedding table）上需要进行复杂的查找、排列等操作，然后生成[张量]再做稠密模型的计算。</p>
<p>而特征嵌入表往往会占用非常大的存储空间，需要很多台GPU服务器才能完整存放，这就是典型的[tensor并行]。</p>
<p>在这样的场景下，就会导致典型的alltoall的通讯模式，而[alltoall]通讯会带来严重的incast通讯（多打一），进而带来网络拥塞，给网络架构、[拥塞控制协议]、负载均衡算法等都提出了很高的要求。</p>
<p><strong>对于CV、NLP 任务来说</strong>，1. 由于模型参数非常多，远远超过了单个GPU显存所能容纳的空间（NVIDIA最新的A100也就是80GB显存）。</p>
<p>所以往往既需要对模型某一层的tensor并行，也需要不同层之间的[pipeline]并行，才能放得下整个大模型。</p>
<p>在计算过程中，既有单机内通讯，也有不同机器间的通讯，具体的通讯模式取决于模型的切分和放置方法。</p>
<p>为了加速训练过程，往往完整的大模型之间也会采用data并行，每一个完整的大模型会被投喂不同的训练数据，这就会导致大家熟悉的allreduce通信模式。</p>
<p><strong>总结起来</strong>，稠密大模型和稀疏大模型在模型特征上有着明显的差异，对计算/存储/通信资源的需求也存在明显的不同。</p>
<p>要达到GPU算力资源的最大化利用和最好的加速效果，需要结合模型特征和实现方式对GPU服务器架构、网络架构、训练数据存储和拉取、[分布式训练]框架进行全局的考量和设计。</p>
<h3><strong>模型大了难在哪里？</strong></h3>
<p>大模型带来的挑战主要有两点：海量样本、参数（万亿级别）和较长的收敛时间。</p>
<p>别看只有这区区两点，它会衍生出很多要解决的问题。</p>
<ol>
<li><strong>大模型训练需要更大的算力。</strong></li>
</ol>
<p>大模型训练所需的总算力，其实很简单，<strong>6 * 模型的参数量 * 训练数据的 token 数就是所有训练数据过一遍所需的算力。这里的 6 就是每个 token 在模型[正向传播]和反向传播的时候所需的乘法、加法计算次数。</strong></p>
<p>一堆矩阵相乘，简单来想就是左边若干个神经元，右边若干个神经元，组成一个[完全二分图]。选出其中任意一个左边的神经元 L 和右边的神经元 R。</p>
<ol>
<li>正向传播的时候： L把它的输出乘上 L和 R 之间的权重 w，发给 R；R不可能只连一个神经元吧，总要把多个 L的加到一起，这就是 reduce，需要一次加法。</li>
<li>R把它收到的[梯度]乘上 L和 R 之间的权重 w，发给 L；L也不可能只连一个 R，需要把梯度 reduce 一下，做个加法；别忘了权重 w 需要更新，那就要计算 w 的梯度，把 R 收到的梯度乘上 L正向传播的输出（activation）；一个 batch 一般有多个 sample，权重 w 的更新需要把这些 sample 的梯度加到一起。</li>
<li>一共 3 次乘法，3 次加法，不管 Transformer 多复杂，矩阵计算就是这么简单，其他的向量计算、softmax 之类的都不是占算力的主要因素，估算的时候可以忽略。</li>
</ol>
<p>有了模型训练所需的总算力，除以每个 GPU 的理论算力，再除以 GPU 的有效算力利用比例，就得到了所需的 GPU-hours。</p>
<p>如果训练一个通用[大语言模型]的基座需要半年或几个月的时间，同时还占用非常多的机器资源，这就使得大模型的训练非常“贵”，使得大模型的训练成为了个别大企业的专用。</p>
<p>例如，如果你有100个实验想试试，而模型训练需要半年，那你只能在其中选择优先级高进行实验。这也就是为什么现在大家的大语言[模型基座]都是追踪最新开源的模型。因为自己搞通用大模型基座，一方面搞半天成本上耗不起，另一方面可能还没啥效果。</p>
<p><strong>2. 大模型训练需要更多的显存内存资源。</strong></p>
<p>深度学习训练需要的内存包括模型参数、反向传播的梯度、优化器所用的内存、正向传播的中间状态（activation），显存占用 = 模型参数大小 + Batch Size * 优化器参数与中间变量的大小。</p>
<ol>
<li>优化器所用的内存的计算其实也很简单，如果用最经典的 Adam 优化器，它需要用 32 位浮点来计算。即使我们使用[mixed-precision]进行计算，每个参数需要也要存 4 字节的 32 位版本（正向传播时用 16 位版本，优化时用 32 位版本），还需要存 4 字节的&nbsp;[momentum]&nbsp;和 4 字节的 variance，一共 12 字节。如果是用类似 SGD 的优化器，可以不存 variance，只需要 8 字节。</li>
<li>正向传播的中间状态（activation）是反向传播时计算梯度必需的，而且跟 batch size 成正比。Batch size 越大，每次读取模型参数内存能做的计算就越多，这样对 GPU 内存带宽的压力就越小。划重点：<strong>正向传播的中间状态数量是跟&nbsp;[batch size]&nbsp;成正比的</strong>。</li>
</ol>
<p>当然也有节省内存资源的办法，例如算力换内存，时间换内存等。</p>
<p><strong>算力换内存的把戏</strong>，就是不要存储那么多梯度和每一层的正向传播的中间状态，而是在计算到某一层的时候再临时从头开始重算正向传播的中间状态。如果每一层都这么干，那么就只要 2 个字节来存这一层的梯度，但是计算中间状态的算力开销会很大。</p>
<p>因此实际中一般是把整个 Transformer 分成若干组，一组有若干层，只保存每组第一层的中间状态，后面的层就从该组第一层开始重新计算，这样就平衡了算力和内存的开销。</p>
<p>**时间换内存的把戏，**按顺序执行Mini-Batch数据的前向计算梯度，同时对梯度进行累积，累积的结果在最后一个Mini-Batch计算后求平均更新模型变量。</p>
<p>此外，还可以多级缓存，GPU 内存放不下可以换出到 CPU 内存。</p>
<p>例如，对于 LLaMA-2 70B 模型，模型参数需要 140 GB，[反向传播]的梯度需要 140 GB，优化器的状态（如果用 Adam）需要 840 GB。</p>
<p><strong>3. 对数据的数量和数据的质量要求极高.</strong></p>
<p>对于海量数据样本来说，并不是都喂进去就效果好，哪些数据有价值，哪些没价值。由于数据量的增加，分辨数据的价值也带来很大的困难。</p>
<p>此外，大量的数据存储在哪里，一般可以存储在HDFS或S3。但怎么保证存取能不把机器塞满且能快速调取，对于相同数据的模型多次训练，是否可以通过cache来加速模型训练的时间。</p>
<p><strong>4. Transformer的“[不可能三角]”特性</strong></p>
<p>![]</p>
<p>Transformer在训练并行性、推理效率和竞争性能之间很难取得平衡被称为“不可能三角”。Transformers 由于其固有的每步 O(N) 复杂度和内存限制的键值缓存，在推理过程中表现出次优效率。这种低效率使它们的实际部署变得复杂，特别是对于[长序列]。</p>
<p><strong>5. 深度学习框架上不是很友好</strong></p>
<p>因为这个领域最近几年才开始热门，而之前的框架pytorch、[tensorflow]等是早就出现的，当时并没有针对大模型的分布式训练的需求场景做深入的抽象设计和优化。</p>
<p>所以这个领域需要通过大数据框架到深度学习框架的端到端打通，形成这样的一套新的编程范式和对应的计算框架来解决掉。</p>
<p>下面我们以CV、NLP场景和搜推广场景进行分别详细说明。</p>
<p><strong>CV和NLP场景：</strong></p>
<p>对CV和NLP场景来说，其特点主要有：</p>
<ol>
<li>模型一般复杂，单机性能要求高。业界主要使用高性能的GPU进行计算，并采用All-reduce的通信拓扑进行参数的同步更新。</li>
<li>模型大（DenseNet部分），比如NLP领域，[GPT-3]这样的模型高达1750亿参数，显存占用高达2.8 TB，单机内存无法容纳。</li>
</ol>
<p><strong>当面对GPT-3这种Dense部分大的模型，Allreduce 单卡内存无法容纳，我们需要采用[模型并行](model parallelism)的方式将计算图划分到不同的设备上构建<a href="DAG">有向无环图</a>进行分布式训练，其中Gpipe, Megatron, Oneflow和Whale都提出模型并行的相关解决方案。</strong></p>
<p>相比于[数据并行]每个worker只有一部分数据，模型并行下每个node使用所有数据。</p>
<p>下面我们简单说明几种模型并行的方法：</p>
<ol>
<li>Tensor Parallelism，主要是将一层Layer中的矩阵计算分别拆分到不同的机器上进行运算，比如1D Megatron。</li>
<li>Pipeline Parallelism，会将模型的layers拆分到不同的机器上，则一次forward就需要跨过不同的机器串行地进行运算，而流行并行通过将batch size切分为更小的mirco batch，减少数据依赖，从而将整个计算过程异步起来，最大化资源利用率。</li>
</ol>
<p>CTR<strong>推广搜场景：</strong></p>
<p>对于CTR大模型场景来说，其具有模型小，词表大的特点。</p>
<ol>
<li>模型中的Dense部分，一般很小，往往一台机器的内存就可以容纳。但是其特征量级可能高达成百上千亿，造成Sparse部分或者Embedding table高达TB级别，使得单机无法容纳。</li>
<li>一个Batch的embedding lookup量级大，造成查询耗时大。由于特征数量多，一个Batch可能包含几十万个ID类特征，TF原生的embedding lookup查询耗时大，造成训练和inference性能低。</li>
<li>数据具有大规模稀疏的特点。不同于CV和NLP场景，数据是稠密的图像和文本，搜广推的数据非常稀疏的，第一这来源于很多数据无法对所有用户和场景有效采集到，第二是因为建模使用的特征量级大造成的高维稀疏性，这会影响了数据的存储格式和计算效率。</li>
</ol>
<p><strong>因此，解决CTR大模型的这种稠密参数较大的模型，关键是将Sparse参数由单机存储改造为分布式存储，并主要通过数据并行提高吞吐。</strong></p>
<p>下面我们说明下对训练框架优化点。核心的两点，一个在于分布式通信拓扑的设计，还有一个在于Embedding Lookup的性能优化。</p>
<ol>
<li>稀疏参数，借助参数服务器（Param Server），将 embedding 存储和更新负担转嫁到PS。稀疏参数 Partition 存放，每个 Worker 只有部分分片，梯度更新时进行 AlltoAll，想办法解决 稀疏tensor 的存储、通信成本。</li>
<li>稠密参数，借助于allreduce，将稠密参数 Replication 存放，每个 Worker 都有副本，梯度更新时进行 allreduce。allreduce 和 alltoall 都会使用 nccl 进行同步通信，效率较高。hb 进行 alltoall 时，通信的是稀疏梯度，而不是完整的参数，通信量上和 ps 是一致的，但是通信效率会更高。</li>
</ol>
<p><strong>在实现上，可以通过替换TF原生算子进行Sparse参数的读取过程（核心算子是GatherV2算子）。</strong></p>
<p><strong>该算子的作用是从Embedding表中读取ID列表索引对应的Embedding数据并返回，本质上是一个Hash查询的过程；</strong></p>
<p><strong>通过替换该算子，并同时修改上下游节点的Input/Output，将从本地Embedding表中查询，改造为从分布式KV中查询。</strong></p>
<h3><strong>总结</strong></h3>
<p>可以说，训练大模型，不仅需要充足的计算资源和数据，还需要深厚经验和技能，还需要一定的耐心和定力，就像“炼丹”一样。</p>
<p>每次炼丹师的出手都有着巨大时间和经济成本，如何在最小成本下找到最优解，就是我们一直在探索的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>组件‌StarRocks</title>
      <link>https://ujava.cn/assembly/starrocks.html</link>
      <guid>https://ujava.cn/assembly/starrocks.html</guid>
      <source url="https://ujava.cn/rss.xml">组件‌StarRocks</source>
      <description>简介 ‌**是一款新一代极速全场景（Massively Parallel Processing）数据库。**‌它遵循开源协议，采用简洁的架构设计，配备了全面向量化引擎和基于成本的优化器（CBO），能够实现亚秒级的查询速度，尤其是在多表关联查询方面表现突出。‌ 主要特性 ‌极速查询‌：StarRocks通过MPP框架和向量化执行引擎，能够提供亚秒级的查询...</description>
      <category>设计组件</category>
      <pubDate>Fri, 13 Dec 2024 10:01:47 GMT</pubDate>
      <content:encoded><![CDATA[<h2>简介</h2>
<p><mark>‌**是一款新一代极速全场景（Massively Parallel Processing）数据库。**‌</mark>它遵循开源协议，采用简洁的架构设计，配备了全面向量化引擎和基于成本的优化器（CBO），能够实现亚秒级的查询速度，尤其是在多表关联查询方面表现突出。‌</p>
<h3>主要特性</h3>
<ol>
<li><mark>‌<strong>极速查询</strong>‌</mark>：StarRocks通过MPP框架和向量化执行引擎，能够提供亚秒级的查询速度，特别适用于多表关联查询。</li>
<li><mark>‌<strong>现代化物化视图</strong>‌</mark>：支持现代化物化视图，进一步加速查询。</li>
<li><mark>‌<strong>兼容性</strong>‌</mark>：兼容协议，支持标准，易于对接使用。</li>
<li><mark>‌<strong>分布式架构</strong>‌</mark>：采用分布式架构，数据表水平划分并以多副本存储，支持10PB级别的数据分析，具有弹性容错能力。</li>
<li><mark>‌<strong>高并发处理</strong>‌</mark>：通过良好的数据分布特性和灵活的索引设计，StarRocks能够处理高并发查询。</li>
</ol>
<h3>应用场景</h3>
<p>StarRocks广泛应用于多种数据分析场景，包括：</p>
<ul>
<li><mark>‌****‌</mark>：如用户行为分析、用户画像、财务报表、系统监控分析等。</li>
<li><mark>‌<strong>实时数据分析</strong>‌</mark>：如电商大促数据分析、物流运单分析、金融行业绩效分析、广告投放分析等。</li>
<li><mark>‌<strong>高并发查询</strong>‌</mark>：适用于广告主表分析、Dashboard多页面分析等场景。</li>
</ul>
<p>StarRocks的设计目标是让用户的数据分析变得更加简单和敏捷，无需复杂的预处理即可支持多种数据分析场景的极速分析。</p>
]]></content:encoded>
    </item>
    <item>
      <title>AI Agent</title>
      <link>https://ujava.cn/model/aiagent.html</link>
      <guid>https://ujava.cn/model/aiagent.html</guid>
      <source url="https://ujava.cn/rss.xml">AI Agent</source>
      <description>大模型、AI Agent、应用开发、实例创建、模型训练、模型部署、实践案例 1. 背景介绍 近年来，大模型技术蓬勃发展，其强大的泛化能力和应用潜力引发了广泛关注。大模型能够处理海量数据，学习复杂的模式，并生成高质量的文本、图像、代码等内容。 AI Agent 作为大模型的应用场景之一，是指能够自主学习、决策、执行任务的智能代理。它可以理解用户需求，并根...</description>
      <category>设计模型</category>
      <pubDate>Fri, 13 Dec 2024 10:01:47 GMT</pubDate>
      <content:encoded><![CDATA[<blockquote>
<p>大模型、AI Agent、应用开发、实例创建、模型训练、模型部署、实践案例</p>
</blockquote>
<h3>1. 背景介绍</h3>
<p>近年来，大模型技术蓬勃发展，其强大的泛化能力和应用潜力引发了广泛关注。大模型能够处理海量数据，学习复杂的模式，并生成高质量的文本、图像、代码等内容。</p>
<p>AI Agent 作为大模型的应用场景之一，是指能够自主学习、决策、执行任务的智能代理。它可以理解用户需求，并根据上下文进行智能交互，从而提供更便捷、更智能的服务。</p>
<p>然而，对于许多开发者来说，如何将大模型应用于实际场景，构建自己的AI Agent仍然是一个挑战。本文将深入探讨大模型应用开发的流程，并通过实例创建，帮助读者理解如何构建自己的AI Agent。</p>
<h3>2. 核心概念与联系</h3>
<h4>2.1 大模型</h4>
<p>大模型是指参数量巨大、训练数据庞大的人工智能模型。其强大的学习能力使其能够在各种任务中表现出色，例如：</p>
<ul>
<li><strong>自然语言处理 (NLP)：</strong>&nbsp;文本生成、机器翻译、问答系统等。</li>
<li><strong>计算机视觉 (CV)：</strong>&nbsp;图像识别、物体检测、图像生成等。</li>
<li><strong>语音识别 (ASR)：</strong>&nbsp;语音转文本、语音合成等。</li>
</ul>
<h4>2.2 AI Agent</h4>
<p>AI Agent 是一个能够感知环境、做出决策并执行行动的智能体。它通常由以下几个部分组成：</p>
<ul>
<li><strong>感知模块：</strong>&nbsp;收集环境信息，例如传感器数据、文本数据、图像数据等。</li>
<li><strong>决策模块：</strong>&nbsp;根据感知到的信息，做出最佳的行动决策。</li>
<li><strong>执行模块：</strong>&nbsp;执行决策，与环境进行交互。</li>
</ul>
<h4>2.3 大模型与AI Agent的联系</h4>
<p>大模型可以为AI Agent提供强大的能力，例如：</p>
<ul>
<li><strong>自然语言理解：</strong>&nbsp;大模型可以理解用户的自然语言指令，并将其转换为可执行的行动。</li>
<li><strong>知识推理：</strong>&nbsp;大模型可以根据已有的知识库，进行逻辑推理，帮助AI Agent做出更准确的决策。</li>
<li><strong>行为规划：</strong>&nbsp;大模型可以帮助AI Agent规划执行任务的步骤，提高效率和准确性。</li>
</ul>
<p><strong>Mermaid 流程图</strong></p>
<h3>3. 核心算法原理 &amp; 具体操作步骤</h3>
<h4>3.1 算法原理概述</h4>
<p>构建AI Agent的核心算法通常是基于深度学习的强化学习算法。强化学习算法的核心思想是通过奖励机制，引导AI Agent学习最优的行为策略。</p>
<p>在强化学习中，AI Agent与环境进行交互，根据环境的反馈，获得奖励或惩罚。AI Agent的目标是最大化累积的奖励。</p>
<h4>3.2 算法步骤详解</h4>
<ol>
<li><strong>环境建模：</strong>&nbsp;建立AI Agent与环境的交互模型，定义环境状态、动作空间和奖励函数。</li>
<li><strong>策略初始化：</strong>&nbsp;初始化AI Agent的行为策略，例如随机策略或贪婪策略。</li>
<li><strong>交互学习：</strong>&nbsp;AI Agent与环境进行交互，根据策略选择动作，并根据环境反馈获得奖励。</li>
<li><strong>策略更新：</strong>&nbsp;使用强化学习算法，例如Q学习或深度Q网络，更新AI Agent的行为策略，使其能够获得更高的奖励。</li>
<li><strong>重复步骤3和4：</strong>&nbsp;持续与环境交互，更新策略，直到AI Agent达到预设的目标或性能指标。</li>
</ol>
<h4>3.3 算法优缺点</h4>
<p><strong>优点：</strong></p>
<ul>
<li>可以学习复杂的决策策略。</li>
<li>不需要事先定义所有规则，能够适应动态变化的环境。</li>
</ul>
<p><strong>缺点：</strong></p>
<ul>
<li>训练过程可能需要大量的时间和计算资源。</li>
<li>奖励函数的设计对算法性能至关重要。</li>
</ul>
<h4>3.4 算法应用领域</h4>
<ul>
<li><strong>机器人控制：</strong>&nbsp;训练机器人完成复杂的任务，例如导航、抓取、组装等。</li>
<li><strong>游戏 AI：</strong>&nbsp;构建智能游戏对手，提高游戏体验。</li>
<li><strong>个性化推荐：</strong>&nbsp;根据用户的行为数据，推荐个性化的商品或服务。</li>
</ul>
<h3>4. 数学模型和公式 &amp; 详细讲解 &amp; 举例说明</h3>
<h4>4.1 数学模型构建</h4>
<p>强化学习的数学模型通常包括以下几个关键要素：</p>
<ul>
<li><strong>状态空间 (S)：</strong>&nbsp;环境可能存在的全部状态。</li>
<li><strong>动作空间 (A)：</strong>&nbsp;AI Agent可以执行的所有动作。</li>
<li><strong>奖励函数 (R)：</strong>&nbsp;评估AI Agent在特定状态下执行特定动作的奖励。</li>
<li><strong>价值函数 (V)：</strong>&nbsp;评估特定状态下AI Agent的长期奖励期望。</li>
<li><strong>策略 (π)：</strong>&nbsp;决定AI Agent在特定状态下选择动作的规则。</li>
</ul>
<h4>4.2 公式推导过程</h4>
<p><strong>Q学习算法</strong></p>
<p>Q学习算法的目标是学习一个Q函数，Q(s, a)表示在状态s下执行动作a的期望奖励。</p>
<p>Q学习算法的更新规则如下：</p>
<p>�(�,�)←�(�,�)+�[�+�max�′�(�′,�′)−�(�,�)]</p>
<p>其中：</p>
<ul>
<li>$\alpha$ 是学习率，控制学习速度。</li>
<li>$r$ 是在状态s下执行动作a获得的奖励。</li>
<li>$\gamma$ 是折扣因子，控制未来奖励的权重。</li>
<li>$s'$ 是执行动作a后进入的下一个状态。</li>
<li>$a'$ 是在下一个状态$s'$下选择执行的动作。</li>
</ul>
<h4>4.3 案例分析与讲解</h4>
<p>假设我们有一个简单的环境，AI Agent需要学习如何玩一个简单的游戏。</p>
<ul>
<li>状态空间：游戏中的棋盘状态。</li>
<li>动作空间：AI Agent可以移动到棋盘上不同的位置。</li>
<li>奖励函数：当AI Agent赢得游戏时获得最大奖励，否则获得较小的奖励。</li>
</ul>
<p>使用Q学习算法，AI Agent可以学习到在不同棋盘状态下，选择哪个动作可以获得更高的奖励，最终学会玩这个游戏。</p>
<h3>5. 项目实践：代码实例和详细解释说明</h3>
<h4>5.1 开发环境搭建</h4>
<ul>
<li>Python 3.x</li>
<li>TensorFlow 或 PyTorch 等深度学习框架</li>
<li>OpenAI Gym 或其他强化学习环境</li>
</ul>
<h4>5.2 源代码详细实现</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" data-title="python" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> gym</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> numpy </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> np</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tensorflow.keras.models </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Sequential</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> tensorflow.keras.layers </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Dense</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h1>定义环境</h1>
<p>env = gym.make('CartPole-v1')</p>
<h1>定义神经网络模型</h1>
<p>model = Sequential()<br>
model.add(Dense(128, activation='relu', input_shape=(env.observation_space.shape[0],)))<br>
model.add(Dense(64, activation='relu'))<br>
model.add(Dense(env.action_space.n))</p>
<h1>定义损失函数和优化器</h1>
<p>model.compile(loss='mse', optimizer='adam')</p>
<h1>训练模型</h1>
<p>for episode in range(1000):<br>
state = env.reset()<br>
done = False<br>
total_reward = 0</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>while not done:</span></span>
<span class="line"><span>    # 选择动作</span></span>
<span class="line"><span>    action = np.argmax(model.predict(state[None, :]))</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    # 执行动作</span></span>
<span class="line"><span>    next_state, reward, done, _ = env.step(action)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    # 更新模型</span></span>
<span class="line"><span>    target = reward</span></span>
<span class="line"><span>    if not done:</span></span>
<span class="line"><span>        target = reward + 0.99 * np.max(model.predict(next_state[None, :]))</span></span>
<span class="line"><span>    model.fit(state[None, :], target, epochs=1, verbose=0)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    # 更新状态</span></span>
<span class="line"><span>    state = next_state</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    # 更新总奖励</span></span>
<span class="line"><span>    total_reward += reward</span></span>
<span class="line"><span></span></span>
<span class="line"><span>print(f'Episode {episode+1}, Total Reward: {total_reward}')</span></span>
<span class="line"><span># 保存模型</span></span>
<span class="line"><span></span></span>
<span class="line"><span>model.save('cartpole_agent.h5')</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>5.3 代码解读与分析</h4>
<ul>
<li>代码首先定义了环境和神经网络模型。</li>
<li>然后，使用Q学习算法训练模型，通过与环境交互，更新模型参数。</li>
<li>训练完成后，保存模型，以便后续使用。</li>
</ul>
<h4>5.4 运行结果展示</h4>
<p>训练完成后，AI Agent能够在CartPole环境中保持平衡，并获得较高的奖励。</p>
<h3>6. 实际应用场景</h3>
<h4>6.1 智能客服</h4>
<p>AI Agent可以作为智能客服，理解用户的自然语言问题，并提供准确的答案或解决方案。</p>
<h4>6.2 个性化推荐</h4>
<p>AI Agent可以根据用户的行为数据，推荐个性化的商品或服务，提高用户体验。</p>
<h4>6.3 自动化办公</h4>
<p>AI Agent可以自动化完成一些重复性的办公任务，例如邮件回复、日程安排等，提高工作效率。</p>
<h4>6.4 未来应用展望</h4>
<p>随着大模型技术的不断发展，AI Agent的应用场景将会更加广泛，例如：</p>
<ul>
<li><strong>医疗诊断：</strong>&nbsp;AI Agent可以辅助医生进行诊断，提高诊断准确率。</li>
<li><strong>教育辅助：</strong>&nbsp;AI Agent可以为学生提供个性化的学习辅导，提高学习效率。</li>
<li><strong>金融风险控制：</strong>&nbsp;AI Agent可以帮助金融机构识别和控制风险。</li>
</ul>
<h3>7. 工具和资源推荐</h3>
<h4>7.1 学习资源推荐</h4>
<ul>
<li><strong>书籍：</strong>
<ul>
<li>深度强化学习</li>
<li>强化学习：算法、策略和应用</li>
</ul>
</li>
<li><strong>在线课程：</strong>
<ul>
<li>Coursera 强化学习课程</li>
<li>Udacity 强化学习课程</li>
</ul>
</li>
</ul>
<h4>7.2 开发工具推荐</h4>
<ul>
<li><strong>TensorFlow：</strong>&nbsp;开源深度学习框架</li>
<li><strong>PyTorch：</strong>&nbsp;开源深度学习框架</li>
<li><strong>OpenAI Gym：</strong>&nbsp;强化学习环境</li>
</ul>
<h4>7.3 相关论文推荐</h4>
<ul>
<li>Deep Reinforcement Learning with Double Q-learning</li>
<li>Proximal Policy Optimization Algorithms</li>
</ul>
<h3>8. 总结：未来发展趋势与挑战</h3>
<h4>8.1 研究成果总结</h4>
<p>近年来，大模型与AI Agent的结合取得了显著进展，在多个领域展现出巨大的应用潜力。</p>
<h4>8.2 未来发展趋势</h4>
<ul>
<li><strong>模型规模和能力的提升：</strong>&nbsp;大模型的规模和能力将继续提升，从而赋予AI Agent更强大的能力。</li>
<li><strong>多模态交互：</strong>&nbsp;AI Agent将能够理解和处理多种模态信息，例如文本、图像、语音等。</li>
<li><strong>可解释性增强：</strong>&nbsp;研究者将致力于提高AI Agent的透明度和可解释性，使其决策过程更加可理解。</li>
</ul>
<h4>8.3 面临的挑战</h4>
<ul>
<li><strong>数据获取和标注：</strong>&nbsp;训练大模型需要海量数据，而数据获取和标注成本较高。</li>
<li><strong>计算资源需求：</strong>&nbsp;训练大模型需要大量的计算资源，这对于资源有限的机构或个人来说是一个挑战。</li>
<li><strong>伦理和安全问题：</strong>&nbsp;AI Agent的应用可能带来一些伦理和安全问题，例如偏见、隐私泄露等，需要引起重视。</li>
</ul>
<h4>8.4 研究展望</h4>
<p>未来，大模型与AI Agent的结合将继续是一个重要的研究方向，需要进一步探索模型架构、算法优化、数据标注、伦理规范等方面。</p>
<h3>9. 附录：常见问题与解答</h3>
<p><strong>Q1：如何选择合适的强化学习算法？</strong></p>
<p><strong>A1：</strong>&nbsp;选择合适的强化学习算法取决于具体的应用场景和任务需求。例如，对于离散动作空间的任务，Q学习算法是一个不错的选择；对于连续动作空间的任务，深度Q网络算法更适用。</p>
<p><strong>Q2：如何解决数据标注问题？</strong></p>
<p><strong>A2：</strong>&nbsp;数据标注是一个重要的环节，可以考虑使用数据增强技术、迁移学习等方法来减少数据标注成本。</p>
<p><strong>Q3：如何评估AI Agent的性能？</strong></p>
<p><strong>A3：</strong>&nbsp;可以使用奖励函数、成功率、平均回报等指标来评估AI Agent的性能。</p>
<p><strong>Q4：如何避免AI Agent出现偏见？</strong></p>
<p><strong>A4：</strong>&nbsp;在训练数据中尽量避免偏见，并使用公平性评估指标来监测AI Agent的公平性。</p>
]]></content:encoded>
    </item>
    <item>
      <title>AIGC(Artificial Intelligence Generated Content)</title>
      <link>https://ujava.cn/model/aigc.html</link>
      <guid>https://ujava.cn/model/aigc.html</guid>
      <source url="https://ujava.cn/rss.xml">AIGC(Artificial Intelligence Generated Content)</source>
      <description>从定义的角度来看，AIGC全英文是Artificial Intelligence Generated Content，指的是人工智能系统生成的内容，通常是文字、图像、音频或视频。这类内容可以通过自然语言处理，机器学习和计算机视觉等技术生成。 对于界定的理解，如果大家觉得看AIGC不明白，可以将其分开来看。前两个字母AI，应该是比较容易理解吧！就是我们常...</description>
      <category>设计模型</category>
      <pubDate>Fri, 13 Dec 2024 10:01:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>从定义的角度来看，AIGC全英文是Artificial Intelligence Generated Content，指的是人工智能系统生成的内容，通常是文字、图像、音频或视频。这类内容可以通过自然语言处理，机器学习和计算机视觉等技术生成。</p>
<p>对于界定的理解，如果大家觉得看AIGC不明白，可以将其分开来看。前两个字母AI，应该是比较容易理解吧！就是我们常说的，人工智能吗！AIGC是AI后面加了两个字母，那就是人工智能的升级版呗！这样就好理解了！</p>
<p>如果你用再流行的ChatGPT去问，AIGC与AI有区别，它的回答会有四个方面不同，分别是：用途不同、技术不同、数据不同、结果不同。<br>
</p>
<p>AIGC的主要目的是帮助人们快速生成大量内容，从而节省时间和资源。简单地理解，就是AIGC会生成一个内容给我们，比如：是一个图片、一段文字，或是一个音频与视频，而AI是做不到的。</p>
<p>就是因为AIGC可以给我一个内容，所以它的诞生，也是AI的升级，并将AI技术更好地进行落地。我们来看一下它的应用场描述。<br>
</p>
<p>从这个列表中，不仅能看到AIGC可以为我们的生活服务，更应该是感受到它的强大生命力与广泛的市场前景。</p>
<p>根据相关的研报测算，预计到 2025 年国内 AIGC 市场空间可达403.52 亿元，到 2030 年市场空间可达 2175.58 亿元，未来几年市场有望迎来爆发式成长。</p>
<p>AIGC的发展历程可以分成三个阶段：早期萌芽阶段（上世纪50年代至90年代中期），沉淀累积阶段（上世纪90年代至本世纪10年代中期），快速发展阶段（本世纪10年代中期至今）。</p>
<p><strong>一、早期萌芽阶段（1950s~1990s）</strong></p>
<p>由于技术限制，AIGC仅限于小范围实验和应用，例如1957年出现了首支电脑创作的音乐作品《依利亚克组曲（IlliacSuite）》。然而<strong>在80年代末至90年代中期，由于高成本和难以商业化，AIGC的资本投入有限，因此未能取得许多显著进展</strong>。</p>
<p><strong>二、沉淀累积阶段（1990s~2010s）</strong></p>
<p>AIGC逐渐从实验性转向实用性，<strong>2006年深度学习算法取得进展，同时GPU和CPU等算力设备日益精进，互联网快速发展，为各类人工智能算法提供了海量数据进行训练</strong>。2007年出版了首部由AIGC创作的小说《在路上》（1TheRoad），2012年微软展示了全自动同声传译系统，主要基于<strong>深度神经网络（DNN）</strong>，自动将英文讲话内容通过语音识别等技术生成中文。</p>
<p><strong>三、快速发展阶段（2010s~至今）</strong></p>
<p>2014年深度学习算法**“生成式对抗网络”（GenerativeAdversarialNetwork,GAN）<strong>推出并迭代更新，助力AIGC新发展。2017年</strong>微软<strong>人工智能少年“小冰”推出世界首部由人工智能写作的诗集《阳光失了玻璃窗》，2018年NVIDIA(<strong>英伟达</strong>)发布StyleGAN模型可自动生成图片，2019年</strong>DeepMind**发布DVD-GAN模型可生成连续视频。2021年OpenAI推出DALL-E并更新迭代版本DALL-E-2，主要用于文本、图像的交互生成内容。2024年5月14日，OpenAI公司推出一款名为GPT-4o的人工智能模型，具备“听、看、说”的出色本领。</p>
<p><strong>四、2023年AIGC入世元年</strong></p>
<p>2023年更像是AIGC入世元年，AIGC相关的话题爆炸式的出现在了朋友圈、微博、抖音等社交媒体，正式被大众所关注。其中令人印象深刻的是微软全系融入AI创作和OpenAIGPT-4的发布：2023年1月，微软必应搜索（MicrosoftBingSearch）推出了一项创新的功能，即聊天模式（ChatMode）。这项功能允许用户通过聊天框与必应搜索进行交互，获取信息、娱乐、创意等各种内容。必应搜索利用了先进的自然语言处理（NLP）和生成技术，能够理解和回答用户的各种问题和请求，同时提供相关的网页搜索结果、建议、广告等。必应搜索还能够根据用户的选择，切换不同的模式，如平衡模式（BalancedMode）、创意模式（CreativeMode）和精确模式（PreciseMode），以满足用户的不同需求和偏好。必应搜索的聊天模式是AIGC领域的一个突破，展示了人工智能与人类交流的可能性和潜力。</p>
<p><strong>3.2AIGC关键技术</strong></p>
<p>GAN、CLIP、Transformer、Diffusion、预训练模型、多模态技术、生成算法等技术的累积融合，催生了AIGC的爆发。算法不断迭代创新、预训练模型引发AIGC技术能力质变，多模态推动AIGC内容多边形，使得AIGC具有更通用和更强的基础能力。</p>
<p><strong>一、GAN生成式对抗网络（早期视频生成）</strong></p>
<p>GAN（GenerativeAdversarialNetworks），是一种由两个主要组成部分构成的深度学习模型：生成器（Generator）和判别器（Discriminator）。这两个部分通过对抗学习的方式相互竞争，从而使得生成器能够不断提高生成逼真样本的能力，而判别器则不断提高辨别真伪样本的能力。</p>
<p><strong>GAN的工作原理可以概括为：</strong></p>
<p>生成器（Generator）：接收一个随机噪声向量作为输入，并将其转化为与真实数据相似的样本。随着训练的进行，生成器的输出逐渐变得更加逼真，目标是欺骗判别器，使其无法准确区分生成的样本和真实数据。</p>
<p>判别器（Discriminator）：评估输入样本的真实性。它接收来自生成器的样本和真实数据，并尝试将它们正确分类为“真”或“假”。判别器的目标是尽可能准确地区分生成的样本和真实数据，使得生成器的输出更加逼真。</p>
<p>GAN在许多领域都取得了突破性的应用，包括但不限于图像合成与编辑、视频生成、文本生成、数据增强等。</p>
<p><strong>GAN的优点包括：</strong></p>
<p>能够生成高质量的图像和视频，如高分辨率图像、风格转换和图像增强等。</p>
<p>训练过程中不需要复杂的马尔科夫链，而是采用无监督的学习方式训练，适用于无监督学习和半监督学习领域。</p>
<p>相比其他生成模型，如玻尔兹曼机和GSNs，GANs只需要使用反向传播，不需要复杂的马尔科夫链。</p>
<p>相比变分自编码器（VAE），GANs没有引入任何决定性偏置，如果鉴别器训练良好，那么生成器可以完美地学习到训练样本的分布。</p>
<p><strong>GAN的缺点包括：</strong></p>
<p>训练GAN需要达到纳什均衡，这有时可能是一个挑战。</p>
<p>GAN不适合处理离散形式的数据，如文本。</p>
<p>训练GAN相比VAE或PixelRNN是不稳定的。</p>
<p>总的来说，GAN网络是一种强大的工具，能够通过深度学习模型生成与真实数据高度相似的样本，广泛应用于多个领域。</p>
<p><strong>二、CLIP模型（多模态预训练神经网络）</strong></p>
<p>CLIP模型是一种由OpenAI在2021年发布的多模态预训练神经网络，全称为ContrastiveLanguage-ImagePre-Training，即从自然语言监督中学习的一种有效且可扩展的方法。</p>
<p>CLIP模型的基本原理是通过对比学习让模型区分正样本和负样本，本质上是通过分类实现的。为了实现这一目标，CLIP使用了一个多模态编码器，它由图像编码器和文本编码器两个子编码器组成。图像编码器可以是基于卷积神经网络（CNN）或者视觉变换器（ViT）的模型，文本编码器则是一个基于Transformer的模型。在预测阶段，CLIP模型通过计算文本和图像向量之间的余弦相似度来生成预测。</p>
<p>CLIP模型特别适用于零样本学习任务，即模型不需要看到新的图像或文本的训练示例就能进行预测。它在多个领域表现出色，如图像文本检索、图文生成等，具有广泛的应用前景，包括但不限于图像分类、内容调节、图像描述等任务。</p>
<p>然而，CLIP模型也有其局限性，例如对于复杂和抽象场景的表现存在局限性，且训练效果依赖大规模的文本-图像对数据集，对训练资源的消耗比较大。</p>
<p>此外，关于CLIP模型的大小，具体取决于所选用的图像编码器和文本编码器的结构以及训练数据的大小。因此，无法给出具体的模型大小。</p>
<p>总的来说，CLIP模型是一种强大的多模态模型，能够将图像特征和文本特征进行对齐，从而实现跨模态的检索和生成任务。随着技术的不断发展，CLIP模型有望在更多领域得到应用和优化。</p>
<p><strong>三、自然语言处理技术NLP</strong></p>
<p>自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此，这一领域的研究将涉及自然语言，即人们日常使用的语言，所以它与语言学的研究有着密切的联系，但又有重要的区别。自然语言处理并不是一般地研究自然语言，而在于研制能有效地实现自然语言通信的计算机系统，特别是其中的软件系统。因而它是计算机科学的一部分。自然语言处理主要应用于机器翻译、舆情监测、自动摘要、观点提取、文本分类、问题回答、文本语义对比、语音识别、中文OCR等方面。</p>
<p><strong>四、MLP算法</strong></p>
<p>MLP（多层感知器模型）是一种简单的神经网络，是人工智能最早的模型。MLP的特点是层与层之间的神经元全部相互连接（这种层可称为全连接层），为便于理解，可以将其理解为一种广义的线性模型：</p>
<p><strong>五、卷积神经网络CNN</strong></p>
<p>在卷积神经网络中，卷积操作指将一个可移动的小窗口（称为数据窗口，如下图绿色矩形）与图像进行逐元素相乘然后相加的操作。这个小窗口其实是一组固定的权重，它可以被看作是一个定的滤波器(filter)或卷积核。这个操作的名称“卷积”源自于汶种元素级相乘和求和的过程。这一操作是卷积神经网络名字的来源。</p>
<p>简而言之，卷积操作就是用一个可移动的小窗口来提取图像中的特征，这个小窗口包含了一组特定的权重，通过与图像的不同位置进行卷积操作，网络能够学习并捕捉到不同特征的信息。</p>
<p>CNN还具有一个非常重要的特性，它是通过共享卷积核来提取特征，这样一方面可以极大的降低参数量来避免更多冗余的计算从而提高网络模型计算的效率，另一方面又结合结合卷积和池化使网络具备一定的平移不变性（shift-invariant）和平移等变性（equivariance）。</p>
<p>虽然CNN具备如此多的优点，但不是一开始就一蹴而就，也并不是完美无瑕的。</p>
<p>以图像分割为例，在全卷积神经网络FCN提出以前，大多数基于CNN的方法都是基于Patch-wise即将图像块作为输入输入到CNN中去进行相应类别预测，这种方式一来计算非常冗余，二来也缺乏充足的上下文信息。</p>
<p>所以为什么FCN会这么有影响力，甚至可以称为是一个mile-stone的网络，就在于它真正意义上将patch-wise做到了pixel-wise，这对于语义分割这种密集型任务来说是至关重要的。</p>
<p>当然，FCN也存在许多的缺点，诸如分割结果粗糙等，当这并不妨碍我们基于它的思想去进行很多的拓展。</p>
<p>比如最近几年提出的很多分割论文都是针对它去进行改进，有人提倡改善编码器利用更强大的卷积模块去提取更具备代表性的特征。</p>
<p>有人热衷于改善解码器，比如引入跳跃连接操作来弥补编码器下采样过程中空间细节信息的丢失从而来实现更精准的定位，关于如何跳跃又是一个问题，有直接连线的Unet。</p>
<p>继而有人又借助语义鸿沟（semanticgap）或者背景噪声干扰这些口去突破，利用多个卷积去消除，结合高级特征的强语义和低级特征丰富的细节信息去指导融合的也有，另外还有借助注意力方式去消除歧义和抑制背景噪声的也大有人在。</p>
<p>除了编解码器之外，我们借用特征金字塔的思想还可以结合多层的结果去融合输出，得到一个更加细化的特征表示。在抛掉模型本身，也可以从任务本身下手，从全监督到半监督，自监督，few-shotlearning，ome-shotlearning，甚至是无监督域等等也有很多方向可以突破。</p>
<p>其他视觉任务如分类，检测或者low-level的任务如超分，去噪等也可以此类比，很多人写不来论文或者解决不了问题的关键点在于根本没发现问题在哪里，又何谈解决问题。</p>
<p><strong>六、探索视觉Transformer(2022CN)</strong></p>
<p>根据当下比较流行的说法，Transformer是谷歌于2017年提出的一种新型神经网络架构。</p>
<p>和传统的神经网络算法相比，Transformer的特点在于自注意力机制（Self-Attention）。比如在自然语言处理时，它能让模型评估句子中各个词的重要性，从而根据上下文锁定关键信息，提高下一阶段的文本预测与建模能力。</p>
<p>在此过程中，它的两大组件：编码器（Encoder）和解码器（Decoder），一个负责处理输入文本数据，进行编码和价值特征提取，一个负责生成有意义的文本序列信息，配合默契。</p>
<p>除此之外，Transformer的并行处理能力很强，能同时处理输入文本的各个部分，无须按顺序处理，这极大地提高了模型计算和训练的速度。</p>
<p>因为这些优势，目前主流的AI模型和产品，比如GPT、Claude、ChatGPT、GoogleBard、Midjourney等均有基于Transformer架构进行开发。</p>
<p><strong>七、机器学习(eg.随机森林、支持向量机、感知机)</strong></p>
<p>机器学习（Machinelearning）是人工智能的子集，是实现人工智能的一种途径，但并不是唯一的途径。它是一门专门研究计算机怎样模拟或实现人类的学习行为，以获取新的知识或技能，重新组织已有的知识结构使之不断改善自身的性能的学科。大概在上世纪80年代开始蓬勃发展，诞生了一大批数学统计相关的机器学习模型。</p>
<p>机器学习研究的是计算机怎样模拟人类的学习行为，以获取新的知识或技能，并重新组织已有的知识结构，使之不断改善自身。从实践的意义上来说，机器学习是在大数据的支撑下，通过各种算法让机器对数据进行深层次的统计分析以进行「自学」，使得人工智能系统获得了归纳推理和决策能力。</p>
<p>机器学习三要素包括数据、模型、算法。</p>
<p>机器学习核心技术。分类：应用以分类数据进行模型训练，根据模型对新样本进行精准分类与预测。聚类：从海量数据中识别数据的相似性与差异性，并按照最大共同点聚合为多个类别。异常检测：对数据点的分布规律进行分析，识别与正常数据及差异较大的离群点。回归：根据对已知属性值数据的训练，为模型寻找最佳拟合参数，基于模型预测新样本的输出值。</p>
<p>机器学习基本流程。机器学习工作流（WorkFlow）包含数据预处理（Processing）、模型学习（Learning）、模型评估（Evaluation）、新样本预测（Prediction）几个步骤。</p>
<p><strong>八、深度学习(eg.CNN)</strong></p>
<p>深度学习（Deeplearning）是机器学习的子集，灵感来自人脑，由人工神经网络（ANN）组成，它模仿人脑中存在的相似结构。在深度学习中，学习是通过相互关联的「神经元」的一个深层的、多层的「网络」来进行的。「深度」一词通常指的是神经网络中隐藏层的数量。大概在2012年以后爆炸式增长，广泛应用在很多的场景中。</p>
<p><strong>深度学习的工作原理是什么？</strong></p>
<p>深度学习由神经网络层驱动。神经网络由一系列算法按照人类大脑的工作方式松散建模而成，而使用大量数据进行训练，即对神经网络的神经进行配置。经过训练后，深度学习模型可以处理新数据，能够摄取并实时分析多个来源的数据，无需人为干预。在深度学习中，图形处理单元(GPU)可以同时处理多个计算，以优化方式训练深度学习模型。</p>
<p>在现实中，深度学习助力众多人工智能(AI)技术改善自动化和分析任务。绝大多数人每天都会接触到深度学习，例如在浏览互联网或使用手机时。深度学习可为YouTube视频生成摘要；在手机和智能音箱上执行语音识别；针对图片开展人脸识别；驱动无人驾驶汽车。随着数据科学家和研究人员不断运用深度学习框架来处理日益复杂的深度学习项目，深度学习将逐步成为我们日常生活的一部分。</p>
<p><strong>深度学习与神经网络有何区别？</strong></p>
<p>深度学习与神经网络对比。简单来说，深度学习就是具有多个神经层的神经网络的另一种说法。为了充分利用观测数据（例如图片或音频），神经网络会跨互联的神经网络节点层传递数据。在每一个节点层上，每一个节点都会对数据进行简单运算，并有选择地将数据传递到其他节点。随着数据不断传递，每一个节点层都会利用比上一层更高级的特性来处理数据，直至输出结果。在输入层与输出层之间，所有的神经网络层均被称为隐藏层。神经网络与深度学习的区别在于，一个基本的神经网络可能拥有一个或两个隐藏层，而一个深度学习网络可能拥有数十个甚至数百个隐藏层。一般来说，层数和节点越多，结果就越准确。不过，层数越多，深度学习模型的参数和对计算的需求就越多。神经网络可通过一组输入层来接收原始数据，而深度学习可以通过神经网络层对信息进行分类。例如，经过鸟类图像训练的神经网络可以识别鸟类图像。更多的层意味着更准确的结果，例如随着层数增加，神经网络能够从区分乌鸦和鸡升级到区分渡鸦和乌鸦。此外，深度学习算法驱动的深度神经网络拥有多个隐藏层（位于输入节点和输出节点之间），可以完成更加复杂的数据分类工作。深度学习算法必须基于大量的数据进行训练，它接收的数据越多，就越准确。例如，只有经过数千张鸟类图像的训练，算法才能准确地对新的鸟类图像进行分类。</p>
<p>对于神经网络而言，深度学习模型训练是一项资源密集型工作。在训练中，神经网络摄取数据（即输入），然后隐藏层基于权重（即表示输入数据之间连接强度的参数，将在训练过程中适时调整）对数据进行处理，最后输出预测。其中，权重将基于训练所使用的输入数据进行调整，以此来优化预测。深度学习模型需要耗费大量时间来训练海量数据，因此，高性能计算不可或缺。</p>
<p>GPU针对数据计算进行了专门优化，旨在提高大规模矩阵计算的性能。它尤其适用于并行执行大规模机器学习(ML)和深度学习，可帮助机器学习应用高效地对大量结构化或非结构化数据（例如图像、文本和语音）执行大量运算，实现超强性能。</p>
<p>**使用深度学习的5大理由。**深度学习的一个重大优势是它的神经网络可揭示数据中的隐藏洞察和关系。通过利用更强大的机器学习算法来分析大规模的复杂数据，企业可以通过以下方式改善欺诈检测、供应链管理和网络安全：1）分析非结构化数据。深度学习算法可以分析社交媒体帖子、新闻资讯和调查报告，从而探查文本数据，提供有价值的业务和客户洞察。2）数据标记。深度学习模型的训练离不开标记数据。经过训练，深度学习模型可以自行标记新数据，识别各类数据。3）特征工程。机器学习算法可显著节约时间—无需手动从原始数据中提取特征。4）效率。经过适当训练，深度学习算法能够以远超人类的速度，持续执行数千项任务。5）训练。在深度学习中，神经网络适用于多种类型的数据和应用。而通过使用新数据重新训练，深度学习模型可响应新的变化。</p>
<p>**AI、机器学习和深度学习有何区别？**尽管AI、机器学习和深度学习相互关联，但它们之间存在本质区别：人工智能(AI)，人工智能可让计算机、机器和机器人模仿人，像人一样制定决策、识别对象、解决问题和理解语言。机器学习(ML)，机器学习是AI的一个子集，它专注于构建可自主学习（无需人为干预）数据，从而持续提高准确性的应用。经过训练，机器学习算法可识别数据模式，做出更明智的决策和预测，但这一般需要用户参与。深度学习，深度学习是机器学习的一个子集，可帮助计算机解决更复杂的问题。深度学习模型同样可以自主创建新特征。</p>
<p><strong>九、Diffusion扩散模型</strong></p>
<p>扩散模型全称是DiffusionModel。因早期的视频生成主要依赖GAN（生成式对抗网络）和VAE（变分自编码器），但生成的视频内容质量受限，难以商用。最早被用在分布式学习上的扩散模型，很快被拓展到视频生成和处理领域。</p>
<p>从结果看，扩散模型在超分辨率、去噪、图像生成、修复等方面表现不俗。热门的StableDiffusion，就是当下很流行的开源扩散模型之一。</p>
<p>和以往图像视频生成模型/方法相比，扩散模型的工作原理在于在图像生成过程中，通过前向扩散（加噪）和反向扩散（去噪）不断修正训练自己，以生成更好的图像样本。目前，Runway、Pika、StableVideo等AI视频服务公司，就采用了这种扩散模型来生成视频。</p>
<p>DiT，全称DiffusionTransformer，是另外一种扩散模型，只是它基于Transformer架构，算是Transformer在自然语言处理领域获得成功后，在图像视频处理领域的一大延伸。</p>
<p>目前openAI的GLIDE、DALLE-2、DALL·E3、谷歌的Imagen等就采用了基于Transformer架构的扩散模型。</p>
<p>综合以上几点，我们不难看出：Transformer是一种热门架构，而扩散模型也有采用这一架构，推出了新型的扩散模型——DiT。</p>
<p>需要补充的是，扩散模型虽然是AI视频生成的主流形式，但并不是唯一的形式。</p>
<p>比如以谷歌VideoPoe为代表的AI图像视频生成工具，就没有采用扩散模型，而是基于大语言模型实现文生视频、图生视频、视频编辑、风格化处理、画面补充等任务。</p>
<p>以上导致了同属AI视频生成赛道，可能底层的技术模型并不一样。</p>
<p>不过为了提升视频生成的精度和质量，眼下以Sora为代表的AI视频生成模型，正逐步走向扩散模型与DiT的结合。这种优势互补，也让整个AI视频赛道迎来了颠覆性的变化。</p>
<p><strong>十、多模态技术</strong></p>
<p>多模态模型通过高技术供给重塑AI技术范式。多模态模型通过融合语言模态与图像模态，将语言模态包含的文本理解与思维链能力投射在图像模态上，赋予了模型图像理解与生成功能。从AI技术范式来看，多模态技术通过预训练+调参的方式颠覆了传统机器视觉小模型CNN高度定制化的业务模式，模型的泛用性大幅度提高。从AI商业模式来看，产业的话语权逐渐由应用端走向研发端，即改变了之前完全由客户定夺市场（项目制考虑单一任务投入人力、算力、周期计算项目金额）转向由技术定义市场（MAAS，客户无法估测基础模型摊薄成本，基座模型大力投入限制参与玩家，话语权降低）</p>
<p>多模态模型的核心目标是模拟人类大脑处理信息的方式。无论是语言模态还是图像模态，本质上是信息的一种载体。人类眼睛、耳朵等感官可以类比成接受各种模态的传感器，而大脑可以整合不同感官的信息来理解世界。同理，多模态模型模拟人类大脑处理信息的方式，把各种感知模态结合起来，以更全面、综合的方式理解和生成信息，最终实现更丰富的任务和应用。</p>
<p>多模态模型目前主要指的是文本-图像模型。模态是指一些表达或感知事物的方式，每一种信息的来源或者形式，都可以称为一种模态。例如，人有触觉，听觉，视觉，嗅觉；信息的媒介有语音、视频、文字等；多种多样的传感器如雷达、红外、加速度计等，每一种都可以称为一种模态。目前已落地的多模态模型主要为文本-图像大模型，已经有Clip、ViT、GPT-4等几十种基础模型推出，并且诞生了诸如StableDiffusion、Midjourney这样已落地的应用；所以多模态大模型领域目前以文本-图像大模型为主，未来随着AI技术的发展，包含更多模态的模型有望陆续推出。</p>
<p>多模态是实现通用人工智能的必经之路。按照处理的数据类型数量划分，AI模型可以划分为两类：</p>
<p>（1）单模态：只处理1种类型数据，如文本等；（2）多模态：处理2种及以上数据，可类比人脑同时对文本、声音、图像等不同类型信息进行处理。</p>
<p>相比单模态，多模态大模型在输入输出端的优势明显：输入端：1）提升模型能力：高质量语言数据存量有限，且不同模态包含的信息具有互补性，多元的训练数据类型有助于提升通用大模型能力；2）提高用户体验：推理侧更低的使用门槛和更少的信息损耗。输出端：更实用。1）可直接生成综合结果，省去多个模型的使用和后期整合；2）更符合真实世界生产生活需要，从而实现更大商业价值。</p>
<p>在腾讯2024数字科前沿应趋势中，强诓了通用人工智能渐行渐近，大模型走向多模态，A《智能体(Agent)有望成为下一代平台"。当下多模态大模型不仅仅是学界新宠，也是耒来行业发展进步的一大方向，站在汶篇综述的基础之上待我们可以更快更好的理解未来多椏态大椏型的发展，赶上汶波通用人工智能的新浪！</p>
<p><strong>十一、循环神经网络RNN</strong></p>
<p>循环神经网络（Recurrent Neural Networks）广泛应用于具有某种顺序的结构数据分析。与卷积神经网络相比，其预测值考虑了时序数据特征。其核心为通过隐藏层特征的时序传递，实现序列数据融合并决策输出。简单的说，当前状态输出基于当前状态输入与历史输入。</p>
<p>我们为什么需要 RNN？已经有像卷积网络这样表现非常出色的网络了，为什么还需要其他类型的网络呢？有一个需要用到 RNN 的特殊例子。为了解释 RNN，你首先需要了解序列的相关知识，我们先来讲一下序列。</p>
<p>序列是相互依赖的（有限或无限）数据流，比如时间序列数据、信息性的字符串、对话等。在对话中，一个句子可能有一个意思，但是整体的对话可能又是完全不同的意思。股市数据这样的时间序列数据也是，单个数据表示当前价格，但是全天的数据会有不一样的变化，促使我们作出买进或卖出的决定。</p>
<p>当输入数据具有依赖性且是序列模式时，CNN 的结果一般都不太好。CNN 的前一个输入和下一个输入之间没有任何关联。所以所有的输出都是独立的。CNN 接受输入，然后基于训练好的模型输出。如果你运行了 100 个不同的输入，它们中的任何一个输出都不会受之前输出的影响。但想一下如果是文本生成或文本翻译呢？所有生成的单词与之前生成的单词都是独立的（有些情况下与之后的单词也是独立的，这里暂不讨论）。所以你需要有一些基于之前输出的偏向。这就是需要 RNN 的地方。RNN 对之前发生在数据序列中的事是有一定记忆的。这有助于系统获取上下文。理论上讲，RNN 有无限的记忆，这意味着它们有无限回顾的能力。通过回顾可以了解所有之前的输入。但从实际操作中看，它只能回顾最后几步。</p>
<p>本文仅为了与人类大体相关联，而不会做任何决定。本文只是基于之前关于该项目的知识做出了自己的判断（我甚至尚未理解人类大脑的 0.1%）。</p>
<p>何时使用 RNN？RNN 可用于许多不同的地方。下面是 RNN 应用最多的领域。1. 语言建模和文本生成。给出一个词语序列，试着预测下一个词语的可能性。这在翻译任务中是很有用的，因为最有可能的句子将是可能性最高的单词组成的句子。2. 机器翻译。将文本内容从一种语言翻译成其他语言使用了一种或几种形式的 RNN。所有日常使用的实用系统都用了某种高级版本的 RNN。3. 语音识别。基于输入的声波预测语音片段，从而确定词语。4. 生成图像描述。RNN 一个非常广泛的应用是理解图像中发生了什么，从而做出合理的描述。这是 CNN 和 RNN 相结合的作用。CNN 做图像分割，RNN 用分割后的数据重建描述。这种应用虽然基本，但可能性是无穷的。5. 视频标记。可以通过一帧一帧地标记视频进行视频搜索。</p>
<p><strong>十二、GPU</strong></p>
<p>以下GPU部分内容参考知乎小枣君：AI计算，为什么要用GPU？</p>
<p>AI计算，要用GPU。行业里通常会把半导体芯片分为数字芯片和模拟芯片。其中，数字芯片的市场规模占比较大，达到70%左右。数字芯片，还可以进一步细分，分为：逻辑芯片、存储芯片以及微控制单元（MCU）。</p>
<p>逻辑芯片，其实说白了就是计算芯片。它包含了各种逻辑门电路，可以实现运算与逻辑判断功能，是最常见的芯片之一。大家经常听说的CPU、GPU、FPGA、ASIC，全部都属于逻辑芯片。而现在特别火爆的AI，用到的所谓“AI芯片”，也主要是指它们。</p>
<p>GPU是显卡的核心部件，英文全名叫GraphicsProcessingUnit，图形处理单元（图形处理器）。GPU并不能和显卡划等号。显卡除了GPU之外，还包括显存、VRM稳压模块、MRAM芯片、总线、风扇、外围设备接口等。</p>
<p>1999年，英伟达（NVIDIA）公司率先提出了GPU的概念。之所以要提出GPU，是因为90年代游戏和多媒体业务高速发展。这些业务给计算机的3D图形处理和渲染能力提出了更高的要求。传统CPU搞不定，所以引入了GPU，分担这方面的工作。根据形态，GPU可分为独立GPU（dGPU，discrete/dedicatedGPU）和集成GPU（iGPU，integratedGPU），也就是常说的独显、集显。GPU也是计算芯片。所以，它和CPU一样，包括了运算器、控制器和寄存器等组件。但是，因为GPU主要负责图形处理任务，所以，它的内部架构和CPU存在很大的不同。</p>
<p>CPU的内核（包括了ALU）数量比较少，最多只有几十个。但是，CPU有大量的缓存（Cache）和复杂的控制器（CU）。这样设计的原因，是因为CPU是一个通用处理器。作为计算机的主核心，它的任务非常复杂，既要应对不同类型的数据计算，还要响应人机交互。复杂的条件和分支，还有任务之间的同步协调，会带来大量的分支跳转和中断处理工作。它需要更大的缓存，保存各种任务状态，以降低任务切换时的时延。它也需要更复杂的控制器，进行逻辑控制和调度。</p>
<p>CPU的强项是管理和调度。真正干活的功能，反而不强（ALU占比大约5%~20%）。如果我们把处理器看成是一个餐厅的话，CPU就像一个拥有几十名高级厨师的全能型餐厅。这个餐厅什么菜系都能做，但是，因为菜系多，所以需要花费大量的时间协调、配菜，上菜的速度相对比较慢。</p>
<p>而GPU则完全不同。GPU为图形处理而生，任务非常明确且单一。它要做的，就是图形渲染。图形是由海量像素点组成的，属于类型高度统一、相互无依赖的大规模数据。所以，GPU的任务，是在最短的时间里，完成大量同质化数据的并行运算。所谓调度和协调的“杂活”，反而很少。并行计算，当然需要更多的核啊。如前图所示，GPU的内核数，远远超过CPU，可以达到几千个甚至上万个（也因此被称为“众核”）。</p>
<p>GPU的核，称为流式多处理器（StreamMulti-processor，SM），是一个独立的任务处理单元。在整个GPU中，会划分为多个流式处理区。每个处理区，包含数百个内核。每个内核，相当于一颗简化版的CPU，具备整数运算和浮点运算的功能，以及排队和结果收集功能。</p>
<p>GPU的控制器功能简单，缓存也比较少。它的ALU占比，可以达到80%以上。</p>
<p>虽然GPU单核的处理能力弱于CPU，但是数量庞大，非常适合高强度并行计算。同等晶体管规模条件下，它的算力，反而比CPU更强。还是以餐厅为例。GPU就像一个拥有成千上万名初级厨师的单一型餐厅。它只适合做某种指定菜系。但是，因为厨师多，配菜简单，所以大家一起炒，上菜速度反而快。</p>
<p>大家都知道，现在的AI计算，都在抢购GPU。英伟达也因此赚得盆满钵满。为什么会这样呢？原因很简单，因为AI计算和图形计算一样，也包含了大量的高强度并行计算任务。深度学习是目前最主流的人工智能算法。从过程来看，包括训练（training）和推理（inference）两个环节。在训练环节，通过投喂大量的数据，训练出一个复杂的神经网络模型。在推理环节，利用训练好的模型，使用大量数据推理出各种结论。训练环节由于涉及海量的训练数据，以及复杂的深度神经网络结构，所以需要的计算规模非常庞大，对芯片的算力性能要求比较高。而推理环节，对简单指定的重复计算和低延迟的要求很高。它们所采用的具体算法，包括矩阵相乘、卷积、循环层、梯度运算等，分解为大量并行任务，可以有效缩短任务完成的时间。GPU凭借自身强悍的并行计算能力以及内存带宽，可以很好地应对训练和推理任务，已经成为业界在深度学习领域的首选解决方案。目前，大部分企业的AI训练，采用的是英伟达的GPU集群。如果进行合理优化，一块GPU卡，可以提供相当于数十其至上百台CPU服务器的算力。</p>
<p>2012年，神经网络之父杰弗里·辛顿（GeoffreyHinton）的两个学生——亚历克斯·克里切夫斯基（AlexKrizhevsky）、伊利亚·苏茨克沃（IlyaSutskever），利用“深度学习+GPU”的方案，提出了深度神经网络AlexNet，将识别成功率从74%提升到85%，一举赢得ImageNet挑战赛的冠军。这彻底引爆了“AI+GPU”的浪潮。英伟达公司迅速跟进，砸了大量的资源，在三年时间里，将GPU性能提升了65倍。除了硬刚算力之外，他们还积极构建围绕GPU的开发生态。他们建立了基于自家GPU的CUDA（ComputeUnifiedDeviceArchitecture）生态系统，提供完善的开发环境和方案，帮助开发人员更容易地使用GPU进行深度学习开发或高性能运算。这些早期的精心布局，最终帮助英伟达在AIGC爆发时收获了巨大的红利。目前，他们市值高达1.22万亿美元（英特尔的近6倍），是名副其实的“AI无冕之王”。</p>
<p><strong>3.3相关概念</strong></p>
<p><strong>一、算力：</strong></p>
<p>算力是计算机设备或计算/数据中心处理信息的能力，是计算机硬件和软件配合共同执行某种计算需求的能力。</p>
<p>算力的英文名是computility。其中的compu-是计算的词根，表达“算”的含义，-utility是效用、实用的意思。computility用来表达计算的能力，即算力。</p>
<p>2024年4月，工业和信息化部表示，中国算力实现每秒230百亿亿次浮点运算。</p>
<p><strong>二、大模型：</strong></p>
<p><strong>1.什么是大模型？</strong></p>
<p>大模型又可以称为Foundation Model（基石）模型，模型通过亿级的语料或者图像进行知识抽取，学习进而生产了亿级参数的大模型。其实感觉就是自监督学习，利用大量无标签很便宜的数据去做预训练。</p>
<p>比如BERT，怎么做的无监督pre-trained？他会把输入的句子中的token随机遮住，然后去预测这个token经过encoder以后的输出单词的概率（通过softmax），因为我们自己是知道哪个token被遮住了的，loss就是让模型预测的记过越来越接近真实值（有一个词汇表，可以编码GT的one-hot），通过这样来反传播训练。</p>
<p><strong>2.大模型能解决什么问题？</strong></p>
<p>大规模预训练可以有效地从大量标记和未标记的数据中捕获知识，通过将知识存储到大量的参数中并对特定任务进行微调，极大地扩展了模型的泛化能力。在应对不同场景时，不再从0开始，只需要少量的样本进行微调。再比如BERT已经训练好了，我们要做下游任务，做一个句子的情感分析。那么就会在BERT的输入token中加入一个 class token，这个和vit的做法一样，encoder以后用class token的向量做一下linear transoformation 和softmax和gt做损失训练，所以这一步可以直接初始化BERT模型的预训练参数做finetune，效果要更好。收敛的又快，loss又低。</p>
<p><strong>3.知名大模型</strong></p>
<p>GoogleBard、googleGemini、盘古、悟道等</p>
<p><strong>4 赛道、玩家、概念股</strong></p>
<p>4.1赛道及玩家</p>
<p>按照技术成熟度划分，可分为两类：</p>
<p>按照产品形态划分，目前90%+AI应用为软件形态，AI硬件开始层出不穷，但还没迎来“iPhone时刻”。</p>
<p>AI硬件代表品类中，“AI+万物”包括AI手机、AIPC等；AI新物种包括AIPin、RabbitR1等。</p>
<p>按照作用属性以及软硬件形态，厂商及代表产品划分如下。具备生产力属性的产品占比达95%以上。</p>
<p><strong>国内几个主要AIGC大模型独角兽：</strong></p>
<p>月之暗面：KIMI（2024.2.19投资方：红杉中国、小红书、美团、阿里；2023.6.12VC投资：红杉资本、真格基金、励思资本等）</p>
<p>智普AI：2014年1月GLM-4模型（斯坦佛评测亚洲唯一入选模型）、生成式AI助手“智谱清言”</p>
<p>MiniMax：</p>
<p>百川智能：</p>
<p>零一万物：</p>
<p>光年之外：</p>
<p>澜舟科技：</p>
<p><strong>4.2概念股</strong></p>
<p><strong>以下是国内8大AIGC概念股龙头股：</strong></p>
<p>1.万兴科技：万兴科技是一家中国领先的电子产品设计与制造服务提供商。他们致力于为全球客户提供从产品设计、研发到制造的一站式解决方案，涵盖智能手机、平板电脑、智能穿戴设备等多个领域。</p>
<p>2.科大讯飞：科大讯飞是中国领先的人工智能（AI）公司，专注于语音识别、自然语言处理、机器学习等核心技术的研发与应用。他们的产品和服务广泛应用于教育、医疗、交通、安防等各个领域。</p>
<p>3.视觉中国：视觉中国是中国最大的图库图片供应商和版权服务提供商之一。他们拥有庞大的图片资源库，为广告、传媒、出版等行业提供高质量的图片和版权服务。</p>
<p>4.人民网：人民网是中国权威的新闻门户网站，以提供全面、及时、权威的新闻信息为主要特色。他们在新闻报道、资讯分发和互动社区等方面具有较高的影响力。</p>
<p>5.新华网：新华网是中国新华社旗下的新闻门户网站，致力于提供全球最新的新闻和信息。他们拥有广泛的新闻报道网络和全球分支机构，以及多媒体、移动互联网等创新平台。</p>
<p>6.风语筑：风语筑是一家专注于语音技术和智能音频产品的公司。他们提供语音合成、语音识别、智能音箱等相关产品和解决方案，广泛应用于智能家居、车载导航、教育培训等领域。</p>
<p>7.天娱数科：天娱数科是一家专注于数字娱乐产业的综合服务提供商。他们提供音乐制作、音乐版权管理、数字音乐发行等服务，致力于推动数字娱乐产业的发展。</p>
<p>8.鸿博股份：鸿博股份是一家集智能终端设备制造、零售和物流配送为一体的公司。他们主要从事移动通信设备、电脑配件等产品的研发、生产和销售。</p>
<p>股市有风险，投资需谨慎。</p>
<p><strong>5未来发展</strong></p>
<p><strong>5.1发展趋势</strong></p>
<p>AIGC是PGC、UGC之后，全新的内容生产方式。不仅能提升内容生产的效率以满足我们飞速增长的内容需求，也能够丰富内容的多样性。在2022年百度世界大会上，李彦宏提到了：「AIGC将走过三个发展阶段：第一个阶段是『助手阶段』，AIGC用来辅助人类进行内容生产；第二个阶段是『协作阶段』，AIGC以虚实并存的虚拟人形态出现，形成人机共生的局面；第三个阶段是『原创阶段』，AIGC将独立完成内容创作。<strong>未来十年，AIGC将颠覆现有内容生产模式，可以实现以十分之一的成本，以百倍千倍的生产速度，去生成AI原创内容。</strong>」</p>
<p>从PGC到UGC再到AIGC，AIGC能让人类突破内容生产力枷锁，高效率生成高质量内容，让人类进入到真正的元宇宙之中。若要AIGC能够满足元宇宙的需求，独立完成高质量、高精度的内容，AIGC技术层面还需要一定的发展，我们可以分为软硬件两个维度看，软件层面主要包括自然语言处理技术、AIGC生成算法模型和数据集，硬件层面主要是算力、通信网络。</p>
<p>从业务层面看，结合国内外发展情况，目前在AIGC的知识产权归属方面尚有法律空缺，且创作伦理问题也未得到有效解决，因此无论是技术还是商业层面，高质、干净的数据集对于模型训练及内容生成均有至关重要的影响。同时，随着AIGC逐步落地，其算力需求将大增，未来相关企业除用云计算之外，或组建自有算力集群，考虑到英伟达A100、H100出口受限，相关国产算力芯片将有机会获得增量市场。</p>
<p><strong>5.2面临挑战</strong></p>
<p>技术上来看，虽然当前生成的图片、文字已经可以用以商业用途，但还存在一些问题使得无法满足较高的质量要求。我们可以发现在二次元或抽象的图片生成中，AIGC的表现较好。但对于比较具体和细节的内容，生成的效果不尽如人意。</p>
<p>运用的AIGC生成算法不同也会导致产生的内容的差距；数据集的质量、合规性、风格偏向都会决定生成的内容质量。</p>
<p>以上，我们可以看到若要使得AIGC生成的内容真正高效地被运用在商业层面，那么自然语言处理、翻译模型、生成算法和数据集这些细分赛道都还有很大的进步空间。</p>
]]></content:encoded>
    </item>
    <item>
      <title>大模型</title>
      <link>https://ujava.cn/model/bigmodel.html</link>
      <guid>https://ujava.cn/model/bigmodel.html</guid>
      <source url="https://ujava.cn/rss.xml">大模型</source>
      <description>让你了解什么是大模型 大模型（Big Model）是指在机器学习和人工智能领域中处理大规模数据和复杂模型的一种方法或技术。随着数据量的不断增加和模型的复杂度提高，传统的机器学习方法已经无法有效处理，因此大模型成为了解决这一挑战的重要工具之一。本文将介绍大模型的基本概念、应用场景以及一些常见的大模型技术。 大模型具有数千万甚至数亿参数的。近年来，随着计算...</description>
      <category>设计模型</category>
      <pubDate>Fri, 13 Dec 2024 10:01:47 GMT</pubDate>
      <content:encoded><![CDATA[<h2>让你了解什么是大模型</h2>
<p>大模型（Big Model）是指在机器学习和人工智能领域中处理大规模数据和复杂模型的一种方法或技术。随着数据量的不断增加和模型的复杂度提高，传统的机器学习方法已经无法有效处理，因此大模型成为了解决这一挑战的重要工具之一。本文将介绍大模型的基本概念、应用场景以及一些常见的大模型技术。</p>
<p>大模型具有数千万甚至数亿参数的。近年来，随着计算机技术和大数据的快速发展，深度学习在各个领域取得了显著的成果，如自然语言处理，图片生成，工业数字化等。为了提高模型的性能，研究者们不断尝试增加模型的参数数量，从而诞生了大模型这一概念。</p>
<p>大模型通常由深度神经网络构建而成，拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能，能够处理更加复杂的任务和数据。</p>
<p>大模型采用预训练+微调的训练模式，在大规模数据上进行训练后，能快速适应一系列下游任务的模型。</p>
<h3>什么是大模型？</h3>
<p>大模型是指在处理大规模数据和复杂模型时所采用的一种模型和算法。它通常具有以下特点：</p>
<ul>
<li>规模庞大的数据集： 大模型通常需要处理海量的数据，这些数据可能来自于互联网、传感器、日志文件等各种来源。</li>
<li>复杂的模型结构： 为了提高模型的准确度和泛化能力，大模型通常具有复杂的模型结构，如深度神经网络、集成学习模型等。</li>
</ul>
<p>理解大模型（Large Model）本质上就是理解两个关键词:<strong>大、模型。</strong></p>
<p><strong>首先我们理解什么是模型（Model）。<strong>模型是事物的抽象，可用于描述、解释和预测事物。例如数学公式、物理装置、计算机程序、人体模型都可以称为模型。在人工智能领域，模型</strong>特指学习算法从数据中提取的模式或规则，进一步用于数据的预测。</strong></p>
<p>这样理解可能会比较抽象，举个简单的例子：</p>
<p><strong>我们想让人工智能来识别图像里有没有猫，该怎么做呢？</strong></p>
<p>**第一步，我们要准备数据。**我们将大量有猫的图片和没有猫的图片做好标记，例如有猫标记为1，没有猫标记为0。</p>
<p><strong>第二步，用准备好的数据训练人工智能模型。<strong>我们将图片和标记的数据输入给人工智能算法，让它总结出</strong>一套规则</strong>来区分有猫的图片和没有猫的图片。比如，有猫的情况下，图片中应该有耳朵、胡须、毛茸茸的毛发等等。当然，彩色图片在计算机中实际上对应的是一个像素值的矩阵，<strong>人工智能识别的模式也通常是抽象的数字表示。</strong></p>
<p>这时候我们已经得到一个模型了，可以命名为「猫咪探测模型」！</p>
<p>**第三步，模型验证。**我们要预留一部分数据来检验模型效果。如果我们发现模型在数据上表现不佳，比如过拟合（指在某些特定数据上才表现效果好，比如只能识别橘猫），准确率低（常常把没有猫判断成有猫），那我们就需要调整模型。可以增加数据量、调整模型参数，甚至更换一种算法框架等等。<strong>当模型在大部分数据上表现都很好的时候，就可以上线了！</strong></p>
<p>**第四步，数据预测。**将随机找到的图片输入「猫咪探测模型」，让它给出图片中是否有猫的判断。</p>
<p><strong>更进一步，<strong>我们还可以训练模型，基于它学到的规则，来生成包含猫的图片，也就是</strong>数据生成。</strong></p>
<p>如果我们将识别猫，改成理解文字、预测并生成下一段文字，那就是大模型的基本流程了（更深层的还需要再看看自然语言处理模型相关的内容）</p>
<p><strong>再理解什么是大（Large），它主要体现在两个方面。</strong></p>
<p>首先是数据量大。大模型用于训练的数据量通常是数百GB或TB以上，以OpenAI的GPT 4.0为例，其训练时用了13万亿个token（自然语言文本基本单位），量级至少TB以上。<strong>就像一个博览群书、知识渊博的人一样，训练数据量大的好处是，模型可以充分的学习到数据中的模式和特征，在更广泛的场景下有更好的效果。</strong></p>
<p>其次，大模型的参数量大。在简单的线性回归模型y=Ax+B中，A和B是模型中的两个参数。而对于大模型，参数将达到数亿到数万亿。以OpenAI的GPT 4.0为例，它有1.8万亿参数。<strong>就像成年人大脑内有数亿个活跃神经元，参数量大意味着大模型可以理解更复杂的事情，从数据中学习到更复杂的规则。</strong></p>
<p><strong>研究表明，随着模型的规模（如参数数量、数据量、计算量）增大，其性能通常会随之提高</strong>；<strong>同时模型达到一定的规模时，它会表现出一些在小模型中不曾出现的新能力</strong>（如常识推理、创作能力），这些能力不是被特意设计或训练出来的，而模型的规模增长中“涌现”出来的，被称为涌现能力（Emergent abilities）。</p>
<p><strong>“读书破万卷，下笔如有神”。<strong>这也就是为什么</strong>大模型规模大、效果好</strong>的原因了。</p>
<h3>大模型的应用场景</h3>
<p>大模型在各个领域都有广泛的应用，以下是一些常见的应用场景：</p>
<ol>
<li>自然语言处理（NLP）： 大模型被广泛应用于机器翻译、文本生成、情感分析等任务中，如BERT、GPT等。</li>
<li>计算机视觉（CV）： 在图像识别、目标检测、图像生成等领域，大模型也取得了显著的成果，如ResNet、YOLO等。</li>
<li>推荐系统： 大模型在个性化推荐、广告点击率预测等方面发挥了重要作用，如DeepFM、Wide &amp; Deep等。</li>
<li>医疗健康： 大模型在医学影像分析、疾病预测等方面也有广泛的应用，如DenseNet、LSTM等。</li>
</ol>
<h3>常见的大模型技术</h3>
<ol>
<li>分布式训练： 通过将模型和数据分布在多台机器上进行并行训练，以加速训练过程，如TensorFlow的分布式训练框架。</li>
<li>模型压缩： 通过剪枝、量化、蒸馏等技术减少模型的参数和计算量，以在有限的资源下实现高效的推理，如Knowledge Distillation。</li>
<li>增量学习： 在已有模型的基础上，通过增量学习的方式不断更新模型以适应新的数据，如在线学习算法。</li>
<li>模型并行： 将模型的不同部分分配给不同的设备或计算节点进行并行计算，以降低计算复杂度，如模型并行和数据并行的结合。</li>
<li>模型优化： 通过改进模型结构、调整超参数等方式优化模型的性能和效率，如AutoML技术。</li>
</ol>
<h3>实例分析：深度学习语言模型GPT-3</h3>
<p>GPT-3（Generative Pre-trained Transformer 3）是由OpenAI开发的一个大型自然语言处理模型，具有1750亿个参数。它采用了深度学习和自监督学习的方法，在多个自然语言处理任务上取得了state-of-the-art的效果，如文本生成、机器翻译等。GPT-3的成功彰显了大模型在NLP领域的巨大潜力，并且在业界引起了广泛的关注和讨论。</p>
<figure><figcaption>img_3.png</figcaption></figure>
<p><strong>大模型和小模型的区别</strong><br>
</p>
<p>大模型和小模型在应用方面最大的区别是大模型偏向于全能化、通用化，而小模型一般偏向于解决某一垂直领域中的某个具体问题。比如一个图像识别小模型专门训练用来识别车牌号，对车牌号可以有很好的识别精度。但是一个图像识别大模型不仅可以识别车牌号，还可以识别我们生活中碰到的大部分图片，而且站在我们人类的视角来看，他似乎对图片中的内容有自己的理解，看起来拥有更高的智能化水平。</p>
<p>另外相比小模型来说，大模型通常具有更多的参数，能够学习更复杂的特征和模式。同时大模型的训练数据集也会更大，架构更为复杂，训练起来也需要更高的计算资源。</p>
<p>按照输入数据类型的不同，大模型主要可以分为以下三大类：<br>
</p>
<p><strong>语言大模型</strong></p>
<p>是指在自然语言处理（NLP）领域中的一类大模型，通常用于处理文本数据和理解自然语言。</p>
<p><strong>视觉大模型</strong></p>
<p>是指在计算机视觉（CV）领域中使用的大模型，通常用于图像处理和分析。</p>
<p><strong>多模态大模型</strong></p>
<p>是指能够处理多种不同类型数据的大模型，例如文本、图像、音频等多模态数据。</p>
<p>按照应用领域的不同，大模型主要可以分为 L0、L1、L2 三个层级：<br>
</p>
<p><strong>L0 通用大模型</strong></p>
<p>是指可以在多个领域和任务上通用的大模型。通用大模型就像完成了大学前素质教育阶段的学生，有基础的认知能力，数学、英语、化学、物理等各学科也都懂一点。</p>
<p><strong>L1 行业大模型</strong></p>
<p>是指那些针对特定行业或领域的大模型。它们通常使用行业相关的数据进行预训练或微调，以提高在该领域的性能和准确度。行业大模型就像选择了某一个专业的大学生，对自己专业下的相关知识有了更深入的了解。</p>
<p><strong>L2 垂直大模型</strong></p>
<p>是指那些针对特定任务或场景的大模型。它们通常使用任务相关的数据进行预训练或微调，以提高在该任务上的性能和效果。垂直大模型就像研究生，对特定行业下的某个具体领域有比较深入的研究。</p>
<p>大语言模型(Large Language Model，LLM)是大模型的子分类，是专门通过处理大量文本数据来理解和生成人类语言的AI系统，从而执行各种自然语言处理任务，如文本分类、问答、对话、内容总结等。我们最为常见的ChatGPT、百度文心一言、讯飞星火等都属于大语言模型。</p>
<p><strong>大语言模型LLM的基础架构</strong><br>
</p>
<p>目前流行的大语言模型的架构基本都沿用了当前NLP领域最热门最有效的架构—Transformer架构。Transformer架构来源于谷歌在2017年发表的论文《Attention Is All You Need》，翻译过来就是注意力就是你需要的一切。</p>
<p>注意力机制是大语言模型的核心机制，它让模型在处理文本时，能够同时关注输入中的所有词汇，无论句子长短，都能精准捕捉到远距离的语义关联。例如，在解析“华为公司发布了新款手机”这句话时，模型能够迅速聚焦“华为”与“手机”之间的关系，忽略“公司”或“发布”等词的干扰，这种能力使得大语言模型在处理大段文本、复杂语境时能够真正理解其表达的核心含义。</p>
<p>此外，大语言模型通过位置编码（Positional Encoding）的巧妙设计，模型得以理解文本中的词语位置和顺序，准确把握语言的时序特性，同时保留了高效的并行计算能力。</p>
<p>在企业数字化领域中，大语言模型常见的应用场景如下：</p>
<p>01&nbsp;<strong>知识库问答系统：</strong></p>
<p>通过提问的方式，快速查找企业知识库中的内容，并通过大模型对内容进行总结提炼并给出解决方案；如设备故障查询、设备运检查询、员工智能助手等。</p>
<p>02&nbsp;<strong>问答式BI系统：</strong></p>
<p>通过问答的方式让大模型进行数据库查询，并返回数据结果、可视化图形等内容，供用户进行便捷的数据分析。</p>
<p>03&nbsp;<strong>智能体系统：</strong></p>
<p>将大模型的自然语言能力和小模型的垂直领域能力进行整合，形成企业智能体系统，满足设备故障预测、电力负荷预测、供应商评估分析等智能化应用和预测场景。</p>
<h2>大模型思考</h2>
<ol>
<li>
<p><strong>算力是门槛</strong>：大模型对算力的要求，过去10年非常巨大。今天要做人工智能大模型，讲卡伤感情、没卡没感情。</p>
</li>
<li>
<p><strong>关于数据的数据</strong>：如果有GPT-5出来，可能会上到200T的数据量。但互联网上没有那么多好的数据，清洗完以后，可能20T就差不多到顶了，所以未来要做GPT-5，除了现有的数据，还要更多的多模态数据，甚至人工合成的数据。</p>
</li>
<li>
<p><strong>大模型的下一章</strong>：有很多多模态的科研工作要做，我相信一个非常重要的方向是多模态的理解和生成的统一。</p>
</li>
<li>
<p><strong>人工智能的范式转移</strong>：o1出来后，从原来的GPT的预训练思路，变成了今天的自主学习的道路，就是在推理这一步，不断地自我学习的过程。整个过程非常像人类思考问题、分析问题，也需要非常多的算力才行。</p>
</li>
<li>
<p><strong>大模型横扫千行百业</strong>：在中国的大模型建设浪潮当中，越来越多的是行业大模型。这个趋势肯定是这样的，未来通用大模型的占比会越来越低。</p>
</li>
<li>
<p><strong>AI Agent</strong>，从愿景到落地：超级应用一开始就在那里，这个超级应用就是一个超级助理，就是一个超级Agent。</p>
</li>
<li>
<p><strong>开源vs闭源</strong>：Meta的Llama并不是传统的开源，它只是开源了一个模型，并没有给你原代码和数据，所以我们在用开源系统的时候，也要下定决心真正理解大模型的系统闭源的工作。</p>
</li>
<li>
<p><strong>重视AI的治理</strong>：人工智能对千行百业、对整个社会的冲击非常大，要大家共同来面对。</p>
</li>
<li>
<p><strong>重新思考人机关系</strong>：真正把人机交互搞清楚，才能成为每一代高科技企业真正有商业价值的领导者。现在讲OpenAI加上微软就代表这个时代还太早，他们是领先了，但是未来还有很多想象的空间。</p>
</li>
<li>
<p><strong>智能的本质</strong>：虽然大模型已经给大家带来很多的震惊，但是我们对大模型、深度学习是没有理论的。关于人工智能的涌现，大家只是讲讲，并没有讲清楚。</p>
</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>大模型分类</title>
      <link>https://ujava.cn/model/modelcategory.html</link>
      <guid>https://ujava.cn/model/modelcategory.html</guid>
      <source url="https://ujava.cn/rss.xml">大模型分类</source>
      <description>目前为止，下面是常用的各种大模型本地部署工具和平台，按照不同性质可以分为以下几类和描述。 （1）综合部署与服务管理平台 这一类包括提供从到部署、管理和服务化的一站式解决方案的平台。这些工具通常支持模型的全生命周期管理，适用于需要高度集成和自动化的企业级部署。 主要包括：Ollama，LM Studio， Serve，GPT4ALL，vLLM，Huggi...</description>
      <category>设计模型</category>
      <pubDate>Fri, 13 Dec 2024 10:01:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>目前为止，下面是常用的各种大模型本地部署工具和平台，按照不同性质可以分为以下几类和描述。</p>
<h5>（1）综合部署与服务管理平台</h5>
<p>这一类包括提供从到部署、管理和服务化的一站式解决方案的平台。这些工具通常支持模型的全生命周期管理，适用于需要高度集成和自动化的企业级部署。</p>
<p>主要包括：Ollama，LM Studio，&nbsp;Serve，GPT4ALL，vLLM，HuggingFace TGI，OpenLLM，LMDeploy, FastChat, LangChain。</p>
<h5>（2）模型推理优化工具</h5>
<p>此类工具专注于提高模型的推理效率，通过硬件加速、算法优化等方式减少推理时间和资源消耗，适用于敏感的应用。</p>
<p>主要包括：TensorRT-LIm, FasterTransformer, DeepSpeed-MII, CTranslate2，FlexFlow&nbsp;Server&nbsp;MLC LLM，XInference。</p>
<h5>（3）专用/特定任务模型部署框架</h5>
<p>这些工具通常针对特定的或模型类型进行优化，提供特定领域解决方案。</p>
<p>主要包括：H2OGPT, PrivateGPT, Text Generation Inference，mlc-llm，QMoE。</p>
<h5>（4）通用的和深度学习库</h5>
<p>这类库提供广泛的模型支持和开发工具，使开发者能够轻松地访问、训练和部署各种预训练模型。</p>
<p>主要包括：PyTorch&nbsp;Transformer库，Hugging Face Transformers。</p>
<h5>（5）特定语言实现</h5>
<p>针对特定编程语言优化的工具，通常提供了更好的性能和更深的系统集成能力。目前主要是C或C++语言。</p>
<p>主要包括：llama.cpp，koboldcpp，PowerInfer，chatglm.cpp，qwen.cpp。</p>
<p><strong>其中最方便的人人都可以部署的三种傻瓜方式包括Ollama，GPT4ALL和LM Studio</strong>，都支持window，MAC和linux操作系统，搜索官网直接下载安装应用即可。</p>
<p><strong>下面对29种每个工具或平台进行一个概述。</strong></p>
<h4>1. Ollama</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>高度定制化服务</strong>：为企业提供根据其特定需求定制化的模型解决方案。
<ul>
<li><strong>强大的集成能力</strong>：支持与现有系统的无缝集成，提供丰富的API支持。</li>
<li><strong>实时优化和调整</strong>：平台支持模型在生产环境中的实时优化和动态调整。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>2. LM Studio</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>图形用户界面</strong>：提供直观的图形界面，简化模型管理和部署过程。
<ul>
<li><strong>预训练模型库</strong>：包含丰富的预训练模型，支持快速部署和易于使用。</li>
<li><strong>团队协作工具</strong>：支持多用户协作，便于团队成员共同开发和管理模型。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>3. Ray Serve</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>分布式架构</strong>：支持高效的分布式部署，轻松处理大规模并发请求。
<ul>
<li><strong>框架无关</strong>：可以与多种机器学习框架集成，如TensorFlow, PyTorch等。</li>
<li><strong>易于扩展</strong>：设计用于支持容易扩展和维护的部署。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>4. GPT4ALL</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>支持多语言</strong>：适合国际化部署，支持多种语言的GPT模型。
<ul>
<li><strong>灵活的扩展性</strong>：根据业务需求调整模型规模和计算资源。</li>
<li><strong>成本效率</strong>：提供多种定价策略，帮助用户有效控制成本。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>5. vLLM</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>虚拟化资源管理</strong>：优化资源分配，提高模型运行效率。
<ul>
<li><strong>支持大规模部署</strong>：设计用于处理大规模模型的有效部署和管理。</li>
<li><strong>高度定制的服务</strong>：提供客户特定的解决方案，满足不同的业务需求。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>6. HuggingFace TGI (Transformers Generative Inference)</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>易于接入</strong>：提供简单的API接入，支持快速部署Hugging Face库的模型。
<ul>
<li><strong>优化的推理性能</strong>：专为生成型任务优化，确保高效推理。</li>
<li><strong>广泛的模型支持</strong>：支持广泛的预训练生成模型，如GPT, BERT等。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>7. OpenLLM</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>开放源代码</strong>：鼓励社区贡献和共享，促进创新和改进。
<ul>
<li><strong>灵活的部署选项</strong>：支持云端和本地部署，以满足不同的业务需求。</li>
<li><strong>支持多种模型格式</strong>：兼容多种模型格式，方便用户迁移和使用。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>8. LMDeploy</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>一键部署</strong>：简化部署流程，支持一键部署到多个环境。
<ul>
<li><strong>自动化管理</strong>：提供自动化工具，帮助用户管理和监控部署的模型。</li>
<li><strong>高可用性</strong>：设计以确保部署的模型具有高可靠性和可用性。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>9. FastChat</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>实时交互优化</strong>：专为需要快速响应的聊天应用优化。
<ul>
<li><strong>轻量级部署</strong>：低资源消耗，适合移动和嵌入式设备。</li>
<li><strong>易于集成</strong>：提供API和工具，便于与其他应用和服务集成。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>10. LangChain</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>链式模型集成</strong>：支持将多个模型链式集成，创建复杂的AI应用。
<ul>
<li><strong>模块化设计</strong>：提供模块化组件，便于用户根据需求定制和扩展。</li>
<li><strong>自然语言处理专优</strong>：专注于提升自然语言处理任务的效果和效率。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>11. TensorRT-LIm</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>专为<strong><strong>NVIDIA GPU</strong></strong>优化</strong>：提高在NVIDIA GPU上的运行效率，专门针对深度学习推理进行优化。
<ul>
<li><strong>降低延迟</strong>：通过优化神经网络的图结构来减少推理时间。</li>
<li><strong>提升吞吐量</strong>：支持批量处理和多流输入，有效提高处理速度和吞吐量。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>12. FasterTransformer</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>Transformer****模型专优</strong>：专门为Transformer架构设计的优化工具，提供更快的处理速度。
<ul>
<li><strong>支持多种硬件</strong>：兼容NVIDIA GPU，提供CUDA加速。</li>
<li><strong>高效率的推理</strong>：优化了Transformer的注意力机制和层处理，提高了运行效率。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>13. DeepSpeed-MII</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>超大规模模型支持</strong>：适用于训练和推理超大规模深度学习模型，如多亿参数的Transformer模型。
<ul>
<li><strong>资源优化</strong>：显著减少模型运行所需的内存和计算资源。</li>
<li><strong>易于集成</strong>：提供与现有深度学习框架如PyTorch的兼容性。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>14. CTranslate2</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>机器翻译专用</strong>：专为机器翻译任务设计，提供高效的推理引擎。
<ul>
<li><strong>支持多种框架</strong>：兼容OpenNMT模型，支持从PyTorch和TensorFlow转换。</li>
<li><strong>高性能翻译</strong>：优化了翻译速度和资源使用，提高翻译质量。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>15. FlexFlow Server</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>并行训练优化</strong>：通过灵活的并行策略自动优化深度学习模型的并行训练。
<ul>
<li><strong>动态调整</strong>：根据硬件和任务动态调整并行策略，以达到最优性能。</li>
<li><strong>支持多种硬件平台</strong>：兼容多种GPU和CPU配置，增强其通用性和适用范围。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>16. MLC LLM</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>针对大型语言模型优化</strong>：专为大型语言模型如GPT-3等设计的推理加速。
<ul>
<li><strong>高效处理</strong>：优化处理流程，减少延迟，提升响应速度。</li>
<li><strong>支持多平台部署</strong>：适用于云端和本地部署，提供灵活的部署选项。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>17. XInference</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>跨框架支持</strong>：支持多种深度学习框架，如TensorFlow, PyTorch等。
<ul>
<li><strong>自动化优化</strong>：自动优化模型推理路径，提高效率和减少资源消耗。</li>
<li><strong>适用于多种应用</strong>：能够处理从图像识别到自然语言处理等多种类型的AI任务。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>18. H2OGPT</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>企业级部署</strong>：专为企业环境优化的GPT模型，提供稳定和可扩展的部署选项。
<ul>
<li><strong>定制化模型训练</strong>：支持企业特定数据的模型定制，确保模型输出与业务需求高度相关。</li>
<li><strong>集成学习能力</strong>：集成其他H2O.ai产品的机器学习功能，增强模型的智能和适用性。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>19. PrivateGPT</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>隐私保护</strong>：使用先进的加密和隐私保护技术，确保敏感数据在训练和推理过程中的安全。
<ul>
<li><strong>适用于敏感领域</strong>：特别适合在医疗、法律和金融等隐私要求高的行业使用。</li>
<li><strong>高度兼容性</strong>：支持与现有安全框架和政策的兼容，无缝集成进企业现有系统。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>20. Text Generation Inference</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>专为文本生成优化</strong>：提供针对各种文本生成任务（如聊天机器人、内容创作等）的优化推理解决方案。
<ul>
<li><strong>高效率推理</strong>：优化算法以减少生成任务的延迟，提高响应速度。</li>
<li><strong>支持多种语言模型</strong>：可适用于多种预训练语言模型，如GPT, BERT等。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>21. mlc-llm</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>针对大型语言模型的优化</strong>：专为处理大型语言模型设计，提高推理效率和速度。
<ul>
<li><strong>低延迟推理</strong>：优化模型架构和计算流程，以实现低延迟的模型推理。</li>
<li><strong>灵活部署</strong>：支持云和本地部署，满足不同环境下的需求。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>22. QMoE (Quality Mixture of Experts)</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>专家系统集成</strong>：通过组合多个“专家”模型来提高特定任务的处理质量和效率。
<ul>
<li><strong>动态路由算法</strong>：使用动态路由算法自动决定哪个专家模型在特定情况下最适合处理任务。</li>
<li><strong>适用于复杂多任务</strong>：特别适用于需要处理多种任务或有复杂需求的应用场景。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>23. PyTorch Transformer库</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>广泛的模型支持</strong>：支持多种Transformer架构，包括BERT、GPT等流行模型。
<ul>
<li><strong>灵活性与可扩展性</strong>：允许研究人员和开发者自定义和扩展模型，适应不同的研究需求和应用场景。</li>
<li><strong>强大的社区和资源</strong>：得益于PyTorch的广泛使用，这个库享有丰富的教程、工具和社区支持。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>24. Hugging Face Transformers</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>丰富的预训练模型库</strong>：提供超过数千种预训练模型，涵盖多种语言和任务。
<ul>
<li><strong>易于使用的****API</strong>：简化了模型下载、训练和部署的过程，使得AI技术更加易于接入。</li>
<li><strong>框架兼容</strong>：支持PyTorch、TensorFlow和JAX，适用于各种机器学习项目。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>25. llama.cpp</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li>**针对****C++**<strong>优化</strong>：在C++环境中提供高效的执行，适合需要嵌入式系统或资源受限环境的应用。
<ul>
<li><strong>性能高效</strong>：通过底层优化确保在高性能计算场景中的效率。</li>
<li><strong>易于集成</strong>：设计简洁，易于与其他C++项目和系统集成。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>26. koboldcpp</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>模块化设计</strong>：高度模块化的架构，便于用户根据需求进行自定义和扩展。
<ul>
<li><strong>跨平台支持</strong>：支持多种操作系统，提供灵活的部署选项。</li>
<li><strong>社区支持</strong>：虽为较新的工具，但已开始建立一个活跃的用户和开发者社区。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>27. PowerInfer</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>针对推理优化</strong>：专门设计以提高深度学习模型在生产环境中的推理性能。
<ul>
<li><strong>支持多种硬件</strong>：优化了对不同硬件平台的支持，包括GPU和CPU。</li>
<li><strong>高性能计算</strong>：为需要极端计算性能的应用场景提供支持。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>28. chatglm.cpp</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>专为聊天模型设计</strong>：优化聊天和对话系统的模型推理，提高响应速度和交互质量。
<ul>
<li>**C++**<strong>实现</strong>：在C++环境中实现，保证了高效的性能和良好的系统兼容性。</li>
<li><strong>可定制性</strong>：提供灵活的接口，允许开发者根据具体需求调整模型行为和参数。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>29. qwen.cpp</h4>
<ul>
<li>
<p><strong>特色描述：</strong></p>
</li>
<li>
<ul>
<li><strong>通用性和灵活性</strong>：设计为通用的机器学习部署工具，可适用于多种模型和任务。
<ul>
<li><strong>高效的数据处理</strong>：优化数据处理流程，确保即使在大数据环境下也能保持高效性能。</li>
<li><strong>强大的扩展性</strong>：支持用户根据项目需求添加新功能或改进现有功能。</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>RAG(Retrieval Augmented Generation）</title>
      <link>https://ujava.cn/model/rag.html</link>
      <guid>https://ujava.cn/model/rag.html</guid>
      <source url="https://ujava.cn/rss.xml">RAG(Retrieval Augmented Generation）</source>
      <description>一、什么是 RAG？ RAG 全称 Retrieval-Augmented Generation，翻译成中文是检索增强生成。检索指的是检索外部，增强生成指的是将检索到的知识送给大语言模型以此来优化大模型的生成结果，使得大模型在生成更精确、更贴合上下文答案的同时，也能有效减少产生误导性信息的可能。RAG的核心思想是让语言模型在生成回答或文本时能够动态地从...</description>
      <category>设计模型</category>
      <pubDate>Fri, 13 Dec 2024 10:01:47 GMT</pubDate>
      <content:encoded><![CDATA[<h3>一、什么是 RAG？</h3>
<p>RAG 全称 Retrieval-Augmented Generation，翻译成中文是检索增强生成。<strong>检索</strong>指的是检索外部，<strong>增强生成</strong>指的是将检索到的知识送给大语言模型以此来优化大模型的生成结果，使得大模型在生成更精确、更贴合上下文答案的同时，也能有效减少产生误导性信息的可能。RAG的核心思想是让语言模型在生成回答或文本时能够动态地从外部知识库中检索相关信息。</p>
<h3>二、为什么需要 RAG？</h3>
<p>之所以需要 RAG，是因为本身存在一些局限性。</p>
<h4>1.时效性</h4>
<p>模型的训练是基于截至某一时间点之前的数据集完成的。这意味着在该时间点之后发生的任何事件、新发现、新趋势或数据更新都不会反映在模型的知识库中。例如，我的训练数据在 2023 年底截止，之后发生的事情我都无法了解。另外，大型模型的训练涉及巨大的计算资源和时间。这导致频繁更新模型以包括最新信息是不现实的，尤其是在资源有限的情况下。</p>
<h4>2.覆盖性</h4>
<p>虽然大模型的非常庞大，但仍可能无法涵盖所有领域的知识或特定领域的深度信息。例如，某些专业的医学、法律或技术问题可能只在特定的文献中被详细讨论，而这些文献可能未被包括在模型的训练数据中。另外，对于一些私有数据集，也是没有被包含在训练数据中的。当我们问的问题的答案没有包含在大模型的训练数据集中时，这时候大模型在回答问题时便会出现幻觉，答案也就缺乏可信度。</p>
<p>由于以上的一些局限性，大模型可能会生成虚假信息。为了解决这个问题，需要给大模型外挂一个知识库，这样大模型在回答问题时便可以参考外挂知识库中的知识，也就是 RAG 要做的事情。</p>
<h3>三、RAG 的流程</h3>
<p>RAG 的中文名称是检索增强生成，从字面意思来理解，包含三个检索、增强和生成三个过程。</p>
<ul>
<li>
<p><strong>检索：</strong>&nbsp;根据用户的查询内容，从外挂知识库获取相关信息。具体来说，就是将用户的查询通过嵌入模型转换成向量，以便与中存储的知识相关的向量进行比对。通过相似性搜索，从向量数据库中找出最匹配的前 K 个数据。</p>
</li>
<li>
<p><strong>增强：</strong>&nbsp;将用户的查询内容和检索到的相关知识一起嵌入到一个预设的提示词模板中。</p>
</li>
<li>
<p><strong>生成：</strong>&nbsp;将经过检索增强的提示词内容输入到大语言模型（LLM）中，以此生成所需的输出。 流程图如下所示：</p>
</li>
</ul>
<p>!</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验41</title>
      <link>https://ujava.cn/manage/project41.html</link>
      <guid>https://ujava.cn/manage/project41.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验41</source>
      <description>在当今快速发展的商业环境中，项目集管理成为了组织实现战略目标、创造持续价值的关键手段。那么，如何理解项目集管理的精髓呢？本文将通过BASIC模型，深入剖析项目集管理的本质，并探讨其实践方法。 一：项目集管理的本质 B - 收益（Benefit） 项目集管理的核心关注点在于收益。有效的项目集管理能够通过协调各个组件间的依赖关系，与运营管理紧密配合，实现“...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>在当今快速发展的商业环境中，项目集管理成为了组织实现战略目标、创造持续价值的关键手段。那么，如何理解项目集管理的精髓呢？本文将通过BASIC模型，深入剖析项目集管理的本质，并探讨其实践方法。</p>
<p>一：项目集管理的本质</p>
<p>B - 收益（Benefit）</p>
<p>项目集管理的核心关注点在于收益。有效的项目集管理能够通过协调各个组件间的依赖关系，与运营管理紧密配合，实现“1+1&gt;2”的管理功效，为组织带来预期的增量收益。这种收益不仅体现在财务层面，更包括市场份额、客户满意度、品牌形象等多方面的综合提升。</p>
<p>A - 战略一致性（Alignment）</p>
<p>项目集管理必须始终与组织的战略保持一致。作为连接战略与执行的桥梁，项目集管理在组织中扮演着承上启下的角色。它决定了组织的资源分配、优先级设置以及整体协同效果，为组织的长远发展指明方向。</p>
<p>S - 相关方（Stakeholder）</p>
<p>对相关方的有效管理是项目集管理的难点与重点。项目集的成功与否，很大程度上取决于能否获得广大相关方的支持与参与。因此，项目集管理者需要深入了解各相关方的需求和期望，通过沟通和协调，确保项目集的收益能够与各相关方的利益相契合。</p>
<p>I - 整合（Integration）</p>
<p>从项目集整体视角出发，有效协调与整合项目集内各个组件，是项目集管理者的核心工作。这要求项目集经理不仅要关注单个项目的进展，更要从全局出发，把握项目集在不同阶段的主要任务、方向和目标，确保各个组件能够相互支撑、协同推进，最终实现项目集的整体收益。</p>
<p>C - 人才培养（Coaching）</p>
<p>人才培养是项目集成功不可忽视的核心基础。优秀的项目集管理者不仅具备专业的技能和知识，更懂得如何培养和激发团队成员的潜能。通过打造具备核心战斗力的团队，项目集管理者能够带领团队应对各种挑战，确保项目集的顺利实施和成功完成。</p>
<p>二：项目集管理的实践方法：TIPS</p>
<p>T - 通盘考虑（Think-through）：</p>
<p>项目集管理者需要具备全局观和前瞻性，从整体上考虑项目集的规划、实施和监控。通过全面分析项目集的各个方面，确保项目集与组织的战略保持一致，同时考虑各种可能出现的问题和风险。</p>
<p>I - 重事实，让数据说话（In fact）：</p>
<p>项目集管理需要基于数据和事实进行决策。通过收集和分析项目集的相关数据，管理者能够更准确地了解项目集的进展和问题，从而做出更加科学和合理的决策。</p>
<p>P - 寻找优先级（Prioritizing）：</p>
<p>在资源有限的情况下，项目集管理者需要明确各个任务的优先级，确保有限的资源能够得到最有效的利用。通过合理分配资源，确保项目集的关键任务得到优先处理，从而实现整体收益的最大化。</p>
<p>S - 发起动议搭平台（Sponsoring）：</p>
<p>项目集管理者需要积极与相关方沟通合作，发起并推动项目集的实施。通过搭建有效的沟通平台，促进各方之间的信息共享和协作，形成推动项目集成功的强大合力。</p>
<p>综上所述，项目集管理的精髓在于看透本质、关注关键要素。通过BASIC模型和实践方法TIPS的指导，项目集管理者能够更好地理解项目集管理的核心要点和实践策略，从而推动项目集的顺利实施和成功完成。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验42</title>
      <link>https://ujava.cn/manage/project42.html</link>
      <guid>https://ujava.cn/manage/project42.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验42</source>
      <description>如果你正在管理一个团队或项目，可能会需要同时在进行多个项目的管理。在这种情况下，追踪所有进行中的项目部分可能会迅速变得非常复杂。没有合适的管理过程，就难以确定哪些工作应该优先处理，也不容易确保团队有效管理工作量，更难以保证所有任务都能按时完成。 然而，有更好的方法来解决这些挑战，无论你需要努力组织和管理多个项目的工作，还是需要确保你的团队工作量可控，以...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>如果你正在管理一个团队或项目，可能会需要同时在进行多个项目的管理。在这种情况下，追踪所有进行中的项目部分可能会迅速变得非常复杂。没有合适的管理过程，就难以确定哪些工作应该优先处理，也不容易确保团队有效管理工作量，更难以保证所有任务都能按时完成。</p>
<p>然而，有更好的方法来解决这些挑战，无论你需要努力组织和管理多个项目的工作，还是需要确保你的团队工作量可控，以下几个策略将帮助你保持一切在正轨上运行。</p>
<h3>1、指定一个地方来管理所有的项目</h3>
<p>**问题：**缺乏所有项目的可见性</p>
<p>**解决方案：**在同一地方计划和管理所有团队的项目</p>
<p>例如，如果你正在管理一个产品路线图，并且有多个产品发布，你需要清楚地知道有多少个发布，每个发布包括了什么内容，以及将在何时进行每个发布。在同一地方规划和管理所有的发布可以让你迅速了解正在进行的所有活动以及整个路线图的状态。</p>
<p>比如有非常多的<strong>软件团队使用PingCode来进行多项目的管理</strong>，而<strong>非软件团队则是通过Worktile这类工具进行</strong>，以达到在同一地方计划和管理所有团队的项目的目的。这些工具能够大大提升项目以及过程的可见性。</p>
<h3>2、在项目开始时定义目标、计划、职责和期望</h3>
<p>**问题：**交付的成果和流程存在不一致性</p>
<p>**解决方案：**明确定义目标、计划和职责</p>
<p>没有统一的工作流程或项目规划流程可能导致交付的产品或服务在质量和形式上存在差异。这可能意味着每开始一个新项目，团队就必须重新建立新的管理流程，非常耗时。这还可能会导致一些任务被遗漏或忽视，进而影响项目的成功执行。</p>
<p>为了解决这个问题，必须确保团队在项目一开始就明确了计划、流程和职责。这包括明确项目的目标、计划时间、每个步骤和工作内容以及负责人。还要注意留出时间进行反馈和审批，因为如果急于完成项目而没有明确计划，这些环节可能很容易被忽视。</p>
<p>然后，要在项目级别和团队级别设定明确的计划、流程和职责。明确的沟通和目标设定将有助于实现项目目标，这些项目目标又将有助于实现团队目标，进而有助于公司实现其整体目标。</p>
<p>为了最大限度地利用项目管理的好处，应设定一一些团队范围的共识和标准操作流程。例如，对于大型项目，可能需要项目负责人在规划项目计划之前先创建项目简介。此外，还可以为团队经常执行的项目创建模板，它们可以确保每个项目都以相同的方式执行，无需重新考虑每一个小步骤。</p>
<h3>3、优先考虑将产生最大影响的工作</h3>
<p>**问题：**不确定应该优先处理哪些项目</p>
<p>**解决方案：**观察每个项目如何逐步实现更大的公司目标，并基于这些项目可能产生的影响来设定优先级</p>
<p>虽然先选择最容易的项目来执行可能很吸引人，但要抵制这种诱惑，相反，应该基于项目对公司目标的最大影响来设置优先级。作家Kasey Fleisher Hickey表示：“<strong>你的首要优先事项应与这些目标保持一致，并帮助你更接近实现它们。</strong>”无论是在大规模（例如推迟低影响项目）还是小规模（例如按重要性组织日常任务）的层面上，都应该战略性地优先处理工作。例如，如果团队正在进行五个产品发布，其中一个项目对新客户收入的影响远大于其他四个，而另一个项目对客户保留和长期价值（LTV）的影响最大。由于LTV是公司的更高优先事项，因此应确保第二个产品得到充分支持。</p>
<h3>4、授权你的团队在优先级发生变化时保持灵活性</h3>
<p>**问题：**团队在追踪不断变化的优先事项和重新分配工作方面缺乏便捷的方法</p>
<p>**解决方案：**需要一种灵活的方法，能够从全局视角查看团队的所有工作，并在优先事项发生变化时灵活调整</p>
<p>确定团队优先事项并对工作达成一致非常关键，但同样重要的是能够灵活改变方向。然而，如果团队在多个工具（如电子表格和待办事项列表）中跟踪工作，可能会使管理和了解团队在任何时候都在做什么变得复杂和困难。</p>
<p>当优先事项发生变化时，没有清晰的追踪和管理工具，你可能无法轻松了解他们需要重新安排什么，每个人的忙碌程度，或如何追踪搁置的工作。为了解决这一问题，可以通过实施变更控制流程来确保优先事项和任务的有序管理。</p>
<p>通过与团队共享一个中心真实信息源，可以管理多个项目，而不必担心优先事项的变化。由于每个人的工作都是可见的，你可以迅速了解团队的带宽（可用资源）和当前任务。当需要重新设置任务的优先级时，这种可见性确保你可以轻松做到这一点，而不必担心任务会完全丢失。</p>
<p>无论是线上还是线下，一定要保持沟通流畅，无论是在线还是线下。在项目管理工具中，或者在定期的一对一会议中，定期与团队成员沟通，了解他们的工作量，并确保一切正常运作。</p>
<h3>5、清晰地管理和传达期望</h3>
<p>**问题：**你和你的利益相关者在何时发生什么事情上存在分歧</p>
<p>**解决方案：**在工作发生的地方进行沟通和协作</p>
<p>一些团队可能遭受沟通问题的困扰，原因在于他们对自己的工作、合作伙伴的工作，以及与项目相关的其他职能方面的工作缺乏透明度或可视性。当人们无法清楚地了解其他人正在做的工作时，他们可能不理解为何时间表会发生变化，优先事项是否发生改变，以及项目进展的具体情况。</p>
<p>解决方案是在工作发生的地方进行沟通和管理。这样可以确保团队和其他利益相关者能够充分理解工作背后的情况。通过提供实时更新，每个人都可以了解项目的当前状态。</p>
<p>为了始终如一地实现这一沟通策略，最佳的方法是使用工作管理工具。这样的工具允许在工作实际发生的地方分享状态和进展更新。这意味着可以轻松地通过点击一下按钮收集和分享信息，而不是在各种工具之间手动收集和更新数据。这样的方法可以增加效率，并确保所有利益相关者都能轻松地访问最新的项目信息。</p>
<h3>6、查看跨项目的工作，以平衡工作量和时间表</h3>
<p>**问题：**不确定每个团队成员的工作量是否过多或过少</p>
<p>**解决方案：**确保你有一种方法可以查看项目之间的员工工作量</p>
<p>在不同地方计划每个项目的第二个隐患是：你将无法看到某个员工在所有不同项目中的全部工作。这意味着可能必须依赖团队来报告工作量是否过多或过少，从而导致难以在问题失控之前解决，例如未能按时完成任务或未能识别未充分利用人力。</p>
<p>将所有项目管理在同一个地方是解决这个问题的第一步。需要实际查看每个项目的所有任务，了解它们分配给谁以及日期范围，从而发现工作量过重的员工和项目时间线冲突。随后可以推迟、删除或重新分配任务以保持项目的正常运行。但是，并非所有工具都有这样做的功能，所以选择具有此功能的工具很重要。</p>
<p>例如，可能有一位设计师负责一项小任务（如编辑照片）为你下个月就要发布的下个产品发布做准备，但同时还要单枪匹马地设计、打印和交付会议宣传册、名片和海报，而另一位设计师却有空闲时间。通过观察每个人的工作量，可以迅速发现这种不平衡，并相应地重新分配工作。</p>
<h3>7、调整项目计划以最大限度地提高团队生产力</h3>
<p>**问题：**项目启动日期未协调一致，导致员工工作过多，工作受阻，项目延迟</p>
<p>**解决方案：**整体考虑项目的全部范围来安排和协调团队的工作</p>
<p>即使项目计划得再精心，如果没有整体考虑团队在月度、季度或年度的全部工作范围来进行安排，也可能导致项目脱轨。例如，如果尝试同时启动三个不同的网络更新，可能会因团队一次尝试做太多事情而导致它们相互冲突或拖延。</p>
<p>相反，在安排和协调团队工作时，要考虑到整个项目的全部范围，并考虑实施事故管理计划。以下是一些提示：</p>
<ul>
<li>
<p><strong>错开类似项目的开始日期</strong>：如果同一个团队在多个项目上工作，可以错开每个项目的开始和完成日期。这样一来，个人就不会试图同时完成多个不同项目的工作，而是能够集中精力完成一个项目，然后再转向下一个。</p>
</li>
<li>
<p><strong>留意依赖关系</strong>：例如，在开始建立新网站之前，可能需要先完成基础设施的全面改造。因此，应该合理安排时间，让依赖的项目在第一个项目计划完成之后才开始，确保项目顺利进行。</p>
</li>
<li>
<p><strong>标记重复任务</strong>：如果在不同的项目中有相同的工作部分，应该合并它们，以避免重复劳动。无论是启动新供应商还是购买拍摄营销视频的设备，都需要确保这些共享任务能及时完成，从而保证两个项目的正常运行。</p>
</li>
</ul>
<p>时间安排可能是决定多个项目能否正常运行，并帮助团队保持最高生产力的关键因素。通过合理安排和协调时间，可以确保多个项目同时高效推进。</p>
<h3>8、委派工作，但保持可见性</h3>
<p><strong>问题</strong>：管理者往往在细致入微的管理和放养的平衡问题上挣扎。过度干预可能会令员工感到压迫，而完全缺席则可能使管理者对团队的工作一无所知</p>
<p><strong>解决方案</strong>：共享一个团队的“真实的信息中心”，这样你可以在必要时查看工作的进展</p>
<p>无论是产品经理还是项目经理，都不想成为过度干预下属的细致入微的管理者。然而，如果失去对任务的掌控，或者对团队正在进行的工作一无所知，那么几乎不可能成为一位有效的领导者。</p>
<p>有一个好的解决方案，那就是通过与团队共享一个真实的单一信息来源（可以借助PingCode这类工具建立），以便能够追踪每个人正在做的所有工作。这可以是一个集中共享的项目管理工具或平台。当团队的所有工作都集中在一个共享的项目中，领导者可以一目了然地了解每个人的工作内容、任务的截止日期，以及它们的进展情况。这样，可以在必要时查看任务的情况，而不需要微管理它们。</p>
<h3>9、跟踪并保存工作流程——而不是每次都重新造轮子</h3>
<p>**问题：**每个项目开始时都在重新构建工作流程</p>
<p>**解决方案：**模板化并简化项目计划过程</p>
<p>想象你刚完成了一个季度的营销活动，但在为下个季度做准备时，你发现自己不记得具体的工作安排。因为工作已经发生了许多变化，并且你正在管理多个项目，所以你不确定最初的组成部分是什么。如何在确保不遗漏任何关键任务的情况下复制活动？</p>
<p>不要在每个项目开始时重新造轮子。相反，将启动项目的方式模板化并简化，这样你可以反复使用工作流程作为模板，你可以借助Excel，也可以使用Worktile这样的工具帮你自动创建模板。当需要协调新项目时，使用自定义模板开始工作，可以更快、更高效地展开工作。</p>
<p>此外，要确保定期更新模板，添加新任务或步骤，或正在构建的新工作流程。将模板视为一份灵活的文档——应不断使用最佳实践和新见解来更新模板，以获得最有效、最高效的流程。确保将模板保存在团队的核心真实信息来源中，这样每个人都可以访问，并可以轻松启动项目。</p>
<h3>成功管理多个项目</h3>
<p>作为团队负责人，同时管理多个项目是常见的工作现实，这可能涉及许多复杂和挑战性的任务。希望这些提示能帮助你跟踪所有项目的运作情况，保持组织有序，按时完成任务，并确保每一次都能成功完成所有项目。</p>
<p><strong><em>常见问答（FAQ）：</em></strong></p>
<p><strong>问：如何合理分配资源？</strong></p>
<p>答：合理分配资源需要了解每个项目的需求和优先级，确保关键资源在关键时刻可用，并通过跟踪和监控来平衡资源的使用。</p>
<p><strong>问：使用项目管理工具有什么好处？</strong></p>
<p>答：项目管理工具可以帮助组织和跟踪项目进度，促进团队协作，提供实时更新，并有助于识别和管理潜在风险。</p>
<p><strong>问：如何保持团队沟通？</strong></p>
<p>答：保持团队沟通可以通过定期会议、使用协作工具、确保信息透明和及时反馈等方式来实现。良好的沟通有助于确保团队成员了解项目目标和期望，从而提高效率。</p>
<p><strong>问：多项目管理中的风险管理如何进行？</strong></p>
<p>答：风险管理涉及识别、评估和优先处理可能对项目产生负面影响的不确定因素。这可能包括使用风险管理工具、定期审查风险和制定应急计划等。</p>
<p><strong>问：如何确保多项目管理的质量控制？</strong></p>
<p>答：质量控制可以通过设置明确的质量标准、定期审查进度、使用质量管理工具和鼓励团队成员对质量承担责任等方式来实现。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验43</title>
      <link>https://ujava.cn/manage/project43.html</link>
      <guid>https://ujava.cn/manage/project43.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验43</source>
      <description>01把握好项目的五个阶段 一般来说，分成启动、计划、实施、控制和收尾五个阶段，每个阶段都有一些要点值得项目经理重点关注。做到知己知彼，能让我们的管理工作更有章法。 1、启动阶段三件事儿： 第一，澄清，找准项目背后的问题所在; 第二，找准，特别是潜在的支持者和反对者，团结一切可以团结的力量; 第三，风险评估，结合公司内外部的环境，做出风险预案。 2、计划...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p><strong>01把握好项目的五个阶段</strong></p>
<p>一般来说，分成启动、计划、实施、控制和收尾五个阶段，每个阶段都有一些要点值得项目经理重点关注。做到知己知彼，能让我们的管理工作更有章法。</p>
<p>1、启动阶段三件事儿：</p>
<p>第一，澄清，找准项目背后的问题所在;</p>
<p>第二，找准，特别是潜在的支持者和反对者，团结一切可以团结的力量;</p>
<p>第三，风险评估，结合公司内外部的环境，做出风险预案。</p>
<p>2、计划阶段三件事儿：</p>
<p>第一，组建项目的核心小组，成员要能满足项目对于经验、技能和资源的要求。</p>
<p>第二，完成任务分解，跟据“横向到边，纵向到底”的原则，使项目的足够分解到个人或小组可完成、可测量的程度。</p>
<p>第三，设置进度安排，为各项任务设定责任人、完成时间并匹配所需资源。特别提醒注意的是，项目经理要有从公司外部整合资源(人及财物)，以及适当“外包”项目工作的意识，要有超越公司边界的全局意识。</p>
<p>3、实施阶段三件事儿：</p>
<p>第一，带好团队，通过基于事和基于人的方式对团队进行激励;</p>
<p>第二，管理项目进度，通过会议、文档及相关的项目管理工作，使项目有序推进;</p>
<p>第三，处理好沟通协作的问题，特别是跨部门、跨部门的沟通问题，争取让各方都能在协作中实现各自价值。这里我想特别提醒一下，协作的基础是价值共享，项目经理要争取让协作各方能够获得或物质、或荣誉、或情感上的回报，这样的协作关系才持久。</p>
<p>4、控制阶段三件事儿：</p>
<p>第一，识别计划的偏离，判断变化影响的是任务还是目标，因势而变。第二，用好控制工作，包括费用表、人员负载量表等，使项目资源与项目进度相匹配。第三，设定并管理项目的里程碑，通过不断实现“小”的胜利，来实现项目“大”的成功。</p>
<p>5、收尾阶段三件事儿：</p>
<p>第一，总结汇报，通过有效的形式呈现项目成果，并做完整交付。</p>
<p>第二，项目复盘，要深入分析项目目标、项目里程碑与最终成果之间的差距，分析得失，固化经验。</p>
<p>第三，项目，不单单是资料留存，更重要的是知识流转和应用。</p>
<p>当然，每个阶段要做的工作远不止三件儿。这里主要是为了方便大家理解和记忆，做了一些甄选。好的项目经理，不需要死记硬背这些内容，因为这些要点已经融入到了他的全盘工作计划中。</p>
<p>!</p>
<p><strong>02清醒认识项目管理与传统管理的区别</strong></p>
<p>项目管理与传统管理有很多相同之处，也有一些独特的地方值得我们注意，着重提示三点：</p>
<p>1、要明确项目经理的权利边界</p>
<p>不同的公司，项目经理的权利大小真的会有天壤之别。但多数情况下，项目经理拥有的是“虚线”权利，即组织、协调的权利，并不能直接决定团队成员的绩效、薪资乃至升迁。在这样的情况下，建议项目经理一方面向公司争取自己的权利资源，为自己的团队激励手段增添砝码;另一方面，通过个人影响力、通过成果共享、荣誉共享等软性因素来带领团队。</p>
<p>2、要注意项目管理中的“柔性”</p>
<p>通常来说，越是复杂的项目，成员的多样性就越强。这就要求项目管理在带团队的时候，能因人而异地情境式领导。好的项目经理，往往要能够容忍一定的模糊性。</p>
<p>3、要注意与职级高于自己的团队成员处理好工作关系</p>
<p>越来越多的企业推行P族和M族的职业发展双通道，这就导致很有可能出现低层级的项目经理带领高层级的专业人才的现象。所谓术业有专攻，项目经理要对自己有信心，用平等、平和的心态与团队成员相处。</p>
<p>!</p>
<p><strong>03项目经理的“蜕变”</strong></p>
<p>稚嫩——善用(如流程、表单、协同办公软件等)，但又不拘泥于工具。工欲善其事必先利其器，用好工具能让项目工作事半功倍。项目经理之于工具，要看到工具背后的价值和意义，让工具作为管理的辅助，而不是为了显示专业。</p>
<p>成熟——善于将工作模块化分工，使合适的人做合适的工作，并让项目成员有相对独立的成就感。分工是管理技能的核心，很多项目经理只是单纯地将工作分下去，而不考虑人员匹配的问题，更不考虑成员个体感受的问题。员工成就感是现在80后、90后管理的一个核心点，项目经理要通过合理分工(工作有衔接但又相对独立)来在项目进行中为成员“设计”成就感。</p>
<p>卓越——能够抓住工作主线的项目管理能力。做项目都知道有个概念叫“”，其实从管理的角度就是抓主要矛盾，抓关键问题。多数情况下，项目经理不需要做很多很细节的工作，但是他要能为团队：争取关键资源;在复杂决策前敢于拍板;能够对重要风险有提前预警的能力。</p>
<p>这些能力的获得，往往需要长时间的项目磨砺。职场中的每个人，如果不是项目经理，那么就一定是一个或若干个项目的团队成员。了解并掌握项目管理的核心要素，将有助于我们不断提升职业化的工作能力，并不断创造新的价值。</p>
<p>!</p>
<p><strong>04必备七大秘诀</strong></p>
<p>1、坚强的领导核心</p>
<p>作为一个项目部，项目经理理所当然地居于管理的核心位置，他的组织、管理、沟通及协调能力，甚至人格魅力都是极为重要的。一个项目的成败，可以说项目经理起到了决定性作用，因为他是统领项目的最高决策者。一个具有全局眼光、的领导者，能在千头万绪中抓住要害，关注重点，又能对下充分授权，抓大放小。</p>
<p>一个项目仅有强悍的项目经理是不够的，项目班子成员紧密团结在项目经理周围，方可确保令出一致、禁行令止、互为支持。项目班子既要讲民主，大事一起商量，开诚布公，不独断，不专行;同时，也要讲集中，在充分调查事实、协调各方意见的情况下，进行意见的统一。</p>
<p>所以说，组成一个坚强的项目管理班子，是成功的项目管理的关键要素。</p>
<p>2、成功的团队建设</p>
<p>一个项目部管理人员多则上百人，少则数十人，共同组成一个。，实际上是一个临时机构，它随着项目的开工而成立，随着项目的完工而解散，中间不断有人抽调而走，也有补充进来，人际关系的变幻、工作内容的更迭时刻都在发生。</p>
<p>工程自身的特性注定了项目管理的艰苦、枯燥，再加之繁重的工作任务、巨大的精神压力，情绪压抑很普遍，由此项目的人性化管理就显得非常重要。它需要营造一个快乐的工作氛围，通过组织各类活动，比如旅游、球类比赛、演讲比赛、文艺演出等，甚至不时的项目聚餐，以充分发挥特别是年青管理人员的才华，缓解紧张情绪，加强项目凝聚力，提升项目战斗力。这些活动，做为项目领导班子，不但要大力提倡和支持，还应该尽可能地参加，其效果是很明显的。</p>
<p>3、前瞻的</p>
<p>“项目不是在结束时失败，而是在开始时失败”，由此说明项目管理策划的重要性。</p>
<p>应该在项目成立之初展开，一般包括管理目标、管理模式、组织架构、项目经理授权、总进度计划、现场管理人员流量、分包方案、物资采购方案、施工机械及监测设备配置方案、办公设备配置计划、现场临建方案、临水临电方案、计划、主要技术方案、现场作业人员流量、资金流量计划及等十几个方面。</p>
<p>项目管理策划由项目部配合总部机构联合编制，应切合实际，科学合理，具有可操作性。策划经内部审批后，进行项目全体管理人员交底，做到人人熟知，自觉执行，贯彻落实。实施过程中，不断对照检查，及时纠偏，确保大方向不错，大目标不偏。</p>
<p>4、严格的制度考核</p>
<p>1、包括对项目内部管理制度，比如各项例会制度、、人员考核制度及内部工作流程等;</p>
<p>2、包括工期、质量、安全、文明施工等方面的具体考核办法，比如对工期，在确定各节点目标时，应与分包商签订目标责任状，约定奖罚额度，严格进行过程和节点考核，并及时兑现;</p>
<p>3、还应建立专项总包和分包管理制度，明确总、分包管理职责，和管理要求等。</p>
<p>大多数企业都制定有各项，但不能原封照搬。每个项目都有其自身的特点，在制订各项制度时应结合自身情况予以调整，甚至很多制度需重新或自创制定。</p>
<p>5、谨慎的分包选择</p>
<p>一般的劳务公司没有相应的管理机构，更谈不上管理，也没有相对固定的熟练工人，法律债务的执行能力很差，遇到劳资纠纷或工伤纠纷就采取回避、躲藏或推诿的方式，将总承包商推到前面。</p>
<p>因此，大多数公司选择长期合作的分包队伍，但是这样的队伍是很有限的。随着公司合同额的急剧增大，承接的项目越来越多，原有的分包远远满足不了工程的需要，出现了分包乱拉工人、找临时工的情况，对工程进度、质量等方面的管理造成不良影响。</p>
<p>为此，总承包商尝试引进新的队伍，寻求扩大分包选择空间。但是，由于对新队伍了解不深，加之这些队伍良莠不齐，对比原有的队伍反而感觉有较大差距，甚至有些队伍中途撒手不干，直接导致总承包商不敢大胆使用，成为目前不少建筑企业遇到的两难问题。</p>
<p>所以，这需要从公开招投标、的交纳、劳务来源的控制、实名制的推行、工人工资的发放等方面加强管理，以降低管理风险。</p>
<p>6、有力的技术保障</p>
<p>面对超大、复杂的结构，强有力的技术保障尤为重要。</p>
<p>比如：</p>
<p>1)整个的预起拱控制，以确保网壳曲线、弧度等最终符合设计要求;</p>
<p>2)央视新址两个巨大的悬臂钢结构，如何进行预起拱及确保准确合龙的问题;</p>
<p>3)国家体育场大量不规则的异型钢结构的加工制作和安装问题;</p>
<p>4)昆明新机场七条巨型钢彩带弯扭构件的加工制作及安装问题等。</p>
<p>所以，项目部必须配备足够的技术管理人员，由一名经验丰富、坚毅干练的带头人负责，进行大量繁杂、细致的技术工作。还得做好零碎、繁琐的事，比如图纸、测量、试验、资料及等，做为技术负责人必须时刻关注这些问题，安排合适、胜任的人员，并要有较强的预见性和计划性，通过技术例会制度进行布置、落实及检查，避免意外问题发生，以造成不良影响和不必要的损失。</p>
<p>7、有效的风险控制</p>
<p>1)对于合同风险，主要通过耐心、细致的合同谈判工作尽量加以避免，对明显不合理、不公平的条款需做大量的说服工作，对于每项条款都应仔细分析、推敲，避免合同重大误解和陷阱。</p>
<p>2)对于工期风险，往往是因为投标时由业主规定且必须响应形成的。这些严重压缩的工期，还经常伴随着巨额的延期处罚。面对这种情况，一方面需要强有力的施工组织，先强内功，确保工程顺利推进;另一方面，利用不可抗力因素、工程款支付及非承包商自身原因，加强。最为关键的是，利用工程进展顺利的有利形势，营造双方融洽的氛围，不失时机地签订工期，或重新确定业主认可的工期节点目标，以化解工期风险。</p>
<p>3)对于质量风险，有些业主不切实际地确定过高的质量目标，由于工程自身条件限制而难以达到，合同中却约定了较大额度的奖罚。面对这样的问题，应切实抓好工程质量，争取本应可取得的质量奖项，避免因质量问题在结算时受到制约。同时，也要耐心向业主解释，取得谅解，同意降低质量获奖目标。</p>
<p>4)安全风险是一个较为严峻的问题，很多地区制定了专门针对建筑企业因死亡事故要求退出当地建筑市场或停止一定时间投标的规定，且当前对工人的伤亡赔偿额与日俱增，一旦发生安全事故对于一个项目、一个企业可能都是致命的打击。因此，加强安全防范、加大安全投入、杜绝死亡事故的发生是规避安全风险的当务之急。</p>
<p>5)成本风险是每个项目必须面对的切实问题，激烈的市场竞争，普遍的低价中标，不规范的业主行为，加剧了成本风险。针对成本风险，应逐项认真分析，采取切实可行的开源节流方法。对亏损项目，可从分包竞标、材料方面低价选择，严格控制成本支出。同时，运用或改变做法等方式，是避免亏损的有效途径。</p>
<p>6)劳务风险也是一个不可忽视的问题。选择一个实力雄厚、管理有序、讲求信誉的，可有效降低工期、质量及安全管理等带来的风险。工人工资发放、等问题，已经成为近年来社会、政府关注的焦点，必须引起高度重视，应在劳动合同签订、实名制落实、劳资发放监控、工人上访有效管理等方面加大管理力度，建立规则制度和预案，由专人负责日常管理，成立突发事件处理小组，才能较好地控制劳务风险。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验44</title>
      <link>https://ujava.cn/manage/project44.html</link>
      <guid>https://ujava.cn/manage/project44.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验44</source>
      <description>每个人一天的时间都一样多，但你可能觉得管理时间比大多数人都难。这种情况并不奇怪，许多经理每天都在为此而苦苦挣扎。平衡有限的资源和满足紧迫的最后期限是经理面临的最大压力的两个主要领域。 令人震惊的是，37%的项目因目标不明确或与业务目标不一致而失败。然而，有一个解决方案——项目组合管理（PPM）。它可以帮助您处理多个项目并克服这些挑战。 在本文中，您将了...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>每个人一天的时间都一样多，但你可能觉得管理时间比大多数人都难。这种情况并不奇怪，许多经理每天都在为此而苦苦挣扎。平衡有限的资源和满足紧迫的最后期限是经理面临的最大压力的两个主要领域。</p>
<p>令人震惊的是，37%的项目因目标不明确或与业务目标不一致而失败。然而，有一个解决方案——项目组合管理（PPM）。它可以帮助您处理多个项目并克服这些挑战。</p>
<p>在本文中，您将了解什么是项目组合管理、它的好处以及如何在您的组织中实施它。</p>
<h3>什么是项目组合管理？</h3>
<p>项目组合管理 (PPM) 是分析和优化组合中所有项目和计划的成本、资源、技术和流程。它通常由组合经理或项目管理办公室 (PMO) 完成。</p>
<p>项目组合管理提供了一个结构化的环境，用于决定资助、维持或取消哪些项目、计划和举措。PPM 流程是一种持续的机制，可确保项目与其战略意图保持一致，遵守其原始业务案例中定义的假设，并在开发过程中做出的决策基于及时和准确的数据 - 所有这些都由项目组合经理或PMO完成。所有这些都是通过评估业务方面、监控预算、预测和降低风险以及让其他利益相关者了解情况来完成的。</p>
<h3>项目组合管理与项目管理</h3>
<p>由于名称相似，“项目组合管理”和“项目管理”常常被混淆，它们是两种截然不同的方法。</p>
<p>一方面，项目管理侧重于管理单个项目，处理预算、角色分配和进度报告等任务。另一方面，项目组合管理着眼于全局，重点分析相关项目组，以确保其与公司总体目标完美契合，帮助组织选择项目并提供显著效益。</p>
<p>根据PMI 的说法，投资组合管理通过提供项目组、资源和相互依赖关系的整体视图，将战略与实施联系起来。如果使用得当，它可以带来一些关键好处。</p>
<p>PPM 可帮助您同时监督所有项目，从而更轻松地做出明智决策。了解每个项目如何实现您的总体目标有助于您确定优先级并更好地规划。苏格兰皇家银行通过投资组合和资源管理简化了其数据和决策流程，最终降低了成本并提高了部门间的透明度。</p>
<p>项目管理可能很困难，因为您必须明智地管理资源。Cengage Group在使用电子表格规划项目容量时遇到了很大困难，这进一步增加了流程的复杂性。</p>
<p>因此，他们决定投资一个系统，帮助管理资源并规划他们可以处理多少工作。现在，他们可以更好地决定要开展哪些项目，并看看是否需要雇用更多人手。</p>
<p>将所有项目放在一起跟踪有助于您发现在单独查看每个项目时可能会忽略的潜在问题。Excellus BlueCro ss BlueShield无法确定其团队可以处理多少工作，因此他们使用新系统来跟踪其项目和资源。这有助于他们降低风险。他们可以做出更好的决策并改进时间表提交。现在，他们可以根据实际数据制定更好的计划，并确保他们有足够的资源按时完成工作。</p>
<p>投资组合和资源管理可帮助Flo wserve这样的公司保持正轨并做出更好的决策。通过使用自动化工作流程来审查项目，他们可以更好地管理工作、加快产品发布速度并控制成本。这使他们更容易实现目标并取得成功。</p>
<p><strong>实施项目组合管理的五个步骤</strong></p>
<p><strong>1. 明确组织的目标和宗旨</strong></p>
<p>在开始管理投资组合之前，您需要确保它符合公司的目标和计划。您希望您的投资组合能够支持公司想要实现的目标，并且对您的客户和财务而言物有所值。</p>
<p>作为投资组合经理，您需要与您的团队就目标达成一致，并决定如何选择要开展的项目。</p>
<p><strong>2. 管理项目想法</strong></p>
<p>一旦你确定了作品集的目标，就该开始构建它了。你可以收集已在进行的项目或足够相似的项目创意，以便同时开展。</p>
<p>获取有关这些项目的信息，并确定选择继续进行哪些项目的最重要因素。</p>
<p><strong>3. 选择并确定项目优先顺序</strong></p>
<p>在为您的投资组合选择最佳项目时，重要的是要确定它们的价值。为此，您可以使用诸如回收期、净现值和风险水平等标准。这些标准有助于衡量每个项目为您的投资组合增加了多少。</p>
<p><strong>4.验证项目的可行性</strong></p>
<p>现在您已经为您的投资组合挑选了项目，现在是时候研究它们是否合适了。这意味着要考虑财务风险、您能承受的程度以及您拥有的资源。这项研究可确保您挑选出与您的组织能力相匹配的最佳项目。</p>
<p><strong>5. 管理和监控项目组合</strong></p>
<p>跟踪所有项目并定期更新潜在项目列表非常重要。您需要确保项目表现良好并解决出现的任何问题。</p>
<p>如果需要，您可以暂停、取消某些项目，或添加新项目，以更好地符合您的业务目标。通过这样做，您可以确保您的项目仍在正确的轨道上。</p>
<h3>结论</h3>
<p>项目组合管理是一种有效处理多个项目的方法。从增强决策能力、优化资源利用率、管理风险以及使项目与业务目标保持一致，机会无穷无尽。此外，实施 PPM 可提高单个项目的成功率，并帮助组织实现其总体目标，从而推动增长和效率。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验45</title>
      <link>https://ujava.cn/manage/project45.html</link>
      <guid>https://ujava.cn/manage/project45.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验45</source>
      <description>在当今快节奏的商业环境中，企业经常面临同时管理多个项目以实现战略目标的挑战。作为一种高级别的管理实践，旨在通过优化资源分配、协调依赖关系和确保项目间的协同作用，来最大化组织的整体效益。其核心在于平衡各项目之间的优先级，确保整体目标的一致性与高效达成。本文将探讨项目集管理的精髓，并强调在这一过程中的关键作用。 项目集管理的核心要素 战略一致性：项目集管理...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>在当今快节奏的商业环境中，企业经常面临同时管理多个项目以实现战略目标的挑战。作为一种高级别的管理实践，旨在通过优化资源分配、协调依赖关系和确保项目间的协同作用，来最大化组织的整体效益。其核心在于平衡各项目之间的优先级，确保整体目标的一致性与高效达成。本文将探讨项目集管理的精髓，并强调在这一过程中的关键作用。</p>
<p>项目集管理的核心要素</p>
<p>战略一致性：项目集管理首先要求所有项目与组织的战略目标保持高度一致。这意味着在项目选择与优先级排序上，需紧密围绕企业长期愿景和短期目标进行决策。</p>
<p>资源优化：面对有限的资源（如人力、资金、技术等），项目集经理需具备高超的资源配置能力，确保关键项目得到必要的支持，同时避免资源过度分散，导致效率低下。</p>
<p>风险管理：识别并管理跨项目的风险，制定应对策略，减少不确定性对项目集目标的影响。这包括识别相互依赖项目间的风险传导路径。</p>
<p>沟通与协作：在多项目并行推进的复杂环境中，有效的沟通机制是成功的关键。确保所有利益相关者信息同步，促进团队间的协作与知识共享。</p>
<p>项目管理软件的作用</p>
<p>项目管理软件是实现高效项目集管理不可或缺的工具。它不仅能够帮助项目集经理直观监控各个项目的进度、成本和资源使用情况，还能在以下几个方面发挥重要作用：</p>
<p>集成视图：提供一个统一平台，汇总展示所有项目的关键指标，使管理者能够快速识别问题区域，做出及时调整。</p>
<p>资源调度：自动化的资源分配功能可以基于项目优先级、技能匹配等因素，智能调度资源，避免冲突，提高资源利用率。</p>
<p>依赖管理：通过甘特图、网络图等功能，清晰展现项目间的依赖关系，帮助团队有效规划任务顺序，减少延误。</p>
<p>风险管理与控制：内置的风险管理模块，支持风险登记、评估及跟踪，确保项目集层面的风险得到系统性的管理。</p>
<p>沟通与协作：集成的沟通工具，如即时消息、文件共享、会议安排等，促进了团队成员之间的无缝协作，确保信息流通无阻。</p>
<p>项目集管理的核心在于确保项目组合与企业战略的对齐，高效利用资源，以及通过有效风险管理维护项目健康运行。而项目管理软件作为强有力的辅助工具，通过提供数据驱动的决策支持、增强的协作能力以及自动化的工作流程，极大地提升了项目集管理的效率与效果。在多项目并行推进的复杂环境下，充分利用，无疑是实现精髓，达到组织战略目标的捷径。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验46</title>
      <link>https://ujava.cn/manage/project46.html</link>
      <guid>https://ujava.cn/manage/project46.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验46</source>
      <description>一、详细记录项目过程 详细记录项目过程是项目管理经验总结的重要环节。通过系统记录项目的每一步骤，可以为未来提供宝贵的参考。 在项目开始时，建立详细的项目计划，包括目标、时间表、资源分配等。通过记录这些计划内容，可以在项目进行过程中对比实际进展，及时调整策略。项目结束后，记录项目的实际成果，与最初计划进行对比，分析差异原因。这样不仅能总结出成功的经验，还...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<h3>一、详细记录项目过程</h3>
<p>详细记录项目过程是项目管理经验总结的重要环节。通过系统记录项目的每一步骤，可以为未来提供宝贵的参考。</p>
<p>在项目开始时，建立详细的项目计划，包括目标、时间表、资源分配等。通过记录这些计划内容，可以在项目进行过程中对比实际进展，及时调整策略。项目结束后，记录项目的实际成果，与最初计划进行对比，分析差异原因。这样不仅能总结出成功的经验，还能识别需要改进的地方。</p>
<p>此外，详细记录项目中的挑战和解决方案也是非常重要的。这些记录可以帮助团队在未来面对类似问题时快速找到解决方案，避免重复犯错。例如，在某个项目中，可能会遇到资源不足的问题，通过记录解决资源不足的方法，可以在未来项目中提前预防这一问题。</p>
<h3>二、分析项目成果</h3>
<p>分析项目成果是总结项目管理经验的重要步骤。通过对项目成果的分析，可以识别成功和失败的关键因素，为未来项目提供指导。</p>
<p>首先，对项目的整体表现进行评估，包括项目目标的达成情况、时间和预算的控制情况等。通过评估这些关键指标，可以了解项目的成功程度，并找到需要改进的地方。例如，如果项目超出了预算，就需要分析原因，看看是否是资源分配不当或者是项目计划不够详细。</p>
<p>其次，对项目中的具体任务和活动进行分析，找出哪些任务是成功的，哪些任务需要改进。通过这种具体的分析，可以为未来项目提供更详细的指导。例如，如果某个任务在项目中表现出色，可以总结出成功的经验，并在未来项目中推广这种经验。</p>
<h3>三、与团队成员沟通</h3>
<p>与团队成员的沟通是总结项目管理经验的重要方式。通过与团队成员的交流，可以获取更多的视角和建议，为项目总结提供更多的参考。</p>
<p>项目结束后，召开项目总结会议，邀请所有团队成员参与。通过这种方式，可以收集到每个团队成员对项目的看法和建议。团队成员在项目中各自负责不同的任务，他们的经验和建议可以为项目总结提供更多的视角。例如，某个团队成员可能会提出在某个任务中遇到的问题和解决方案，这些经验可以为未来项目提供参考。</p>
<p>此外，通过与团队成员的沟通，还可以识别团队中的优秀表现和需要改进的地方。通过这种方式，可以为团队成员提供反馈，帮助他们在未来项目中进一步提升自己的能力。</p>
<h3>四、持续学习</h3>
<p>持续学习是总结项目管理经验的重要方法。通过不断学习新的项目管理知识和技能，可以不断提升自己的项目管理能力。</p>
<p>首先，参加项目管理培训和研讨会，通过这些活动，可以学习到最新的项目管理理论和实践经验。通过与其他项目经理的交流，可以获取更多的项目管理经验和建议，为自己的项目管理提供参考。</p>
<p>其次，阅读项目管理相关的书籍和文章，通过这些资源，可以学习到更多的项目管理知识和技能。例如，可以学习到如何制定详细的项目计划、如何有效地分配资源、如何应对项目中的挑战等。</p>
<h3>五、关注失败案例</h3>
<p>关注失败案例是总结项目管理经验的重要方式。通过分析失败案例，可以识别项目中的关键问题，并找到解决方案。</p>
<p>首先，分析失败项目的原因，找出导致项目失败的关键因素。通过这种分析，可以识别项目中的关键问题，为未来项目提供指导。例如，如果某个项目因为资源不足而失败，就需要在未来项目中提前做好资源规划，避免类似问题的发生。</p>
<p>其次，关注失败项目中的具体任务和活动，找出哪些任务是失败的，哪些任务需要改进。通过这种具体的分析，可以为未来项目提供更详细的指导。例如，如果某个任务在项目中表现不佳，可以总结出失败的原因，并在未来项目中避免类似问题的发生。</p>
<h3>六、持续改进项目管理流程</h3>
<p>持续改进项目管理流程是总结项目管理经验的关键步骤。通过不断优化项目管理流程，可以提高项目的成功率和效率。</p>
<p>首先，建立一个系统的项目管理流程，包括项目计划、执行、监控和结束等环节。通过这种系统的流程，可以确保每个项目都能按照标准的步骤进行，提高项目的成功率。</p>
<p>其次，根据项目总结的经验，不断优化项目管理流程。例如，如果在某个项目中发现了资源分配不当的问题，可以在未来项目中优化资源分配的流程，确保资源的合理利用。</p>
<h3>七、建立知识库</h3>
<p>建立知识库是总结项目管理经验的重要方法。通过建立一个系统的知识库，可以将项目管理的经验和知识进行系统化的整理和存储，为未来项目提供参考。</p>
<p>首先，收集项目中的关键经验和知识，建立一个系统的知识库。通过这种方式，可以将项目管理的经验和知识进行系统化的整理和存储，为未来项目提供参考。</p>
<p>其次，定期更新知识库，将最新的项目管理经验和知识进行整理和存储。通过这种方式，可以确保知识库中的内容始终是最新的，为未来项目提供最准确的参考。</p>
<h3>八、反馈和评估</h3>
<p>反馈和评估是总结项目管理经验的重要环节。通过对项目的反馈和评估，可以识别项目中的关键问题，并找到解决方案。</p>
<p>首先，收集项目中的反馈，包括团队成员的反馈、客户的反馈等。通过这些反馈，可以了解项目中的关键问题，并找到解决方案。例如，如果客户对项目的某个方面不满意，可以通过客户的反馈找到问题所在，并在未来项目中进行改进。</p>
<p>其次，对项目进行评估，分析项目的整体表现和具体任务的表现。通过这种评估，可以识别项目中的关键问题，并找到解决方案。例如，如果项目的整体表现不佳，可以通过评估分析找出问题所在，并在未来项目中进行改进。</p>
<h3>九、总结和分享经验</h3>
<p>总结和分享经验是项目管理经验总结的重要步骤。通过总结和分享项目管理经验，可以为团队成员提供参考，帮助他们提升项目管理能力。</p>
<p>首先，将项目管理的经验进行总结，形成系统的文档。通过这种方式，可以将项目管理的经验进行系统化的整理和记录，为未来项目提供参考。</p>
<p>其次，将项目管理的经验与团队成员进行分享，帮助他们提升项目管理能力。例如，可以通过项目总结会议、培训等方式，将项目管理的经验与团队成员进行分享，帮助他们提升项目管理能力。</p>
<h3>十、建立项目管理社区</h3>
<p>建立项目管理社区是总结项目管理经验的重要方法。通过建立一个项目管理社区，可以与其他项目经理进行交流和分享，共同提升项目管理能力。</p>
<p>首先，加入项目管理相关的社区和组织，通过这些社区和组织，可以与其他项目经理进行交流和分享，获取更多的项目管理经验和建议。</p>
<p>其次，建立内部的项目管理社区，与团队成员进行交流和分享。通过这种方式，可以将项目管理的经验进行分享和交流，共同提升项目管理能力。</p>
<h3>十一、使用项目管理工具</h3>
<p>使用项目管理工具是总结项目管理经验的重要方法。通过使用项目管理工具，可以提高项目的管理效率和成功率。</p>
<p>首先，选择合适的项目管理工具，根据项目的需求选择合适的工具。通过使用合适的工具，可以提高项目的管理效率和成功率。例如，可以使用项目管理软件进行项目计划和进度管理，提高项目的管理效率。</p>
<p>其次，熟练掌握项目管理工具的使用，通过不断学习和实践，熟练掌握项目管理工具的使用方法。通过这种方式，可以提高项目的管理效率和成功率。</p>
<h3>十二、制定项目管理标准</h3>
<p>制定项目管理标准是总结项目管理经验的重要步骤。通过制定项目管理标准，可以确保每个项目都能按照标准的步骤进行，提高项目的成功率。</p>
<p>首先，制定项目管理的标准流程，包括项目计划、执行、监控和结束等环节。通过这种标准的流程，可以确保每个项目都能按照标准的步骤进行，提高项目的成功率。</p>
<p>其次，根据项目总结的经验，不断优化项目管理标准。例如，如果在某个项目中发现了资源分配不当的问题，可以在未来项目中优化资源分配的标准，确保资源的合理利用。</p>
<h3>十三、建立项目评估体系</h3>
<p>建立项目评估体系是总结项目管理经验的重要方法。通过建立一个系统的项目评估体系，可以对项目进行全面的评估，识别项目中的关键问题，并找到解决方案。</p>
<p>首先，建立项目评估的标准和指标，包括项目目标的达成情况、时间和预算的控制情况等。通过这种标准和指标，可以对项目进行全面的评估，了解项目的成功程度。</p>
<p>其次，根据项目评估的结果，识别项目中的关键问题，并找到解决方案。例如，如果项目评估结果显示项目超出了预算，就需要分析原因，看看是否是资源分配不当或者是项目计划不够详细。</p>
<h3>十四、关注行业动态</h3>
<p>关注行业动态是总结项目管理经验的重要方法。通过关注行业的最新动态，可以学习到最新的项目管理知识和技能，不断提升自己的项目管理能力。</p>
<p>首先，关注项目管理相关的新闻和动态，了解行业的最新发展趋势。通过这种方式，可以学习到最新的项目管理知识和技能，不断提升自己的项目管理能力。</p>
<p>其次，参加项目管理相关的会议和活动，通过这些活动，可以与其他项目经理进行交流和分享，获取更多的项目管理经验和建议。</p>
<h3>十五、建立项目管理文化</h3>
<p>建立项目管理文化是总结项目管理经验的重要步骤。通过建立一个良好的项目管理文化，可以提升团队的项目管理能力，提高项目的成功率。</p>
<p>首先，建立一个积极的项目管理文化，鼓励团队成员积极参与项目管理，分享经验和建议。通过这种方式，可以提升团队的项目管理能力，提高项目的成功率。</p>
<p>其次，制定项目管理的价值观和行为准则，确保每个团队成员都能按照这些价值观和行为准则进行项目管理。通过这种方式，可以建立一个良好的项目管理文化，提高团队的项目管理能力。</p>
<h3>十六、总结个人经验</h3>
<p>总结个人经验是总结项目管理经验的重要环节。通过总结个人在项目管理中的经验，可以提升自己的项目管理能力。</p>
<p>首先，记录个人在项目管理中的经验和教训，形成系统的文档。通过这种方式，可以将个人的项目管理经验进行系统化的整理和记录，为未来项目提供参考。</p>
<p>其次，定期回顾和反思自己的项目管理经验，不断提升自己的项目管理能力。例如，可以定期回顾自己的项目管理经历，总结出成功的经验和失败的教训，不断提升自己的项目管理能力。</p>
<h3>十七、制定个人发展计划</h3>
<p>制定个人发展计划是总结项目管理经验的重要步骤。通过制定一个系统的个人发展计划，可以不断提升自己的项目管理能力。</p>
<p>首先，根据个人的项目管理经验，制定个人的发展计划，包括学习新的项目管理知识和技能、参加项目管理培训和研讨会等。通过这种方式，可以不断提升自己的项目管理能力。</p>
<p>其次，定期评估个人的发展计划，了解自己的进展情况，并根据评估结果进行调整。通过这种方式，可以确保个人的发展计划始终是有效的，为自己的项目管理提供指导。</p>
<h3>十八、建立良好的沟通机制</h3>
<p>建立良好的沟通机制是总结项目管理经验的重要方法。通过建立一个良好的沟通机制，可以确保团队成员之间的信息畅通，提高项目的管理效率。</p>
<p>首先，制定项目管理的沟通计划，明确团队成员之间的沟通方式和频率。通过这种计划，可以确保团队成员之间的信息畅通，提高项目的管理效率。</p>
<p>其次，定期召开项目会议，与团队成员进行交流和分享。通过这种方式，可以了解项目的进展情况，及时解决项目中的问题，提高项目的管理效率。</p>
<h3>十九、重视团队建设</h3>
<p>重视团队建设是总结项目管理经验的重要步骤。通过重视团队建设，可以提升团队的凝聚力和合作能力，提高项目的成功率。</p>
<p>首先，制定团队建设的计划，组织团队成员参加团队建设活动，提升团队的凝聚力和合作能力。通过这种方式，可以提高团队的凝聚力和合作能力，提高项目的成功率。</p>
<p>其次，定期进行团队建设活动，增强团队成员之间的信任和合作。通过这种方式，可以提升团队的凝聚力和合作能力，提高项目的成功率。</p>
<h3>二十、建立激励机制</h3>
<p>建立激励机制是总结项目管理经验的重要方法。通过建立一个有效的激励机制，可以激发团队成员的积极性和创造力，提高项目的成功率。</p>
<p>首先，制定项目管理的激励机制，包括奖励和表彰团队成员的优秀表现。通过这种激励机制，可以激发团队成员的积极性和创造力，提高项目的成功率。</p>
<p>其次，定期评估激励机制的效果，根据评估结果进行调整。通过这种方式，可以确保激励机制始终是有效的，为项目管理提供支持。</p>
<p>通过这些方法，可以系统地总结项目管理经验，不断提升项目管理能力，提高项目的成功率。在项目管理的过程中，持续总结和改进，不断优化项目管理流程，为未来项目提供宝贵的经验和参考。</p>
<h2><strong>相关问答FAQs：</strong></h2>
<p><strong>1. 如何有效总结项目管理经验？</strong></p>
<p>在总结项目管理经验时，可以考虑以下几个方面。首先，列出参与的项目名称、时间范围和项目目标。其次，描述你在每个项目中扮演的角色和责任。然后，详细说明在项目中遇到的挑战和问题，并提供解决方案和取得的成果。最后，强调你在项目中发展的技能和知识，并举例说明如何应用这些经验到其他项目中。</p>
<p><strong>2. 如何展示项目管理经验的价值和成果？</strong></p>
<p>展示项目管理经验的价值和成果可以通过以下方式进行。首先，强调项目管理对于项目成功的重要性，并说明你在项目中取得的具体成果，如完成项目提前、在预算范围内交付等。其次，提供相关数据和指标来支持你的主张，如项目的ROI、客户满意度调查结果等。然后，使用具体的案例和故事来说明你在项目中面临的挑战，并展示你的解决方案和最终成果。最后，强调你在项目管理中所发展的技能和知识，并说明如何将其应用到其他项目中。</p>
<p><strong>3. 如何在简历中突出项目管理经验？</strong></p>
<p>在简历中突出项目管理经验可以通过以下几个步骤。首先，使用一个专门的部分来列出你参与过的项目，并包括项目名称、时间范围和项目目标。其次，为每个项目提供一个简洁但具体的描述，包括你在项目中扮演的角色、负责的任务和取得的成果。然后，强调你在项目管理中所使用的工具和方法，如敏捷开发、里程碑计划等。最后，使用有力的动词和量化的数据来突出你的项目管理技能和成果，如"成功领导并交付了一个价值X万美元的项目"或"提高了项目交付的效率，减少了X%的时间和成本"。</p>
<p>最后建议，企业在引入信息化系统初期，切记要合理有效地运用好工具，这样一来不仅可以让公司业务高效地运行，还能最大程度保证团队目标的达成。同时还能大幅缩短系统开发和部署的时间成本。特别是有特定需求功能需要定制化的企业，可以采用我们公司自研的企业级低代码平台：织信Informat。 织信平台基于数据模型优先的设计理念，提供大量标准化的组件，内置AI助手、组件设计器、自动化（图形化编程）、脚本、工作流引擎（BPMN2.0）、自定义API、表单设计器、权限、仪表盘等功能，能帮助企业构建高度复杂核心的数字化系统。如ERP、MES、CRM、PLM、SCM、WMS、项目管理、流程管理等多个应用场景，全面助力企业落地国产化/信息化/数字化转型战略目标。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验47</title>
      <link>https://ujava.cn/manage/project47.html</link>
      <guid>https://ujava.cn/manage/project47.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验47</source>
      <description>项目经理和项目集经理是完全不同的。 项目集管理的发展引起了社会对合格的项目集管理人员的需求。有经验的项目管理人员理所当然地被推到这个角色上，但通常不会伴随培训或支持。被多数人认同的“以项目为基础”的观点在逻辑上能够自圆其说，因此这种观点很少被人们质疑。 是项目管理的延伸，要求更加严苛、更加复杂。但是可以遵循同样的基本原则和方法执行。因此，项目集管理能力...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目经理和项目集经理是完全不同的。</p>
<p>项目集管理的发展引起了社会对合格的项目集管理人员的需求。有经验的项目管理人员理所当然地被推到这个角色上，但通常不会伴随培训或支持。被多数人认同的“以项目为基础”的观点在逻辑上能够自圆其说，因此这种观点很少被人们质疑。</p>
<p><strong>是项目管理的延伸，要求更加严苛、更加复杂</strong>。但是可以遵循同样的基本原则和方法执行。因此，项目集管理能力就是项目管理能力的升级，项目集管理成为项目管理人员职业生涯的更高一级。最有能力最人员也就成为能够承担项目集管理的最佳人选。</p>
<p>经验教训告诉我们并非如此。单单能够熟练地知识体系中的框架和技能并不足以应付项目集管理人员这一角色。能成功地做一名项目管理人员，并不意味着他也能扮演好项目集管理人员的角色。</p>
<p>**项目集管理人员需要考虑的事情和项目经理完全不同。**那些被提拔的项目经理是陷入危险的境地，常会感到不知所措、力不从心和沮丧。个人或者组织之所以会陷入这些困境不是因为他们的能力不够，也不是因为他们不够努力，而是因为他们过于注重过去那些不相关的经验和概念。</p>
<p>很典型的例子是，他们硬要让项目集和项目一样具有秩序性、可控性、稳定性和可预测性。但事实上，这些特性根本就不适用于项目集和其所在的外部环境。</p>
<p><strong>现在从两个最基本的角度分析项目和项目集层面的差异。</strong></p>
<p>**强调有效的风险管理，**项目操作的方法关注的重点在于减少不利因素和创造有利条件。但是，将这两个方法应用于项目集管理，就会出现新的风险和问题。例如，项目之间相互依赖和重叠问题、资源的采购与调度问题，以及组织对项目集成的整合与利用问题。</p>
<p>**用“以项目为基础”的观点看，项目和项目集的根本任务是一致的，也就是无论如何都要完成既定目标。**人们不喜欢就项目集失败的可能性进行讨论，因此失败对企业或社会造成的影响是很少被人们探究的。这也是项目集管理常常被挑战的方面，紧盯着那些项目绩效，项目集管理本身的是容易被忽略的。容易关注内部风险，会过度地重复干涉并监控项目经理的工作，对内部投放过多工作量必然会减少对外部的关注。</p>
<p>**项目集尤其需要关注外部商业环境，**例如，“游戏规则”可能会因为竞争力的改变而改变，新技术可能会突然出现，客户的需求可能会有巨变。</p>
<p>**项目集的首要任务之一：**就是要规避赢了一场战役却输了整个战争的巨大风险。一般都认为项目集业务就是组成它的所有项目的业务“集合”。这种所谓的“集合”的逻辑自然可以将项目的收益直接明确地分摊到各个单个项目中，尤其是前期项目的可交付成果可以作为后续项目的基础工作时。</p>
<p>这种评估收益现实很难量化评估，还有是不能全面地认识项目和从事项目工作的团队贡献，仅仅考虑考虑项目集中每一个项目的收益还有可能导致让那些在项目交付成果中得益的人成为整个项目的资助者，那些有负面经济评估的项目直接面临或者取消的风险，这种做法，有时会将项目集管理导向一个死角，甚至被部分项目绑架，人们不会用自己的一小点损失去换另一个团队的更大利益。</p>
<p>**项目集就会失去整体性，无意间扼杀项目的响应能力、创新能力和试验能力。**项目集经理不应该像一个官僚机构的组织领导者一样行事，更多地需要依赖直觉去判断，调整或改进项目方法，能将人际交往和个人公信力微妙结合，能对结构有深刻理解，能建立并利用非正式的网络来协调的项目利益。</p>
<p><strong>一个人对工作的理解也是决定这个人工作能力的核心部分，理解项目和项目集管理的不同态度和概念，是非常重要的视角。</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验48</title>
      <link>https://ujava.cn/manage/project48.html</link>
      <guid>https://ujava.cn/manage/project48.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验48</source>
      <description>项目集管理：让团队协作更上一层楼！ 在当今快速发展的商业环境中，企业需要不断地适应市场变化、客户需求和内部资源的调整。 为了实现这一目标，企业越来越多地依赖于项目集管理来提升团队协作效率，确保项目顺利完成。 本文将从项目集管理的定义、重要性、关键要素和实施策略四个方面展开，为您详细解析如何让团队协作更上一层楼。 一、项目集管理的定义 项目集管理是指将多...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目集管理：让团队协作更上一层楼！</p>
<p>在当今快速发展的商业环境中，企业需要不断地适应市场变化、客户需求和内部资源的调整。</p>
<p>为了实现这一目标，企业越来越多地依赖于项目集管理来提升团队协作效率，确保项目顺利完成。</p>
<p>本文将从项目集管理的定义、重要性、关键要素和实施策略四个方面展开，为您详细解析如何让团队协作更上一层楼。</p>
<p>一、项目集管理的定义</p>
<p>项目集管理是指将多个相关的项目整合在一起，通过协调和优化资源分配、进度安排和风险管理，以实现项目集的整体目标和收益。</p>
<p>项目集管理强调的是项目之间的协同作用，通过合理配置资源、优化项目组合，提高项目成功的概率，从而为企业创造更大的价值。</p>
<p>二、项目集管理的重要性</p>
<p>1.提高资源利用率：项目集管理可以帮助企业更好地利用资源，避免资源浪费。</p>
<p>通过对多个项目的统一规划和管理，可以确保资源在各个项目之间的合理分配，提高资源利用率。</p>
<p>2.降低风险：项目集管理可以帮助企业识别和评估项目之间的依赖关系和潜在风险，从而采取有效的措施降低风险。</p>
<p>通过项目集管理，企业可以及时发现项目中的问题，并采取措施进行调整，确保项目顺利进行。</p>
<p>3.提升团队协作：项目集管理强调项目之间的协同作用，要求团队成员加强沟通与协作。</p>
<p>通过项目集管理，团队成员可以更好地理解彼此的工作，提高团队协作效率，确保项目顺利完成。</p>
<p>4.提高项目成功率：项目集管理可以帮助企业更好地把握市场机遇，提高项目成功率。</p>
<p>通过对多个项目的统一规划和管理，企业可以确保项目与战略目标的一致性，提高项目成功的概率。</p>
<p>三、项目集管理的关键要素</p>
<p>1.项目集规划：项目集规划是项目集管理的基础，包括项目集目标、范围、进度、资源、风险等方面的规划。</p>
<p>项目集规划需要充分考虑项目之间的依赖关系和协同作用，确保项目集的整体目标得以实现。</p>
<p>2.项目集组织：项目集组织是项目集管理的重要保障，包括项目集管理团队、项目团队和项目集治理结构。</p>
<p>项目集组织需要明确各个团队的职责和权限，确保项目集管理的顺利实施。</p>
<p>3.项目集监控：项目集监控是项目集管理的关键环节，包括项目集进度、成本、质量、风险等方面的监控。</p>
<p>项目集监控需要定期对项目集进行评估和调整，确保项目集按计划进行。</p>
<p>4.项目集沟通与协作：项目集沟通与协作是项目集管理的重要组成部分，包括项目集内部沟通、项目集与外部环境的沟通以及项目集团队之间的协作。</p>
<p>项目集沟通与协作需要确保信息畅通、协同高效，提高项目集管理的效率。</p>
<p>四、项目集管理的实施策略</p>
<p>1.建立项目集管理体系：企业应建立一套完善的项目集管理体系，包括项目集管理流程、方法和工具。</p>
<p>项目集管理体系需要根据企业的实际情况进行定制，确保项目集管理的有效性。</p>
<p>2.培养项目集管理人才：项目集管理需要具备一定的专业知识和技能。</p>
<p>企业应加强对项目集管理人才的培养，提高项目集管理团队的整体素质。</p>
<p>3.强化项目集风险管理：企业应加强对项目集风险的识别、评估和控制，确保项目集的整体风险可控。</p>
<p>项目集风险管理需要充分考虑项目之间的依赖关系，提高项目集的抗风险能力。</p>
<p>4.推进项目管理信息化：企业应充分利用现代信息技术，推进项目管理信息化。</p>
<p>项目管理信息化可以提高项目集管理的效率，降低管理成本，提升项目集管理的水平。</p>
<p>项目集管理是提升团队协作效率、确保项目顺利完成的重要手段。</p>
<p>企业应充分认识项目集管理的重要性，掌握项目集管理的核心要素，采取有效的实施策略，让团队协作更上一层楼。</p>
<p>在项目集管理的推动下，企业将实现资源优化配置、风险有效控制、团队高效协作，为企业的持续发展奠定坚实基础。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验49</title>
      <link>https://ujava.cn/manage/project49.html</link>
      <guid>https://ujava.cn/manage/project49.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验49</source>
      <description>项目组织是按照项目的目标以一定的形式组建起来的，由组织各部门调集专业人才，并指派项目负责人在特定时间内完成任务。在项目期中，所有成员仅向项目经理负责，不再听命原部门主管指挥，待项目完成后，所有成员再回到原组织单位。项目组织管理警惕以下几点: 1、不要过早下结论 过早下结论会通过两条途径为你制造麻烦。第一是，你会认为自己已经了解所有的事情的发展，所以不再...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目组织是按照项目的目标以一定的形式组建起来的，由组织各部门调集专业人才，并指派项目负责人在特定时间内完成任务。在项目期中，所有成员仅向项目经理负责，不再听命原部门主管指挥，待项目完成后，所有成员再回到原组织单位。项目组织管理警惕以下几点:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>1、不要过早下结论</strong><br>
&nbsp;&nbsp;&nbsp; 过早下结论会通过两条途径为你制造麻烦。第一是，你会认为自己已经了解所有的事情的发展，所以不再重视这件事情，而按照自己假设的发展方式操作事情。可惜人类并不是一种会算命的种类，所以大部分的假设都是错误的，这样也导致的事情常常失败;第二是，你会猜测别人的想法并且会做出假设，同样的，这些假设通常也是错误的。而且这些愚蠢的假设也导致了你与他人的关系被破坏。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>2、不要小题大做</strong><br>
&nbsp;&nbsp;&nbsp; 很多人因为一些小挫折的刺激而做出过激的反应。小题大做使人变得紧张兮兮，产生过多的忧虑。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>3、不要发明规则</strong><br>
&nbsp;&nbsp;&nbsp; 过分的使用”应该”和”应当”是没必要的。这些词除了让你感到紧张外，不会有任何用处。为什么?因为当你使用这些发明的规则时，你会变得受约束和有孩子气的命令口气。而当你试图将这些规则强加于他人时，只会让别人对你产生厌恶的情绪(霸权，自以为是的<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>4、避免给他人扣帽子</strong><br>
&nbsp;&nbsp;&nbsp; 对别人否定的评价也会限制你对他的看法和想法。所以，避免预先给别人扣帽子，说不定你就可以发现别人其他不同一般的地方。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>5、别做完美主义者</strong><br>
&nbsp;&nbsp;&nbsp; 生活并非十全十美的。若寻找一个完美的工作职位，却永远找不到它，而一些看起来好的也并非那么好。追求完美主义是一种精神基本，它会摧毁你的一切快乐并且建立一堆你不可能实现的目标。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>6、不要过分概括</strong><br>
&nbsp;&nbsp;&nbsp; 一两次的挫折并不意味着永远失败，几次成功也不能说明你是一个天才。一件事——好或坏——或者二或三件事并不代表永久的趋势。一件事的成败就是它的成败，不要过分夸大其失败的教训和成功的经验。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>7、不要怀疑别人在讨论自己</strong><br>
&nbsp;&nbsp;&nbsp; 大部分的人，包括你的朋友和同事，在99%的时间内并没有讨论你或者考虑你。很多职位的同事和邻居甚至都不会认识你。别人对你的态度冷热大部分都非私人的想法。不断地怀疑别人在讨论自己只会让你多疑和痛苦。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>8、不要总凭直觉判断</strong>&nbsp;&nbsp;&nbsp;&nbsp;你的直觉并不是总是一个正确的指示器，因为你只觉得会这样，但”觉得”并不说明这就就会是正确的。未来并不会因为你的直觉感觉会这样而改变。感觉可能是真的，但不一定是对的。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>9、不要让生活拖垮你，学着乐观一些</strong><br>
&nbsp;&nbsp;&nbsp; 如果你期盼有坏事发生，想必常常都真的发生了。一个消极的人对于事物的看法都是扭曲的，他会发现世界是灰暗的，到处都是污点。换个方向想，如果你尝试去寻找一些积极的事情，你也一定会发现它们的。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<strong>10、不要沉迷于过去不可自拔</strong><br>
&nbsp;&nbsp;&nbsp; 这是我认为这是最重要的一点：放开那些已经过去的事情，继续你的生活。不要尝试与这些过去的事件争斗，因为它们已经过去了，所以放开手，往前走。你把这些已经过去的事情看得越重要，你的生活也就越沉重，你也更难从伤害中摆脱。很多的愤怒、沮丧、痛苦和绝望都是因为沉迷于过去的伤害和问题而造成的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验50</title>
      <link>https://ujava.cn/manage/project50.html</link>
      <guid>https://ujava.cn/manage/project50.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验50</source>
      <description>项目集管理是一种组织和管理多个相关或相互依赖的项目的过程。在现代软件开发中，项目集管理已经成为了至关重要的一环。一个好的项目集管理流程能够确保项目集的顺利实施，提高项目成功的几率。本文将介绍如何进行项目集管理，包括关键成功因素、步骤和注意事项。 一、项目集管理的关键成功因素 项目集管理的成功取决于多个关键成功因素。以下是一些关键成功因素: 确定项目集的...</description>
      <pubDate>Fri, 22 Nov 2024 02:06:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目集管理是一种组织和管理多个相关或相互依赖的项目的过程。在现代软件开发中，项目集管理已经成为了至关重要的一环。一个好的项目集管理流程能够确保项目集的顺利实施，提高项目成功的几率。本文将介绍如何进行项目集管理，包括关键成功因素、步骤和注意事项。</p>
<p>一、项目集管理的关键成功因素</p>
<p>项目集管理的成功取决于多个关键成功因素。以下是一些关键成功因素:</p>
<p>确定项目集的目标和范围。</p>
<p>建立项目集管理团队，确保团队成员的充分参与。</p>
<p>制定共同的愿景和目标，确保所有团队成员都理解和认同。</p>
<p>有效的沟通和协作。</p>
<p>识别和管理项目集的风险。</p>
<p>确保项目集的资源得到合理利用。</p>
<p>建立良好的项目集管理机制，确保项目集管理流程的顺畅运行。</p>
<p>持续改进项目集管理流程，针对问题进行及时修正。</p>
<p>二、项目集管理的步骤</p>
<p>进行项目集管理需要遵循以下一些关键步骤:</p>
<p>确定项目集的目标和范围。</p>
<p>建立项目集管理团队，确保团队成员的充分参与。</p>
<p>制定共同的愿景和目标，确保所有团队成员都理解和认同。</p>
<p>确保有效的沟通和协作，尽可能减少信息孤岛。</p>
<p>识别和管理项目集的风险，制定相应的应对措施。</p>
<p>确保项目集的资源得到合理利用，收集用户需求，制定计划并开始执行。在监控项目工作过程的帮助下，对计划事项的变化进行测量。</p>
<p>建立良好的项目集管理机制，确保项目集管理流程的顺畅运行。</p>
<p>持续改进项目集管理流程，针对问题进行及时修正。</p>
<p>三、项目集管理的注意事项</p>
<p>在进行项目集管理时，需要注意以下几个事项:</p>
<p>确保项目集管理团队的充分参与。</p>
<p>识别和管理项目集的风险。</p>
<p>确保项目集的资源得到合理利用。</p>
<p>建立良好的项目集管理机制。</p>
<p>持续改进项目集管理流程。</p>
<p>确保所有团队成员都理解和认同项目集的目标和范围。</p>
<p>确保有效的沟通和协作，尽可能减少信息孤岛。</p>
<p>总之，项目集管理是现代软件开发中不可或缺的一环，它涉及到多个方面的管理。要确保项目集的成功，需要建立有效的项目集管理机制，并遵循上述关键步骤和注意事项。只有如此，才能确保项目集的顺利实施，提高项目成功的几率。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验31</title>
      <link>https://ujava.cn/manage/project31.html</link>
      <guid>https://ujava.cn/manage/project31.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验31</source>
      <description>一、项目经理的工作职责 合理利用公司资源组织设计、开发、测试等各种资源完成项目的高质量交付，并保证项目的盈利。这是衡量一个项目失败或者成功的唯一指标。 二、项目经理的基本技能 开发团队的组建 熟悉开发体系 逻辑思维清晰能够理解复杂的业务需求 学会利用各种有利资源帮助自己完成项目 具有较强的抗压能力 具有与客户沟通需求的能力 具有管理团队的能力或者潜力 ...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p><strong>一、项目经理的工作职责</strong></p>
<p>合理利用公司资源组织设计、开发、测试等各种资源完成项目的高质量交付，并保证项目的盈利。这是衡量一个项目失败或者成功的唯一指标。</p>
<p><strong>二、项目经理的基本技能</strong></p>
<ul>
<li>开发团队的组建</li>
<li>熟悉开发体系</li>
<li>逻辑思维清晰能够理解复杂的业务需求</li>
<li>学会利用各种有利资源帮助自己完成项目</li>
<li>具有较强的抗压能力</li>
<li>具有与客户沟通需求的能力</li>
<li>具有管理团队的能力或者潜力</li>
<li>具有成本意识，交付意识理解外包项目的盈利模式</li>
<li>具有责任心能够担当在所有人后退的时候要能迎难而上</li>
</ul>
<p><strong>三、项目管理的核心要素</strong></p>
<p><strong>1、合理利用公司资源</strong></p>
<p>无论公司大小资源总是有限的，公司不可能把所有的好的资源优质的资源都放到自己的项目组中，总是高高低低的人凑在一起，作为项目经理要能在资源和事情的总量，难度之间找到一个匹配的值。项目拿到手上，我们最少几个人能把这个事情做好要判断清楚。人多了浪费了成本，人少了事情做不完。</p>
<p><strong>2、利用各种资源</strong></p>
<p>有些资源是需要自己去争取的，当我们发现项目出了问题，但是公司给的资源又不足的时候，项目经理就要想方设法的去获取这些资源，而不是坐等公司来给我们解决问题，资源不够的时候要自己去找，只要你为了项目好总会从公司甚至是客户那里拉到支持。</p>
<p><strong>3、高质量、盈利</strong></p>
<p>一个项目盈利是一个方面，但是质量确实一个更长远的方面，项目过于赶工，降低要求最后伤害了客户也伤害自己，所以项目的质量和盈利必须要兼顾，要找到一个客户能够接受的质量区间，但是不建议过于苛求，因为没有bug的软件是不存在的。</p>
<p><strong>4、同项目一起成长</strong></p>
<p>虽然站在公司的角度项目是否盈利是重要的指标，但是在我看来项目经理也有其他的一些重要的责任，作为项目经理上要对得起公司下要对得起跟着自己做事情的兄弟，所以 “让跟着自己做事情的人得到成长和锻炼” 也是项目经理的责任。也只有让和自己做事情的兄弟们觉得有收获别人才会愿意跟着你干，团队才会有执行力。当然如何让自己的团队觉得有收获也是有很多技巧的。比如给与团队成员技术指导，合理的安排开发计划在每一个迭代完成后给大家总结，及时给与激励等。</p>
<p><strong>四、项目管理得十大知识领域</strong></p>
<p><strong>1. 项目整合管理</strong></p>
<p>项目整合管理包括为识别、定义、组合、统一和协调各项目管理过程组的各种过程和活动而开展的过程与活动。</p>
<p><strong>2. 项目范围管理</strong></p>
<p>项目范围管理包括确保项目做且只做所需的全部工作，以成功完成项目的各个过程。</p>
<p><strong>3. 项目进度管理</strong></p>
<p>项目进度管理包括为管理项目按时完成所需的各个过程。</p>
<p><strong>4. 项目成本管理</strong></p>
<p>项目成本管理包括为使项目在批准的预算内完成而对成本进行规划、估算预算、融资、筹资、管理和控制的各个过程。</p>
<p><strong>5. 项目质量管理</strong></p>
<p>项目质量管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求，以满足相关方的期望的各个过程。</p>
<p><strong>6. 项目资源管理</strong></p>
<p>项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程。</p>
<p><strong>7. 项目沟通管理</strong></p>
<p>项目沟通管理包括为确保项目信息及时且恰当地规划、收集、生成、发布存储、检索、管理、控制、监督和最终处置所需的各个过程。</p>
<p><strong>8. 项目风险管理</strong></p>
<p>项目风险管理包括规划风险管理、识别风险、开展风险分析、规划风险应对和监督风险的各个过程。</p>
<p><strong>9. 项目采购管理</strong></p>
<p>项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。</p>
<p><strong>10. 项目相关方管理</strong></p>
<p>项目相关方管理包括用于开展下列工作的各个过程:识别影响或受项目影响的人员、群体或组织，分析相关方对项目的期望和影响，制定合适的管理策略来有效调动相关方参与项目决策和执行。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验32</title>
      <link>https://ujava.cn/manage/project32.html</link>
      <guid>https://ujava.cn/manage/project32.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验32</source>
      <description>一、经典项目管理法：步步为营，稳扎稳打 作为项目管理界的常青树，经典法（又称“阶段门模型”）强调顺序执行，每个阶段完成后方能迈向下一个里程碑。此法成功的关键在于团队成员间的紧密沟通与协作，确保每一步都坚实有力。 二、敏捷项目管理法：灵动应变，客户至上 与经典法不同，敏捷方法更加注重客户需求的即时响应与灵活调整。项目被细化为多个迭代周期，每个周期都围绕客...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>一、经典项目管理法：步步为营，稳扎稳打</p>
<p>作为项目管理界的常青树，经典法（又称“阶段门模型”）强调顺序执行，每个阶段完成后方能迈向下一个里程碑。此法成功的关键在于团队成员间的紧密沟通与协作，确保每一步都坚实有力。</p>
<p>二、敏捷项目管理法：灵动应变，客户至上</p>
<p>与经典法不同，敏捷方法更加注重客户需求的即时响应与灵活调整。项目被细化为多个迭代周期，每个周期都围绕客户反馈进行优化，确保项目始终贴近市场脉搏。这种方法鼓励快速迭代与持续反馈，使团队能够迅速适应变化。</p>
<p>三、适应性项目管理法：随需而变，创新应对</p>
<p>面对需求模糊、变化频繁的项目，适应性方法展现了其独特的价值。它强调根据项目实际情况进行动态调整，鼓励项目管理者保持敏锐的洞察力与创新能力，以应对未知的挑战。</p>
<p>四、关键路径法：精准把脉，掌控时间</p>
<p>关键路径法（CPM）是时间管理的一大利器，它帮助项目管理者识别并优先处理那些对项目成功至关重要的关键任务。通过估算这些任务所需时间，并监控实际进展，项目团队能够更有效地管理时间资源，确保项目按时完成。</p>
<p>五、PERT项目评估技术：网络图里见真章</p>
<p>PERT（项目评估与审查技术）利用网络图展示项目任务间的逻辑关系与时间依赖关系。通过计算最早开始时间、最晚开始时间等关键节点，PERT为项目管理者提供了评估项目总时长与识别潜在瓶颈的强有力工具。</p>
<p>六、精益项目管理：精益求精，追求卓越</p>
<p>精益管理以价值流为核心，致力于消除浪费、提升效率与质量。在项目管理中，精益思维促使团队不断优化流程、减少不必要的环节与成本，从而以最低的资源投入实现最高的项目价值。</p>
<p>七、产品类项目管理：洞察需求，引领创新</p>
<p>对于产品类项目而言，深入理解用户需求是成功的关键。项目经理需通过问卷调查、头脑风暴、焦点小组等多种方式收集用户反馈，确保产品设计紧贴市场需求。同时，还需关注发起人的私人想法，运用访谈技巧进行有效沟通。</p>
<p>八、部署类项目管理：明确目标，稳健推进</p>
<p>部署类项目通常目标明确、需求清晰。项目经理应充分利用头脑风暴、焦点小组会议等工具与客户深入交流，明确项目需求与期望。在实施过程中，保持与客户的紧密沟通，确保项目按既定计划稳步推进。</p>
<p>九、内部交付与流程优化类项目管理：聚焦内部，激发潜能</p>
<p>对于内部交付类或流程优化类项目而言，用户群体往往局限于公司内部部门。因此，项目经理需通过灵活多样的方式（如头脑风暴、焦点小组等）激发内部用户的参与热情与创造力，共同推动项目向前发展。同时，注重跨部门沟通与协作，确保项目成果得到有效应用与推广。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验33</title>
      <link>https://ujava.cn/manage/project33.html</link>
      <guid>https://ujava.cn/manage/project33.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验33</source>
      <description>各用一句话概括五大过程组： ： 作用是设定项目目标，让项目团队有事可做； 规划过程组： 作用是制定工作路线，让项目团队“有法可依”； 执行过程组： 作用是“按图索骥”，让项目团队“有法必依”； 监控过程组： 作用是测量项目绩效，让项目团队“违法必究”，并且尽量做到“防患于未然”； 收尾过程组： 作用是了结项目“恩怨”，让一切圆满。 启动过程组 （1）制...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>各用一句话概括五大过程组：</p>
<p><strong>：</strong> 作用是设定项目目标，让项目团队有事可做；</p>
<p><strong>规划过程组：</strong> 作用是制定工作路线，让项目团队“有法可依”；</p>
<p><strong>执行过程组：</strong> 作用是“按图索骥”，让项目团队“有法必依”；</p>
<p><strong>监控过程组：</strong> 作用是测量项目绩效，让项目团队“违法必究”，并且尽量做到“防患于未然”；</p>
<p><strong>收尾过程组：</strong> 作用是了结项目“恩怨”，让一切圆满。</p>
<p><strong>启动过程组</strong></p>
<p>（1）制定项目章程：诞生项目，并为项目经理“正名”；</p>
<p>（2）识别干系人：搞清楚谁与项目相关；</p>
<p><strong>规划过程组</strong></p>
<p>（3）制定：编制项目执行的蓝图；</p>
<p>（4）收集需求：收集要做什么；</p>
<p>（5）定义范围：确定要做什么；</p>
<p>（6）创建：细化交付成果到可管理的程度；</p>
<p>（7）定义活动：把工作包分解为可估算、可管理的活动；</p>
<p>（8）排列活动顺序：确定工作执行的先后顺序；</p>
<p>（9）估算活动资源：确定到底需要什么才能完成工作；</p>
<p>（10）估算活动持续时间：确定完成工作所需要经历的时间；</p>
<p>（11）制定进度计划：描绘出整个项目的实施进程；</p>
<p>（12）估算成本：确定完成工作所需要付出的代价；</p>
<p>（13）制定预算：批准完成工作所需要付出的代价；</p>
<p>（14）规划质量：确定合格的标准；</p>
<p>（15）制定人力资源计划：需要什么人、需要多少人；</p>
<p>（16）规划沟通：需要什么，如何给到他们；</p>
<p>（17）：定义如何对待风险；</p>
<p>（18）识别风险：风险，你在哪里；</p>
<p>（19）实施定性风险分析：揭开风险的面纱；</p>
<p>（20）实施：揭开风险的真相；</p>
<p>（21）规划风险应对：定义如何应对风险；</p>
<p>（22）规划采购：买什么，如何买；</p>
<p><strong>执行过程组</strong></p>
<p>（23）指导与管理项目执行：按图索骥；</p>
<p>（24）实施质量保证：通过过程保证质量；</p>
<p>（25）组建项目团队：让巧妇能为有米之炊；</p>
<p>（26）建设项目团队：激发团队的潜能；</p>
<p>（27）管理项目团队：大家好才是真的好；</p>
<p>（28）发布信息：把信息传递给需要的人；</p>
<p>（29）管理干系人期望：沟通并满足干系人的需求；</p>
<p>（30）实施采购：购买要买的东西；</p>
<p><strong>监控过程组</strong></p>
<p>（31）监控项目工作：盯着，不停地盯着；</p>
<p>（32）实施整体变更控制：让变更在可控之内；</p>
<p>（33）核实范围：让用户接受项目成果；</p>
<p>（34）控制范围：让范围在可控之内；</p>
<p>（35）控制进度：让进度在可控之内；</p>
<p>（36）控制成本：让费用在可控之内；</p>
<p>（37）实施质量控制：让结果满足既定的合格标准；</p>
<p>（38）报告绩效：是骡子是马拉出来溜溜；</p>
<p>（39）监控风险：让风险在可控之内；</p>
<p>（40）管理采购：让本次购买可控；</p>
<p><strong>收尾过程组</strong></p>
<p>（41）结束项目或阶段：给项目（阶段）画“句号”；</p>
<p>（42）结束采购：给本次购买画“句号”。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验34</title>
      <link>https://ujava.cn/manage/project34.html</link>
      <guid>https://ujava.cn/manage/project34.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验34</source>
      <description>1. 开项目启动会 启动会的目的不仅仅是宣告项目正式启动，而是要让所有的利益相关方都参与进来，让他们了解整个项目的目标和关键里程碑，同时对项目的预期结果进行展望，并介绍项目章程给相关方。 通过项目启动会可以让每个人都明确自己在项目中的位置和责任，这样所有人都明确同一个目标，通过这种简单有效的方式来推动项目健康的交付，并朝着目标前进。 项目启动会本质上是...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<h3>1. 开项目启动会</h3>
<p>启动会的目的不仅仅是宣告项目正式启动，而是要让所有的利益相关方都参与进来，让他们了解整个项目的目标和关键里程碑，同时对项目的预期结果进行展望，并介绍项目章程给相关方。</p>
<p>通过项目启动会可以让每个人都明确自己在项目中的位置和责任，这样所有人都明确同一个目标，通过这种简单有效的方式来推动项目健康的交付，并朝着目标前进。</p>
<p>项目启动会本质上是一个公开进行组织愿景和项目目标宣传的会议，也是宣示项目的目标确定，避免后续有相关方在对待项目目标问题上模糊化。</p>
<h3>2. 创建详细的工作计划</h3>
<p>在项目正式开始之前，需要有一个工作计划，这是满足项目在最后期限完成和实现里程碑的关键所在。如果没有详细的工作计划，项目各阶段也没有可视化的文件计划，那么就很难明确的衡量项目是否完成，以及完成了多少。</p>
<p>项目工作计划就是用来衡量项目中所有不同工作任务的完成情况，在项目实施过程中通过与项目计划比较，找出与项目计划中存在的偏差，分析是计划除了问题还是实施没有到位，如果是前者，可能要根据实际情况重新制定计划，如果是后者，则需要解决当前存在的问题。</p>
<h3>3. 与所有利益相关方沟通</h3>
<p>项目经理从第一天接触到某个项目，那就算是正式开始了。项目经理要做的第一件事情就是与相关方沟通项目目标，不是和少数几个人，而是和所有利益相关方沟通，当然要包括关键人员。这里的关键人员包括项目成员、部门经理、项目赞助商、客户以及有价值的用户。</p>
<p>只有经过与各利益相关方的沟通，才能了解项目真正的目标是什么。各方面的诉求和期望有哪些，哪些人对项目有正面的影响和推动力，哪些人可能会给项目带来风险，甚至会阻碍项目的成功，只有把这些了解清楚了，才能对项目有一个整体的概念。</p>
<h3>4. 沟通项目额外工作量带来的影响</h3>
<p>尽管在项目开工会上以及和利益相关方已经确定了项目的实施范围，但在实际环境中，总是会有一些非项目范围之内的工作被安排进来，这很容易给整个项目团队带来影响，项目经理要对这些额外的工作进行沟通。</p>
<p>项目经理要了解这些额外工作量产生的原因是什么，对工作内容进行评估，分析需要多少人力资源，需要涉及到哪些流程，需要多少预算来完成，结合当前项目的进度，看这些额外工作量对整个项目的交付实施是不是产生影响或者产生多大的影响。</p>
<h3>5. 组建一个风险响应小组</h3>
<p>项目的实施过程和任务都会受到不同程度的风险影响，包括通过前期和利益相关方的沟通也能形成很多项目中可能存在的问题，这时候就应该有一个风险响应小组来进行应对和处理。</p>
<p>风险响应小组的职责就是要起到事前防范，事中监控、事后应对的作用，对于项目的风险进行分类，能提前预防的做好预防，不能预防的要做好相应的解决方案来防止问题发生。对于真正发生了问题的，采取补救措施。</p>
<h3>6. 记得询问和反馈</h3>
<p>没有十全十美的项目，同样也没有十全十美的项目经理。我们所做的每一件事情，每一个任务，甚至项目经理日常的工作表现都有可以改善的空间，能够意识到这一点就意味着自己有趋向完美的欲望存在，这是一个非常强大的动力，特别是项目经理愿意从团队中接受批评。</p>
<p>项目经理可以通过询问各利益相关方来获得相应的反馈，要求反馈可以提高项目成功的机会，同时也是可以提高自己项目管理技能的好方法。</p>
<p>很多时候项目经理可能迫于组织或公司的压力来进行这种询问。实际上，真正优秀的项目经理可以选择适当的方式来完成这个过程，比如非正式沟通、团队建设、精神文明建设等。</p>
<h3>7. 管理新协议</h3>
<p>上面说了要对额外工作进行沟通和评估，新的工作量意味着需要对项目范围进行变更，如果发生这种情况，最好的做法就是让大家签署一份新的协议。</p>
<p>这会让各利益相关方清楚地了解新的工作范围以及对整个项目的影响，同时还创建了一个文件化的协议。这意味着需要对整个项目的最后期限进行变动，甚至会对当前的项目产生一些小小的冲击。</p>
<p>一般情况下，项目中需要一个合适的范围变更流程，可以对变更的工作量做一个层级划分，既可以避免频繁的更新协议，也可以防止较大的变动。如果变动的范围超过原有项目范围的承受能力，可以建议重新开始一个项目。</p>
<h3>8. 记录一切</h3>
<p>很多项目经理可能都经历过连续几天甚至更长时间的项目混乱状态，为了避免这种情况反复出现，就需要对项目情况进行回溯，而回溯需要掌握各种证据，这就是为什么要记录项目中发生的一切。</p>
<p>项目经理通过记录来确保拥有所有需要的数据，通过对这些数据进行分析，从而做出更好的决策，并从以前所面临的挑战中获得学习的经验。</p>
<p>项目经理记录下所有的东西，包括但不限于：项目步骤、项目中遇到的瓶颈、范围更改、任务之间的依赖关系。有了这些记录信息，即便是面对任何利益相关方的询问，都不会有什么可担心的。</p>
<h3>9. 使用详细的工作记录文档</h3>
<p>项目管理过程中一个最常见的问题是需要澄清到底谁负责什么，具体的人员责任和工作内容一定需要通过工作定义文档来实现，这样可以减少不确定性和混乱的状态。</p>
<p>通过工作定义文档可以清楚的说明什么样的团队或个人需要所什么样的工作，所以每个人都清楚地了解所涉及的工作水平，需要在项目中创建问责制。</p>
<p>工作定义文档要有权威性，不能朝令夕改。文档的完成需要通过和各个责任人进行沟通确定，一旦确定，就需要对方按照相关要求进行协议的部署，作为对个人的考核标准或成果底线。当然，随着项目的进展，每隔一定的周期需要对工作定义文档进行审视，看是否完成或需要调整。</p>
<h3>10. 举行项目总结会议</h3>
<p>一旦项目完成，最好及时对项目全过程进行反思，看看在下一个项目中如何优化并取得成功。</p>
<p>举行项目总结会议是让所有项目成员一起讨论的绝佳机会，通过和每个项目沟通和总结，可以得出项目中的经验教训，并形成可以改进的方法。</p>
<p>很多时候，项目经理呢总觉得项目完成了就松了一口气，很多新人都缺少总结，以至于同样的错误还会反复出现。通过不断优化项目中的管理过程，不仅能为项目和组织节省资源，也能让自己的职业技能再多一重保险。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验35</title>
      <link>https://ujava.cn/manage/project35.html</link>
      <guid>https://ujava.cn/manage/project35.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验35</source>
      <description>一、引言 项目管理是协调和整合各方面资源，以实现项目目标的过程。它既包含了项目的规划、执行和监控，也涉及团队建设、沟通和风险管理等多个方面。本文将分享我在项目管理实践中的经验总结，希望能为大家提供一些实用的参考和启示。 二、项目规划 明确目标：在项目开始之初，务必明确项目的目标、范围和预期成果。这有助于为整个项目提供一个明确的方向。 WBS分解：将项目...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>一、引言</p>
<p>项目管理是协调和整合各方面资源，以实现项目目标的过程。它既包含了项目的规划、执行和监控，也涉及团队建设、沟通和风险管理等多个方面。本文将分享我在项目管理实践中的经验总结，希望能为大家提供一些实用的参考和启示。</p>
<p>二、项目规划</p>
<ol>
<li>明确目标：在项目开始之初，务必明确项目的目标、范围和预期成果。这有助于为整个项目提供一个明确的方向。</li>
<li>WBS分解：将项目分解为若干个可执行的任务，这有助于更好地理解和分配工作。</li>
<li>工期预估：针对每个任务，合理估计所需时间，并考虑风险因素。这有助于制定合理的项目计划。</li>
</ol>
<p>三、团队建设</p>
<ol>
<li>组建高效团队：根据项目需求，选拔合适的成员，并为其提供必要的培训和支持。</li>
<li>分工与协作：根据团队成员的特长和经验，合理分配任务，确保每个成员都能发挥自己的优势。</li>
<li>激发团队士气：通过团队活动、奖励机制等方式，提高团队成员的积极性和参与度。</li>
</ol>
<p>四、风险管理</p>
<ol>
<li>风险识别：及时发现项目中可能存在的风险，并对其进行分类和评估。</li>
<li>制定应对措施：针对可能出现的风险，制定相应的应对策略，如调整项目计划、增加资源投入等。</li>
<li>监控风险：在项目执行过程中，密切关注风险状况，及时调整风险管理策略。</li>
</ol>
<p>五、沟通协调</p>
<ol>
<li>建立沟通机制：制定清晰的沟通计划，确保项目团队内部以及与其他部门的沟通畅通。</li>
<li>信息共享：通过定期会议、进度报告等方式，及时更新项目信息，确保团队成员了解项目进展情况。</li>
<li>有效沟通：鼓励团队成员积极表达意见和建议，确保信息的上传下达和横向协同。</li>
</ol>
<p>六、项目收尾</p>
<ol>
<li>验收准备：在项目收尾阶段，提前准备验收材料，明确验收标准和流程。</li>
<li>验收沟通：与项目相关方进行充分沟通，确保验收过程顺利进行。</li>
<li>项目总结：在项目结束后，对项目进行全面的总结和评价，梳理经验和教训，为今后的项目提供借鉴。</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验36</title>
      <link>https://ujava.cn/manage/project36.html</link>
      <guid>https://ujava.cn/manage/project36.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验36</source>
      <description>本人在项目中总结出来，每个项目中是从启动、执行、完成这一过程中，在做好的基础上，多沟通是做好项目管理和团队管理的重要前提条件，而且是贯穿整个流程之中。 项目管理 项目管理的目的就是保证项目按时按质完成。最情形就是适当在人安排在适当的岗位上做适当的事，但现实中往往很难实现。这时项目经理需要有效地执行计划并监督大家朝一个方向努力。一个项目的执行，需要有2个...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>本人在项目中总结出来，每个项目中是从启动、执行、完成这一过程中，在做好的基础上，多沟通是做好项目管理和团队管理的重要前提条件，而且是贯穿整个流程之中。</p>
<ul>
<li>项目管理</li>
</ul>
<p>项目管理的目的就是保证项目按时按质完成。最情形就是适当在人安排在适当的岗位上做适当的事，但现实中往往很难实现。这时项目经理需要有效地执行计划并监督大家朝一个方向努力。一个项目的执行，需要有2个角色：项目经理+。项目经理：正确地做流程；产品经理：正确地做产品。由于人的精力有限，需要有人专注某一领域，协调项目的进展。项目经理更注重流程，制定并把握项目的进度，安排合适的人做正确的事，而产品经理则注重产品的质量，如网页的界面、功能，后台的等，安排合适的人把事情做正确。</p>
<ol>
<li>制定合理的进度表，确保各项内容安排得当。</li>
</ol>
<p>一份进度表须包括：起始时间、内容、参与人、负责人、输出物（即某个阶段做出的成果）。确定的起始时间应注意：</p>
<p>第一，包括一个缓冲期。为了避免拖拉，延误了整个项目的时间，需将起始时间设定在底限的时间的前1-3天。例如1号开始画psd图，底线是10号交最终版的样图。在确定起始时间，应当设定为1-7号。因为返工修改与可能会出现拖拉的这2个因素，空出3天这样一个弹性时间。假如设定时间是1-10号，有可能10号晚上拿到的PSD图就非常满意，不需要一点点修改？</p>
<p>第二，时间的最终确定需所有成员清楚并同意。为了增加成员对项目的认同感，也为了尊重成员，避免成员在情感上认为上级又布置了一个任务，只能选择接受。由于每个人有各种私人的事情，还有可能有其他项目上的工作等等不定因素，所以大家的时间比较零碎。此时，项目经理可以先按理想中的情况安排起始时间，再在会议上让成员商议，在每个人确保自己能完成任务的时间的情况下，再确定一份最终版的时间表（当然不能超过底限时间），最后项目经理要强调这份时间表是所有成员做出的承诺，如果完成不了再进行问责！ &nbsp;确定任务的参与人时，应充分考虑到他的技能水平、时间安排能否按时按质完成。但现实情况是很难有一个量化标准来衡量一个成员，因此项目经理在安排时可适当降低标准，只要不底于底限即可。</p>
<ol>
<li>开会进行任务安排，明确每个人的职责。</li>
</ol>
<p>为了避免会议冗长、低效，小团队（8-12人）开会时，全部人站着开会且开会时间尽量控制在20分钟之内。会议上无法达成协议的，由双方会后再协商，不能因为个人浪费大家时间。在部署任务时：</p>
<p>第一，讲清我的期望与衡量标准。可以让成员从思想上重视，且知道怎么做才能让项目经理满意，更具方向性。</p>
<p>第二，讲清楚做这件事对其个人能力成长有什么帮助。</p>
<p>第三，关于做事情的方法和思路，如何去做，因人而异：对于新手，就直接讲明应该如何去做，细化到步骤，让其马上去执行；对于有经验者，只需要将一个大致思路；</p>
<p>第四，明确优先级。有时会出现一个人手头上多个任务，不知道先做那个，所以项目经理在安排时，有时需要对多任务设定一个优先级排序。</p>
<ol>
<li>追踪目标，动态掌握项目的进程，适时进行干预确保能按时完成。</li>
</ol>
<p>第一，项目经理要主动去询问、帮助成员解决问题。通过询问、了解、帮助成员解决问题，既有利于项目的顺利进行，又有利于团队的和谐融洽。由于习惯、年级等多方面因素，成员不习惯向上提问，向上反馈，特别是新成员，经常是到截至日期前一刻才会反馈出一堆问题，倘若此时再解决，时间已经不允许了，造成的结果往往就是项目拖时。越少的沟通，成员之间的了解就越少，默契配合就越差，成员之间如果一直在陌生人的情形下合作是相当不利的。项目经理可以这样发问“最近**做得怎么样，有什么需要我帮助的吗？”</p>
<p>第二、定期举行进度会议来一次性解决问题，反馈进度。进度会议既可以让成员了解项目的进度，清楚现状，又可以根据实际情况解决出现的问题并调整计划。由于许多问题在做计划时是无法提前遇见，因此通过定期的会议来总结问题并解决问题。</p>
<p>第三、在风险可承担的前提下，适当放权，允许成员犯错。既可以发挥成员的积极性也可以让他领悟更深。做一个项目的开发，与大学其他社团活动最大的区别就是终止时间。一旦活动举办的时间确定下来，无论中间多少个不确定因素，无论质量好坏，活动必须举办。而项目开发因为弹性时间大，一个成员犯的错对于整个项目最后能否按时按质完成的影响的风险，项目经理若可以承担，就主动放权，让成员去试错。在犯错之后，及时帮他总结，解释，让他有更深的领悟，但绝不允许一个错误犯两次。</p>
<ul>
<li>项目成本管理</li>
</ul>
<p>转变经营理念，树立“管理以项目管理为中心，项目管理以成本管理为中心”的经营理念，确立项目成本观念。</p>
<p>坚持以人为本的管理原则，强化项目成本管理的激励约束机制。项目的关键在于管人。增强责任心，调动积极性，仅靠思想引导是不够的，还必须建立健全相应的监督约束和激励机制。制定出成本效益目标和考核奖惩办法，公开竞标选好施工队伍和项目经理后，签订《成本管理目标责任书》，明确其责、权、利，并建立绩效考核、分配和全员成本管理风险抵押金制度，将项目所有人员的收入与项目的最终经济效益挂起钩来，加大成本控制绩效分配奖罚力度。把个人收入与项目经营好坏捆在一起，从而增加全员成本管理的压力和动力。</p>
<p>以创效益最大化为目标，强化对项目成本控制的过程管理。首先，从源头上把好关，一方面要科学合理地作好投标过程的成本预测。在充分领会业主意图，满足业主要求和招标、设计文件的前提下，分析评标办法及竞争对手情况，科学预测报价成本，使之建立在企业成本控制的能力之上，尽量减少经营性亏损风险; 另一方面，项目开工前搞好二次预算分割。合理确定成本，正确计算当期损益，确保每项成本都有相应的预算收入。其次，要在管理上挖潜增效。减少管理层次，降低管理的体制生成本; 施工方案的实施，要以合同工期和业主的要求为依据，以优质、高效、低耗为目标合理利用资源，从而实现组织生产均衡; 直接成本的投入，要严格按照定额控制，精打细算。同时要重视工作，通过开展技改活动和使用新技术、新工艺等，降低消耗，提高生产效率。</p>
<ul>
<li>项目质量管理</li>
</ul>
<p>（1）软件部分</p>
<p>软件项目质量管理包括：质量计划编制、质量保证和质量控制三个过程域。质量计划是质量管理的第一过程域，它主要结合各个公司的质量方针，产品描述以及质量标准和规则通过收益、成本分析和流程设计等工具制定出来实施方略，其内容全面反应用户的要求，为质量小组成员有效工作提供了指南，为项目小组成员以及项目相关人员了解在项目进行中如何实施质量保证和控制提供依据，为确保项目质量得到保障提供坚实的基础。质量保证则是贯穿整个项目全生命周期的有计划和有系统的活动，经常性地针对整个项目质量计划的执行情况进行评估、检查与改进等工作，向管理者、顾客或其他方提供信任，确保项目质量与计划保持一致。质量控制是对阶段性的成果进行检测、验证，为质量保证提供参考依据，它是一个PDCA循环过程。</p>
<p>（2）工程部分</p>
<p>项目部对工程施工过程质量进行控制，其内容包括：①正确使用施工图纸、设计文件，验收标准适用的施工工艺标准、作业指导书等。适用时，对施工过程实施样板引路。项目部实行首件验收制度。每次新的分项工程开工时，均按照管理人员全过程跟踪旁站制度，在过程中分部检查，特别是下一道工序施工后影响检查的，为避免返工，均在前一道工序完成后，先进行中间验收，再进行下一道工序。首件验收和样板引路，对工程质量控制起到了良好的示范作用。②调配符合规定的操作人员。对操作人员的规定包括持证上岗的要求、特种作业要求及其他对施工质量有影响的人员要求。③按规定配备、使用建筑材料、构配件和设备、施工机具、检测设备。④按规定施工并及时检查、监测，包括对工序的检查、技术复核、施工过程参数的监测和必要的统计分析活动。⑤根据现场管理有关规定对施工作业环境进行控制，一般包括安全文明施工措施、季节性施工措施、现场试验环境的控制措施、不同专业交叉作业的环境控制措施以及按照规定采取的其他相关措施。⑥根据有关要求采用新材料、新工艺、新技术、新设备，并进行相应的策划和控制。⑦合理安排施工进度。⑧采取半成品、成品保护措施并监督实施。其中成品和本成品防护的范围包括施工企业使用或构成工程产品一部分的发包方财产。⑨对不稳定和能力不足的施工过程、突发事件实施监控。⑩对分包方的施工过程实施监控。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验37</title>
      <link>https://ujava.cn/manage/project37.html</link>
      <guid>https://ujava.cn/manage/project37.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验37</source>
      <description>一、把握好项目的五个阶段 一般来说，项目管理分成启动、计划、实施、控制和收尾五个阶段，每个阶段都有一些要点值得项目经理重点关注。做到知己知彼，能让我们的管理工作更有章法。 1、启动阶段三件事儿： 第一，澄清项目目标，找准项目背后的问题所在; 第二，找准项目干系人，特别是潜在的支持者和反对者，团结一切可以团结的力量; 第三，风险评估，结合公司内外部的环境...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p><strong>一、把握好项目的五个阶段</strong></p>
<p>一般来说，项目管理分成启动、计划、实施、控制和收尾五个阶段，每个阶段都有一些要点值得项目经理重点关注。做到知己知彼，能让我们的管理工作更有章法。</p>
<p>1、启动阶段三件事儿：</p>
<p>第一，澄清项目目标，找准项目背后的问题所在;</p>
<p>第二，找准项目干系人，特别是潜在的支持者和反对者，团结一切可以团结的力量;</p>
<p>第三，风险评估，结合公司内外部的环境，做出风险预案。</p>
<p>2、计划阶段三件事儿：</p>
<p>第一，组建项目的核心小组，成员要能满足项目对于经验、技能和资源的要求。</p>
<p>第二，完成任务分解，跟据“横向到边，纵向到底”的原则，使项目的颗粒度足够分解到个人或小组可完成、可测量的程度。</p>
<p>第三，设置进度安排，为各项任务设定责任人、完成时间并匹配所需资源。特别提醒注意的是，项目经理要有从公司外部整合资源(人及财物)，以及适当“外包”项目工作的意识，要有超越公司边界的全局意识。</p>
<p>3、实施阶段三件事儿：</p>
<p>第一，带好团队，通过基于事和基于人的方式对团队进行激励;</p>
<p>第二，管理项目进度，通过会议、文档及相关的项目管理工作，使项目有序推进;</p>
<p>第三，处理好沟通协作的问题，特别是跨部门、跨部门的沟通问题，争取让各方都能在协作中实现各自价值。这里我想特别提醒一下，协作的基础是价值共享，项目经理要争取让协作各方能够获得或物质、或荣誉、或情感上的回报，这样的协作关系才持久。</p>
<p>4、控制阶段三件事儿：</p>
<p>第一，识别计划的偏离，判断变化影响的是任务还是目标，因势而变。第二，用好控制工作，包括费用表、人员负载量表等，使项目资源与项目进度相匹配。第三，设定并管理项目的里程碑，通过不断实现“小”的胜利，来实现项目“大”的成功。</p>
<p>5、收尾阶段三件事儿：</p>
<p>第一，总结汇报，通过有效的形式呈现项目成果，并做完整交付。</p>
<p>第二，项目复盘，要深入分析项目目标、项目里程碑与最终成果之间的差距，分析得失，固化经验。</p>
<p>第三，项目知识管理，不单单是资料留存，更重要的是知识流转和应用。</p>
<p>当然，每个阶段要做的工作远不止三件儿。这里主要是为了方便大家理解和记忆，做了一些甄选。好的项目经理，不需要死记硬背这些内容，因为这些要点已经融入到了他的全盘工作计划中。</p>
<p><strong>二、清醒认识项目管理与传统管理的区别</strong></p>
<p>项目管理与传统管理有很多相同之处，也有一些独特的地方值得我们注意，着重提示三点：</p>
<p>1、要明确项目经理的权利边界</p>
<p>不同的公司，项目经理的权利大小真的会有天壤之别。但多数情况下，项目经理拥有的是“虚线”权利，即组织、协调的权利，并不能直接决定团队成员的绩效、薪资乃至升迁。在这样的情况下，建议项目经理一方面向公司争取自己的权利资源，为自己的团队激励手段增添砝码;另一方面，通过个人影响力、通过成果共享、荣誉共享等软性因素来带领团队。</p>
<p>2、要注意项目管理中的“柔性”</p>
<p>通常来说，越是复杂的项目，成员的多样性就越强。这就要求项目管理在带团队的时候，能因人而异地情境式领导。好的项目经理，往往要能够容忍一定的模糊性。</p>
<p>3、要注意与职级高于自己的团队成员处理好工作关系</p>
<p>越来越多的企业推行P族和M族的职业发展双通道，这就导致很有可能出现低层级的项目经理带领高层级的专业人才的现象。所谓术业有专攻，项目经理要对自己有信心，用平等、平和的心态与团队成员相处。</p>
<p><strong>三、项目经理的“蜕变”</strong></p>
<p>稚嫩——善用项目管理工具(如流程、表单、协同办公软件等)，但又不拘泥于工具。工欲善其事必先利其器，用好工具能让项目工作事半功倍。项目经理之于工具，要看到工具背后的价值和意义，让工具作为管理的辅助，而不是为了显示专业。</p>
<p>成熟——善于将工作模块化分工，使合适的人做合适的工作，并让项目成员有相对独立的成就感。分工是管理技能的核心，很多项目经理只是单纯地将工作分下去，而不考虑人员匹配的问题，更不考虑成员个体感受的问题。员工成就感是现在80后、90后管理的一个核心点，项目经理要通过合理分工(工作有衔接但又相对独立)来在项目进行中为成员“设计”成就感。</p>
<p>卓越——能够抓住工作主线的项目管理能力。做项目都知道有个概念叫“关键路径”，其实从管理的角度就是抓主要矛盾，抓关键问题。多数情况下，项目经理不需要做很多很细节的工作，但是他要能为团队：争取关键资源;在复杂决策前敢于拍板;能够对重要风险有提前预警的能力。</p>
<p>这些能力的获得，往往需要长时间的项目磨砺。职场中的每个人，如果不是项目经理，那么就一定是一个或若干个项目的团队成员。了解并掌握项目管理的核心要素，将有助于我们不断提升职业化的工作能力，并不断创造新的价值。</p>
<p><strong>四、成功的项目管理必备七大秘诀</strong></p>
<p>1、坚强的领导核心</p>
<p>作为一个项目部，项目经理理所当然地居于管理的核心位置，他的组织、管理、沟通及协调能力，甚至人格魅力都是极为重要的。一个项目的成败，可以说项目经理起到了决定性作用，因为他是统领项目的最高决策者。一个具有全局眼光、高屋建瓴的领导者，能在千头万绪中抓住要害，关注重点，又能对下充分授权，抓大放小。</p>
<p>一个项目仅有强悍的项目经理是不够的，项目班子成员紧密团结在项目经理周围，方可确保令出一致、禁行令止、互为支持。项目班子既要讲民主，大事一起商量，开诚布公，不独断，不专行;同时，也要讲集中，在充分调查事实、协调各方意见的情况下，进行意见的统一。</p>
<p>所以说，组成一个坚强的项目管理班子，是成功的项目管理的关键要素。</p>
<p>2、成功的团队建设</p>
<p>一个项目部管理人员多则上百人，少则数十人，共同组成一个项目管理团队。项目管理部，实际上是一个临时机构，它随着项目的开工而成立，随着项目的完工而解散，中间不断有人抽调而走，也有补充进来，人际关系的变幻、工作内容的更迭时刻都在发生。</p>
<p>工程自身的特性注定了项目管理的艰苦、枯燥，再加之繁重的工作任务、巨大的精神压力，情绪压抑很普遍，由此项目的人性化管理就显得非常重要。它需要营造一个快乐的工作氛围，通过组织各类活动，比如旅游、球类比赛、演讲比赛、文艺演出等，甚至不时的项目聚餐，以充分发挥特别是年青管理人员的才华，缓解紧张情绪，加强项目凝聚力，提升项目战斗力。这些活动，做为项目领导班子，不但要大力提倡和支持，还应该尽可能地参加，其效果是很明显的。</p>
<p>3、前瞻的管理策划</p>
<p>“项目不是在结束时失败，而是在开始时失败”，由此说明项目管理策划的重要性。</p>
<p>项目管理策划应该在项目成立之初展开，一般包括管理目标、管理模式、组织架构、项目经理授权、总进度计划、现场管理人员流量、分包方案、物资采购方案、施工机械及监测设备配置方案、办公设备配置计划、现场临建方案、临水临电方案、总平面布置计划、主要技术方案、现场作业人员流量、资金流量计划及预算成本等十几个方面。</p>
<p>项目管理策划由项目部配合总部机构联合编制，应切合实际，科学合理，具有可操作性。策划经内部审批后，进行项目全体管理人员交底，做到人人熟知，自觉执行，贯彻落实。实施过程中，不断对照检查，及时纠偏，确保大方向不错，大目标不偏。</p>
<p>4、严格的制度考核</p>
<p>1）包括对项目内部管理制度，比如各项例会制度、岗位责任制、人员考核制度及内部工作流程等;</p>
<p>2）包括工期、质量、安全、文明施工等方面的具体考核办法，比如对工期，在确定各节点目标时，应与分包商签订目标责任状，约定奖罚额度，严格进行过程和节点考核，并及时兑现;</p>
<p>3）还应建立专项总包和分包管理制度，明确总、分包管理职责，管理流程和管理要求等。</p>
<p>大多数企业都制定有各项项目管理制度，但不能原封照搬。每个项目都有其自身的特点，在制订各项制度时应结合自身情况予以调整，甚至很多制度需重新或自创制定。</p>
<p>5、谨慎的分包选择</p>
<p>一般的劳务公司没有相应的管理机构，更谈不上管理，也没有相对固定的熟练工人，法律债务的执行能力很差，遇到劳资纠纷或工伤纠纷就采取回避、躲藏或推诿的方式，将总承包商推到前面。</p>
<p>因此，大多数公司选择长期合作的分包队伍，但是这样的队伍是很有限的。随着公司合同额的急剧增大，承接的项目越来越多，原有的分包远远满足不了工程的需要，出现了分包乱拉工人、找临时工的情况，对工程进度、质量等方面的管理造成不良影响。</p>
<p>为此，总承包商尝试引进新的队伍，寻求扩大分包选择空间。但是，由于对新队伍了解不深，加之这些队伍良莠不齐，对比原有的队伍反而感觉有较大差距，甚至有些队伍中途撒手不干，直接导致总承包商不敢大胆使用，成为目前不少建筑企业遇到的两难问题。</p>
<p>所以，这需要从公开招投标、履约保证金的交纳、劳务来源的控制、实名制的推行、工人工资的发放等方面加强管理，以降低管理风险。</p>
<p>6、有力的技术保障</p>
<p>面对超大、复杂的结构，强有力的技术保障尤为重要。</p>
<p>比如：</p>
<p>1)国家大剧院整个网壳结构的预起拱控制，以确保网壳曲线、弧度等最终符合设计要求;</p>
<p>2)央视新址两个巨大的悬臂钢结构，如何进行预起拱及确保准确合龙的问题;</p>
<p>3)国家体育场大量不规则的异型钢结构的加工制作和安装问题;</p>
<p>4)昆明新机场七条巨型钢彩带弯扭构件的加工制作及安装问题等。</p>
<p>所以，项目部必须配备足够的技术管理人员，由一名经验丰富、坚毅干练的带头人负责，进行大量繁杂、细致的技术工作。还得做好零碎、繁琐的事，比如图纸、测量、试验、资料及深化设计等，做为技术负责人必须时刻关注这些问题，安排合适、胜任的人员，并要有较强的预见性和计划性，通过技术例会制度进行布置、落实及检查，避免意外问题发生，以造成不良影响和不必要的损失。</p>
<p>7、有效的风险控制</p>
<p>1)对于合同风险，主要通过耐心、细致的合同谈判工作尽量加以避免，对明显不合理、不公平的条款需做大量的说服工作，对于每项条款都应仔细分析、推敲，避免合同重大误解和陷阱。</p>
<p>2)对于工期风险，往往是因为投标时由业主规定且必须响应招标文件形成的。这些严重压缩的工期，还经常伴随着巨额的延期处罚。面对这种情况，一方面需要强有力的施工组织，先强内功，确保工程顺利推进;另一方面，利用不可抗力因素、工程款支付及非承包商自身原因，加强工期索赔。最为关键的是，利用工程进展顺利的有利形势，营造双方融洽的氛围，不失时机地签订工期补充协议，或重新确定业主认可的工期节点目标，以化解工期风险。</p>
<p>3)对于质量风险，有些业主不切实际地确定过高的质量目标，由于工程自身条件限制而难以达到，合同中却约定了较大额度的奖罚。面对这样的问题，应切实抓好工程质量，争取本应可取得的质量奖项，避免因质量问题在结算时受到制约。同时，也要耐心向业主解释，取得谅解，同意降低质量获奖目标。</p>
<p>4)安全风险是一个较为严峻的问题，很多地区制定了专门针对建筑企业因死亡事故要求退出当地建筑市场或停止一定时间投标的规定，且当前对工人的伤亡赔偿额与日俱增，一旦发生安全事故对于一个项目、一个企业可能都是致命的打击。因此，加强安全防范、加大安全投入、杜绝死亡事故的发生是规避安全风险的当务之急。</p>
<p>5)成本风险是每个项目必须面对的切实问题，激烈的市场竞争，普遍的低价中标，不规范的业主行为，加剧了成本风险。针对成本风险，应逐项认真分析，采取切实可行的开源节流方法。对亏损项目，可从分包竞标、材料公开招标方面低价选择，严格控制成本支出。同时，运用设计变更或改变做法等方式，是避免亏损的有效途径。</p>
<p>6)劳务风险也是一个不可忽视的问题。选择一个实力雄厚、管理有序、讲求信誉的劳务分包，可有效降低工期、质量及安全管理等带来的风险。工人工资发放、工伤赔偿纠纷等问题，已经成为近年来社会、政府关注的焦点，必须引起高度重视，应在劳动合同签订、实名制落实、劳资发放监控、工人上访有效管理等方面加大管理力度，建立规则制度和预案，由专人负责日常管理，成立突发事件处理小组，才能较好地控制劳务风险。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验38</title>
      <link>https://ujava.cn/manage/project38.html</link>
      <guid>https://ujava.cn/manage/project38.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验38</source>
      <description>当多个项目一起过来，最容易出现的情况就是手忙脚乱，各个时间都在救火，而改善这种情况最有效的方式就是用对工具、做好规划，在这里我分享一下多项目管理的一些方法和经验。 应对之法一：项目目标与公司战略紧密对接 在项目管理这块，项目经理的首要任务就是确保项目目标与公司战略紧密对接。怎么做呢？首先，你得深入理解公司的长远目标和战略方向。然后，把这些战略目标细化，...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>当多个项目一起过来，最容易出现的情况就是手忙脚乱，各个时间都在救火，而改善这种情况最有效的方式就是用对工具、做好规划，在这里我分享一下多项目管理的一些方法和经验。</p>
<h4>应对之法一：项目目标与公司战略紧密对接</h4>
<p>在项目管理这块，项目经理的首要任务就是确保项目目标与公司战略紧密对接。怎么做呢？首先，你得深入理解公司的长远目标和战略方向。然后，把这些战略目标细化，转化成具体的项目目标和里程碑。这样一来，每个项目都不是孤立的，而是成为实现公司战略的一部分。</p>
<p>如何讲项目与目标对齐，我们后面会推出专门的文章讨论，在此先不展开</p>
<p>应对方法二：把时间和精力专注于能够提供 80% 效益的那 20% 的事情上</p>
<p>再好的项目经理，一个人的力量始终是有限的，所以在多项目管理中，为了最大化地达成项目目标，你需要使用杠杆效应，好的项目经理会始终把注意力和精力放在优先级最高的项目上。让我分享下日事清的方法。</p>
<p>首先，你可以根据不同的业务目标或战略需求，用项目分组的方法来管理。具体来说，你需要创建和管理多个项目集，每个项目集包含一系列相关联的项目，把项目进行有效的分类和分组。</p>
<p>项目分组：你可以创建和管理多个项目集，每个项目集包括若干个相关联的项目。这样做的好处是能够根据不同的业务目标或战略需求来分类和分组项目</p>
<p>其次，你需要先来个大排查，把所有项目的状态、优先级、完成率和截止日期列个清单。这样一来，你就能一眼看出哪些是真正急需关注的，哪些可以稍微放慢脚步。对于那些高优先级的项目集，你需要特别关注，确保它们获得足够的支持和资源，从而保证这些关键项目能够顺利进行，最大限度地推动整体目标的实现。</p>
<p>日事清可以帮助您多项目状态、风险、负责人任务数和完成率监控，追踪每个项目的关键信息。这种高效的监控方式让默能从公司整体的高度对所有项目进行有效的分组和监控，全面掌握每个项目的进展情况</p>
<h4>应对方法三：把控项目间的依赖关系，做好多项目里程碑管理</h4>
<p>在多项目管理中，你需要特别重视把控项目间的依赖关系，确保项目之间的顺畅衔接和及时协调，相信我，这能让你把工作节奏调整到一个大家都舒服的状态，而不是资源冲突导致四处救火或者延误空档导致大家都没事干。</p>
<p>日事清路线图本质上是一个项目级别的甘特图。在这个工具里，左侧列出了所有独立的项目，而右侧则展示了一个详细的横道图，其中清晰地标示了各个项目的时间线和阶段这个视图让每一个项目、每一个关键里程碑都清晰可见。</p>
<p>你能够一眼看到所有你关注的项目的不同项目的进度和相互之间的关系，不仅能帮助你及时识别可能出现的资源冲突或时间延误，还能使你更有效地调整和优化项目计划，确保每个项目都能按时高质量地完成。</p>
<p>早路线图中，项目的时间线以长条形式展示，非常直观。你可以轻松地通过拖拽这些长条来调整每个项目计划的时间长度，让项目计划的修改变得快速而直观</p>
<p>另外里程碑对项目经理的重要性不言而喻，管理好里程碑，就能够帮助团队有效地控制项目节奏、预留缓冲时间、达成阶段性目标来激励成员。</p>
<p>项目中的重要里程碑则以菱形标识突出显示。这个设计对项目经理来说非常有帮助，因为它让多项目的重要的时间点在一张表中一目了然。当你点击这些菱形标记时，还可以查看到每个里程碑的详细任务信息。</p>
<h4>应对方法四：建立时间任务规划表，集中管理每个项目的多任务</h4>
<p>接下来，谈谈如何承接项目任务交付物，好的项目经理一定会细致地规划每个项目的每一个阶段和每项任务。对于每个交付物，你都会制定明确的标准和期望值。在项目执行过程中，你需要持续监控进度和质量，确保每一步都符合我们项目的预期。如果出现偏差，你需要及时调整策略，确保项目能够回归正确轨道。</p>
<p>使用日事清项目集的“进展”功能，你会得到一个更加精细化的项目管理视角。在这个界面你能在同一个视图中查看多个项目的所有任务的甘特图。这意味着，你可以一眼看到所有项目的所有任务的进度和状态，而不需要在不同的项目模块之间来回切换。这种集中展示的方式可以让你能够轻松监控多个项目的每个环节，及时发现潜在的问题并迅速应对。</p>
<p>你把每个项目中要做的事情详细的列出来，对应到任务的负责人是谁。把不同一项目的不同任务列到一个节目，时间节点和重点关注需要标识出来。然后在每一天开始工作之，看一下这个表，简单看到任务进度、延期等，列出今天要做的事，然后根据自己的工作清单做事。</p>
<p>此外，强大的批量操作能力是很多项目经理喜欢的，你还可以一键批量处理卡片上的所有任务，比如更新所有任务成员、设置所有任务的开始和结束时间，甚至批量复制、移动或归档所有任务。这种批量操作的功能大大提高了项目经理的工作效率，尤其是在管理多个项目且任务数量庞大时，这种功能简直就是救星。</p>
<p>还有一个特别有用的特性是多维度的基线对照：基线的概念对于项目管理来说非常关键。它基本上是关于所有任务日期的最初快照。在项目实施过程中，由于各种原因，任务的日期可能会发生变化。有了基线，我们就能保存不同时间点的任务日期版本，并在项目后期进行对比。</p>
<p>这种对比可以帮助项目经理了解项目在不同阶段的延期或调整情况。通过观察原计划和实际执行之间的差异，你能够更深入地分析项目进展中的问题所在，找出原因，并采取适当的措施来调整计划或改进流程。</p>
<h4>应对方法五：协调不同跨项目成员的负荷，确保有序合作</h4>
<p>在多个项目进行中，项目经理要始终思考，资源要怎么应用，杠杆要怎么撬动，其中最重要的就是人力资源。从一个全面的视角，来了解每位团队成员的贡献和工作状态，是项目经理的核心工作。</p>
<p>在日事清项目集的「人员」功能是非常实用的管理人员资源的一个工具。这里的两个选择器——统计类型选择器和时间粒度选择器——让项目经理能够灵活地查看和分析团队的工作情况。</p>
<p>比如，如果你今天想知道每个员工完成了多少任务，你只需在统计类型选择器中选择“完成任务”，然后在时间粒度选择器中选择“日”。这样，就会显示出今天每个员工实际完成的任务数。这让项目经理一目了然地知道谁超额完成了任务，谁可能需要额外的帮助。</p>
<p>又或者，如果你想了解过去一周每个员工的工作时长，我可以在统计类型选择器中选择“工时”，然后在时间粒度选择器中选择“周”。这样，我就能看到过去一周内每个员工的总工时，从而更好地理解团队的工作负荷和时间分配。</p>
<p>项目经理能够从多个维度清楚地观察项目成员的工作量，包括完成任务数、工时、绩效分等。这对于协调人力资源和保持不同跨项目成员之间的有序合作至关重要。</p>
<h1>总结</h1>
<p>对于有多个项目需要管理的项目经理，“路线图”、“进度”和“人员”这三个功能在项目集管理中就像左膀右臂一样，可以极大地简化工作流程，使得管理多个项目变得既高效又有趣。</p>
<ul>
<li>
<p>“路线图” 功能给了你一个宏观的视角，让你能够看到每个项目的大图景以及它们之间的相互关系，确保项目按照战略方向推进。</p>
</li>
<li>
<p>“进度” 功能则让我可以精细地监控每个项目任务的具体进展，及时批量操作，调整计划以应对各种挑战。</p>
</li>
<li>
<p>“人员” 功能帮助你管理团队的工作分配，确保每个成员的工作量合理，提高团队的整体效率。</p>
</li>
</ul>
<p>作为项目集经理，保持全局视角，始终关注整体进度和方向至关重要。而像日事清的【项目集】工具，正是你在这个过程中不可或缺的助手，它帮助你保持组织和控制，从而高效地达成项目集的目标。通过使用这些功能，你能够确保所有项目都协调一致地向前推进，实现我们的战略目标。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验39</title>
      <link>https://ujava.cn/manage/project39.html</link>
      <guid>https://ujava.cn/manage/project39.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验39</source>
      <description>项目集管理是一种重要的管理方法论，用于管理具有战略导向的大型复杂项目。在实践中，项目集管理可以帮助组织实现更大的长期业务目标和收益。本文将总结一些项目集管理的最佳实践和经验，以供参考。 明确项目集目标和收益 项目集管理的核心是实现项目集的目标和收益。在项目集启动阶段，需要明确项目集的目标和预期收益。这可以帮助项目集管理团队更好地规划和执行项目集，并确保...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目集管理是一种重要的管理方法论，用于管理具有战略导向的大型复杂项目。在实践中，项目集管理可以帮助组织实现更大的长期业务目标和收益。本文将总结一些项目集管理的最佳实践和经验，以供参考。</p>
<ol>
<li>明确项目集目标和收益</li>
</ol>
<p>项目集管理的核心是实现项目集的目标和收益。在项目集启动阶段，需要明确项目集的目标和预期收益。这可以帮助项目集管理团队更好地规划和执行项目集，并确保项目集的成功。</p>
<ol start="2">
<li>建立项目集组织结构</li>
</ol>
<p>为了有效地管理项目集，需要建立合适的项目集组织结构。这包括确定项目集管理团队的角色和职责，以及建立项目集治理机制。一个明确的项目集组织结构可以帮助确保项目集的顺利进行。</p>
<ol start="3">
<li>制定项目集管理计划</li>
</ol>
<p>项目集管理计划是项目集管理的指导文件，它描述了项目集管理的策略和方法。在项目集启动阶段，需要制定详细的项目集管理计划，包括项目集的进度安排、资源分配、风险管理等。这有助于项目集团队了解项目集的执行计划，并确保项目集的顺利进行。</p>
<ol start="4">
<li>加强沟通与协作</li>
</ol>
<p>项目集管理涉及多个项目和团队之间的协作。因此，加强沟通与协作是项目集管理的关键。项目集管理团队应该建立有效的沟通机制，确保项目集内各项目之间的信息传递和协作顺畅。此外，定期召开项目集会议和汇报会，及时解决问题和调整项目集计划，也是非常重要的。</p>
<ol start="5">
<li>监控项目集进度和绩效</li>
</ol>
<p>项目集管理团队需要持续监控项目集的进度和绩效，以确保项目集按计划进行。这包括定期更新项目集计划、跟踪项目集的进展情况、评估项目集的绩效指标等。如果发现项目集偏离计划或有风险出现，项目集管理团队应及时采取措施进行调整和应对。</p>
<ol start="6">
<li>管理项目集风险</li>
</ol>
<p>项目集管理需要及时识别和应对项目集风险。项目集管理团队应该建立风险管理计划，识别项目集可能面临的风险，评估风险的影响和可能性，并制定相应的应对措施。通过有效地管理项目集风险，可以降低项目集失败的可能性。</p>
<ol start="7">
<li>经验总结与反馈</li>
</ol>
<p>项目集管理过程中，需要不断总结经验和教训，并进行反馈和改进。项目集管理团队应该定期回顾项目集的执行情况，总结成功和失败的原因，并将这些经验和教训应用于后续的项目集中。这有助于不断提高项目集管理的水平和效果。</p>
<p>总之，项目集管理是一种重要的管理方法论，通过明确项目集目标和收益、建立项目集组织结构、制定项目集管理计划、加强沟通与协作、监控项目集进度和绩效、管理项目集风险以及经验总结与反馈等最佳实践，可以有效地管理具有战略导向的大型复杂项目，并实现项目集的成功。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验40</title>
      <link>https://ujava.cn/manage/project40.html</link>
      <guid>https://ujava.cn/manage/project40.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验40</source>
      <description>对于项目经理来说，多项目并行管理是工作中的常态，也是一大难点。当多个项目共同推进时，项目经理经常会出现手忙脚乱、四处救火的情形，例如： **A.资源管理难：**资源冲突、资源分配不合理会导致项目延期。 **B.进度管控难：**多项目并行，对每个项目的进度监控会出现不及时的情况。 **C.团队沟通协作难：**多项目管理过程中，需要沟通的人员和部门更多、信...</description>
      <pubDate>Mon, 18 Nov 2024 03:03:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>对于项目经理来说，多项目并行管理是工作中的常态，也是一大难点。当多个项目共同推进时，项目经理经常会出现手忙脚乱、四处救火的情形，<strong>例如：</strong></p>
<p>**A.资源管理难：**资源冲突、资源分配不合理会导致项目延期。</p>
<p>**B.进度管控难：**多项目并行，对每个项目的进度监控会出现不及时的情况。</p>
<p>**C.团队沟通协作难：**多项目管理过程中，需要沟通的人员和部门更多、信息无法快速准确的传递会影响高效协作。</p>
<p>**D.****风险管理难：**一个项目发生风险后，可能还会间接影响到其他项目。</p>
<p><strong>那么如何做才能有效进行多项目管理呢？</strong></p>
<h3>1.高效进行多项目管理的思路</h3>
<p><strong>1.1建立全局观</strong></p>
<p>多项目管理需要项目经理能站在组织层面上考虑问题，全面考虑项目的资源分配、项目及任务的优先级等。这需要项目经理能够具备全局观，从整体出发，关注各个部分的变化并及时调整、确保目标不偏离，最终实现组织战略目标。</p>
<p><strong>1.2明确项目优先级排序</strong></p>
<p>当项目经理同时管理多个项目时，首先需要对项目进行评估，确定它们的重要性和紧迫程度、进行优先级排序，便于后续的管理。例如：高优先级项目应当获得更多的关注和资源，低优先级的项目按照计划定期跟进即可、避免浪费过多的时间和精力，进而提高项目经理的工作效率。</p>
<p><strong>1.3制定项目管理流程</strong></p>
<p>在项目经理有限的工作时间内，要想高效进行多项目的协调管理，离不开规范化的项目管理流程，能让团队成员按照统一的规则和标准开展工作、提升团队协作效率。例如：项目风险和质量如何管控，重要的交付物及里程碑是否需要评审等等。</p>
<p><strong>1.4借助专业的项目管理工具，辅助管理</strong></p>
<p>在管理过程中，需要对多项目进行实时进度监控、快速识别风险来顺利推进，但这些数据的收集、同步需要耗费大量的时间和精力。对于项目经理来说，可以借助一些专业的项目管理工具来辅助管理。</p>
<p>项目经理可以利用项目管理工具，高效制定各个项目管理计划并进行实时监控，及时对各个异常数据进行示警；同时进行合理的项目资源管理以及提前做好风险管理，解决多项目管理的难点。<strong>下面以易趋（EasyTrack）项目管理软件为例，<strong><strong>演绎如何通过以上思路将多项目管理有序落地</strong></strong>。</strong></p>
<h3>2.借助工具如何高效进行多项目管理</h3>
<p><strong>2.1<strong><strong>多项目</strong></strong>计划高效制定，<strong><strong>进度</strong></strong>实时****监控</strong></p>
<p>项目经理借助易趋（EasyTrack）项目管理软件开展项目时，可以利用系统中自带的项目类型模板，也可从已有的项目中选择类似的项目模板直接复用，高效进行项目计划的制定、提升工作效率。</p>
<p>当项目计划审核通过后，在项目执行阶段，项目经理<strong>可以实时查看项目的进度情况，如有延误会及时进行预警</strong>；可视化展示项目运营数据，便于项目经理进行进度管理。</p>
<p><strong>对于所负责的全部项目的健康状态，项目经理可以在【我的项目】清晰的查看</strong>，红灯提示发生延误、黄灯则是稍微延误、绿灯则表示正常；具体的项目运营信息，也支持一键快速跳转至详情页查看。</p>
<p>**借助易趋（EasyTrack）项目管理软件，项目经理可以高效便捷进行多项目的进度管理，**规避了进度数据收集困难、不及时、不准确等情况；也能更加高效识别出项目风险并进行处理。</p>
<p><strong>2.2项目成员进行工时填报，及时汇报工作进度</strong></p>
<p>对于团队协作困难的难点，也能借助易趋（EasyTrack）项目管理软件有效解决。<strong>项目计划发布后，所有的项目成员都会收到任务分配通知，同时能在【我的项目】查看具体的项目计划</strong>，便于项目经理进行项目任务和进度同步。</p>
<p>后续的项目任务进度汇报，项目成员可以通过工时填报完成；仅需5分钟就可以进行周期性的任务工时填报、拖动滑块即可快速进行任务完成情况汇报，有效提升团队协作效率。</p>
<p><strong>2.3组织级项目资源调拨，多项目资源合理分配</strong></p>
<p>借助易趋（EasyTrack）项目管理软件，<strong>项目经理及其他管理人员可以进行组织级的项目资源管理，确保多项目资源的调拨分配更加合理。</strong></p>
<p><strong>高效且合理的资源调拨主要包括以下几步：</strong></p>
<p><strong>Step1建立并维护组织资源池</strong></p>
<p>借助易趋（EasyTrack）项目管理软件，组织可以构建标准化资源池，便于项目管理人员进行合理的资源申请、调拨。资源池中设定了每个人的资源类型、具备技能、可用时间，可统计出整个组织在哪些时间、哪些岗位、有多少可用资源。</p>
<p><strong>Step2项目经理初步估算项目资源需求</strong></p>
<p>在项目可行性分析阶段，项目经理可根据项目目标以及优先级初步制定资源预算计划，规划什么时候需要多少资源。</p>
<p><strong>Step3高层管理人员进行组织资源规划</strong></p>
<p>所有项目的资源预算汇总后，高层管理人员会跟组织的资源能力对照，进行一个合理的调配；若资源不足就砍掉优先级低的项目；资源充足就依据自身能力，做更多的项目。</p>
<p><strong>Step4项目经理进行资源预定，部门经理根据实际情况调拨</strong></p>
<p>当项目立项批准后，项目经理可依据之前制定的资源预算计划进行资源预定，申请项目执行需要的资源类型、数量、时段。部门经理则根据申请、结合实际情况调拨资源到项目中。</p>
<p><strong>2.4风险闭环管理</strong></p>
<p>项目经理借助易趋（EasyTrack）项目管理软件，<strong>可对风险进行闭环式管理，<strong>规避各项风险。系统会实时监控进度、资源、质量、成本等多个关键运营指标并进行风险示警；项目经理收到风险预警后，就可以</strong>在</strong>**【项目工作项-风险】**进行管理，包含风险的状态、类型、等级、发生概率以及影响程度等。</p>
<p>项目经理能全面了解风险的各项信息，制定相应的策略；同时能进行闭环式管理，整个管理流程包含：识别风险、分析风险以及跟踪风险，直至风险消失或转化为问题，才会关闭。当多项目风险频发时，也不必担心风险会有遗漏的情况出现。</p>
<p><strong>3.总结</strong></p>
<p>多项目并行管理时，项目经理难免分身乏术，同时还会遇到一些管理难点。高效进行多项目管理的思路可以从：建立全局观、明确项目优先级排序、制定项目管理流程以及借助专业的项目管理工具这几个方面着手。</p>
<p>项目经理借助易趋（EasyTrack）项目管理软件进行多项目管理，可以高效制定各个项目管理计划并进行实时监控，及时对各个异常数据示警；同时进行合理的项目资源调拨以及提前做好风险管理，解决多项目管理的难点。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验模版</title>
      <link>https://ujava.cn/manage/project0.html</link>
      <guid>https://ujava.cn/manage/project0.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验模版</source>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
    </item>
    <item>
      <title>项目管理经验21</title>
      <link>https://ujava.cn/manage/project21.html</link>
      <guid>https://ujava.cn/manage/project21.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验21</source>
      <description>项目管理主要是在管两个方面，一个是人，一个是事。 一、人的管理 人的管理就是对于项目相关的所有干系的人管理，分为两大类，一是外部客户，而是公司内部人员。 先说下外部客户，外部客户又分为直接客户和第三方客户。 直接客户就是项目的建设方，是出资建设项目的一方。作为项目经理，项目的管理者，首先需要维护好直接客户的关系，需要得到客户的认可。如何才能让客户认可你...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目管理主要是在管两个方面，一个是人，一个是事。</p>
<p>一、人的管理</p>
<p>人的管理就是对于项目相关的所有干系的人管理，分为两大类，一是外部客户，而是公司内部人员。</p>
<p>先说下外部客户，外部客户又分为直接客户和第三方客户。</p>
<p>直接客户就是项目的建设方，是出资建设项目的一方。作为项目经理，项目的管理者，首先需要维护好直接客户的关系，需要得到客户的认可。如何才能让客户认可你呢？首先你必须要对客户的业务要熟悉，平常多思考多学习他们的业务，掌握他们业务中的一些行话，也就是专业名词，这样可以很好的与客户沟通，因为你对他们业务有所了解，客户就认为你是熟悉他们业务的，也愿意和你沟通，这是第一个阶段。下一个阶段就是你要做到比他们更了解业务，然后结合你的专业技术能够帮他找到业务中存在的一些不足，如何利用软件对他们业务进行整合，对他们起到帮助，在某些问题上能给他们提供解决方案，也就是将业务和你的专业知识进行有效结合，真正能够解决问题，这是第二阶段。第三个阶段就是你要成为这个行业或者领域的业务专家，不光是对客户现在涉及到的业务非常熟悉，还要对行业或领域其他的方面熟悉，这样能对客户提出好的建议和方案，帮助他们进行改进，从一个点发展到面，从而带来更多的项目合作机会。</p>
<p>除了熟悉客户方的业务知识外，在此基础上再与客户沟通需求，了解他们想要什么就变得十分容易。有的时候，客户在表达他们需求的时候，往往都是泛泛而谈，导致理解的云里雾里，找不到真正的需求点，如果这样在后期很容易造成返工，耽误工期。关键原因就在于没有真正的理解客户的需求，他本来像做一个沙发，结果你理解的是做一把椅子。我们需要先了解一下客户做这个系统的目的，是为了做影响，还是为发表论文，还是为了解决繁杂的人工工作或是日常的办公，不同的目的，也决定着项目不同的侧重点。同时还要考虑目标用户，是年龄大的人居多还是年轻人居多，会计算机操作的人多不多等等问题，也是决定系统UI如何设计的关键问题。在这个前提下，项目或系统的大概框架就能勾勒出来，下一步再就是项目规划，确定项目范围，与客户沟通细节。在具体的沟通过程中，也是在不断去提出方案解决，这就需要你对业务非常了解，才能精准的找出问题的根本所在，才能制定出合理的解决方案。</p>
<p>对于第三方客户，主要目标就是能够得到他们良好的协作与支持，与他们保持好良好的关系，在冲突面前，在保持原则的前提下，该坚持就得坚持，该让步可以进行让步，但目的只有一个，就是使自己的工作能够顺利的执行下去，适当的时候也需要拿客户的权威来采取一些措施。</p>
<p>再说下内部人员，内部人员就是公司里的人员，包括你的上级领导，所带领的项目团队成员以及需要进行协作的不同部门的人员。</p>
<p>对于上级领导需要做到及时汇报，让领导能够掌握项目的情况，这样在遇到自己无法解决的问题需要领导支持的时候，他才会知道需要怎样指导和支持你。关于汇报的技巧也很多，在这里就先不展开说了。</p>
<p>二、团队的管理</p>
<p>对于团队的管理，主要是如何去建设一直良好的具有战斗力的团队。首先项目经理要在团队中竖立威信，作为一个团队的领导者，必须是要有威信的，但威信的竖立不是依靠权利来实现的，更多是依靠个人魅力，让团队成员对你都是信服的，项目经理要言而有信，说到做到，不欺上瞒下，同时还要靠实力。再次需要建立良好的团队氛围，这个团队应该是一个积极向上的氛围，不是一种死气沉沉，要时刻关注项目团队的气氛，一旦出现不好的苗头，就需要抓紧寻找问题根本，提早解决掉，不然将会造成严重的影响。再次就是队伍结构的建设，应该是有高中低三层结构组成，人尽其才，物尽其用。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验22</title>
      <link>https://ujava.cn/manage/project22.html</link>
      <guid>https://ujava.cn/manage/project22.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验22</source>
      <description>需求控制 在项目开发过程中，需求的影响非常大。项目经理在项目开始阶段就应当整理出明确、详细、清晰的需求，舍弃模糊、不必要的需求。每个需求既要满足用户，也要符合实际。需求代码的实现应做到独立、可测试、可修改。在项目开发过程中，需求可能是不断变化的，因此项目经理应该及时发现需求的变化，以调整项目开发计划，使项目产品能够满足需求。 风险管控 项目开发过程中，...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<h4>需求控制</h4>
<p>在项目开发过程中，需求的影响非常大。项目经理在项目开始阶段就应当整理出明确、详细、清晰的需求，舍弃模糊、不必要的需求。每个需求既要满足用户，也要符合实际。需求代码的实现应做到独立、可测试、可修改。在项目开发过程中，需求可能是不断变化的，因此项目经理应该及时发现需求的变化，以调整项目开发计划，使项目产品能够满足需求。</p>
<h4>风险管控</h4>
<p>项目开发过程中，可能会遇到各种各样的风险。项目经理在项目开始阶段就应当整理出可能发生的风险，以及风险应对措施。一个流畅的项目，从前期到后期风险点应该是倒三角形的，就是前期风险很多，后期风险越来越少。</p>
<h4>任务细分</h4>
<p>项目计划中除了有最终阶段的成品效果，还应当在每个阶段都有不同的成果。把一个大目标分解成每一个小目标，整个项目工期分成若干个短迭代，一个一个的完成。每完成一个小目标，可能根据当前情况对后续迭代做出更加合理的调整和规划。</p>
<h4>人员管理</h4>
<p>尽量固定团队人员，一开始就要明确分工，各司其职。不要随意增减团队人员。</p>
<h4>积极沟通</h4>
<p>在整个项目开发过程中，都需要项目经理与项目参与者、项目参与者之间有良好的沟通习惯。沟通能够解决项目开发过程中遇到的许多问题，也能够使每个阶段的成果被更多组员认可。除此以外，积极的沟通也能够让项目参与者们更能掌握开发全局。</p>
<h4>顾全大局</h4>
<p>在项目迭代过程中，可能会发生过于沉浸于细节而无法按时交付成果的情形。项目经理应该让组员知道，要注重整体效果，忽视一些不重要的细节。过于沉浸于细节容易忘记工期，顾小失大。</p>
<h4>注重用户体验</h4>
<p>在项目开发阶段中，要积极进行测试。对于可使用的成果应当邀请用户进行体验。要重视用户的反馈信息，积极应对需求变化，对后续项目开发计划做出合理调整。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验23</title>
      <link>https://ujava.cn/manage/project23.html</link>
      <guid>https://ujava.cn/manage/project23.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验23</source>
      <description>1. 经验篇：项目管理过程总结 我理解的项目管理的定义：在一定的范围、时间、成本约束条件下，交付满足质量要求的产物，以获得客户满意的过程。 所以这里涉及到的五个要素：范围、质量、成本、进度和客户满意度，这五大要素，也会贯穿项目管理过程的各个阶段。 项目管理一般分为五个阶段：启动、规划、执行、监控、收尾，下面将重点讲述这每个阶段的目标、要做什么、以及如何...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<h2>1. 经验篇：项目管理过程总结</h2>
<p>我理解的项目管理的定义：在一定的范围、时间、成本约束条件下，交付满足质量要求的产物，以获得客户满意的过程。</p>
<p>所以这里涉及到的五个要素：范围、质量、成本、进度和客户满意度，这五大要素，也会贯穿项目管理过程的各个阶段。</p>
<p>项目管理一般分为五个阶段：启动、规划、执行、监控、收尾，下面将重点讲述这每个阶段的目标、要做什么、以及如何做。</p>
<h3>1.1 启动阶段</h3>
<p>启动阶段一般可分为四个过程，对外的商务谈判，以及内部的项目立项、识别相关方，并组织开工会。</p>
<p>目标是为了明确项目启动的背景、前因后果和来龙去脉，确定项目目标，完成项目愿景和目标的同步。</p>
<p><strong>1.1.1 商务谈判</strong></p>
<p>一部分一般由商务主导，内部配合协助评估合同范围等。</p>
<p>在这里值得注意的是：一定要充分评估项目范围、交付时间、交付指标等，具体明确到交付指标的定义，测试方法，避免后期由于模糊的定义而“填坑”。</p>
<p><strong>1.1.2 识别相关方</strong></p>
<p>识别相关方的目的是为了提前了解项目对各相关方的影响，以及相关方对项目的需求和期望。</p>
<p>相关方分为外部和内部，外部客户根据不同的利益方，对应进行不同程度的关注与沟通；内部相关方，一般就是项目组的成员，包括：商务、产品经理、项目经理、研发、测试等。</p>
<p><strong>1.1.3 项目立项会</strong></p>
<p>基于成本与风险考虑与管控，一般投入超过一定工作量的项目，必须要进行项目立项，说清楚项目的背景、价值与收益等，特别是对外交付的项目。需要撰写项目立项材料，进行立项评审。</p>
<p>立项的过程，需要思考以下五个维度：</p>
<ol>
<li>Why：项目来源，价值意义，是否符合公司的战略目标；</li>
<li>What：项目目标需要做什么，项目范围，核心功能；</li>
<li>Who：那些人做，涉及到多少资源，成本；</li>
<li>How long：做多久，项目的起止时间，初步的里程碑计划；</li>
<li>风险评估：是否存在技术风险、市场风险或其他风险，风险应对措施；</li>
</ol>
<p><strong>1.1.4 开工会</strong></p>
<p>在项目立项通过后，组织项目相关方参与项目开工会，会议不需要过多讨论项目实现细节，主要与项目组成员同步项目来源和目标，哪些人做哪些事、怎么做等等，并达成共识（以后就是一条船上的蚂蚱啦~）</p>
<h3>1.2 规划阶段</h3>
<p>在项目启动后，并不是立即投入开发，而是由产品对项目进行规划，目标是梳理需求，确定项目的版本迭代计划、执行方案与排期。</p>
<p>所以这一阶段主要分为三个过程：工作任务分解、任务计划排期以及风险管理。</p>
<p><strong>1.2.1 工作任务分解</strong></p>
<p>工作任务分解：通常又称为WBS（Work Breakdown Structure），不论项目大或小，可以说都是由需求组成，也就是我们常说的需求池，将需求不断的分解，并明确执行路径时，项目的抗风险能力才能更强。</p>
<p>分解方式：一般可按照功能模块进行分解，比如针对于某个平台，按照功能细化开，可以分为会员模块，订单模块，商品模块等等.每个模块又可细分为更细的功能，例如会员模块又分为会员权益，会员信息等。</p>
<p>在需求分解后，确定需求优先级，根据优先级筛选需求形成版本迭代计划。</p>
<p>比如可分为三个版本计划：</p>
<ol>
<li>1.0版本的目标就是产品“可用”</li>
<li>1.1版本的目标是产品“好用”</li>
<li>1.2版本的目标是满足质量指标</li>
</ol>
<p><strong>1.2.2 任务计划排期</strong></p>
<p>1.2.2.1 里程碑计划</p>
<p>在确定需求池，工作任务分解后，根据优先级，确定版本迭代排期，形成里程碑计划.</p>
<p>如下图，比如在什么时间节点分别完成哪些版本需求设计、研发编码、测试验收。</p>
<p>1.2.2.2 详细进度计划</p>
<p>在完成初步的里程碑计划后，对当前阶段的工作任务进行进一步细化，明确到具体的工作任务、完成目标、责任人，开始时间，结束时间，成果产出等等.</p>
<p>如下图，比如各个功能的需求说明，需求评审、研发详细设计、研发编码、测试用例评审，测试验收等。</p>
<p>在完成任务计划排期后，建议先线下与各相关方或责任人确认，再开会与所有人同步确认，现场“签字画押”，也就是意味着大家都认同的计划，在执行阶段就严格按照计划执行，原则上不能delay。</p>
<p>1.2.2.3 风险管理</p>
<p>项目管理过程中风险管理贯穿始终，即各个阶段都需要进行风险识别，但尽量将风险前置，避免风险发生时，措手不及。</p>
<p>风险管理的方式，可借鉴PMP里到的风险登记册去管理，一般可分为外部风险和内部风险：</p>
<ul>
<li>外部风险，比如项目范围和需求不明确，验收指标高，以及外部的依赖性等；</li>
<li>内部风险，比如一些比较难突破的技术风险，人力不足的资源风险等。</li>
</ul>
<p>及时识别风险，风险应对措施管控，通过风险登记册记录，并以一定的频度比如每周去跟进风险情况，如下图：</p>
<h3>1.3 执行与监控阶段</h3>
<p>执行与监控阶段的目标，即依据规划阶段的计划，将项目有条不紊执行下去，定期跟踪监控，对项目进行管控，保证项目进度和质量。</p>
<p><strong>1.3.1 各细分过程跟踪</strong></p>
<p>往往在项目管理过程中，是多个项目同时在并行，或者紧急任务的插入，一个人同时负责多个项目，或者遇到功能开发问题等等，各种因素都有可能导致项目的里程碑delay，所以过程跟踪也是项目管理中非常重要的事。</p>
<p>过程跟踪的方法，可通过每日站会、每周周会的方式，监控项目的执行情况，一般是周会并配合周报的方式。</p>
<p>1.3.1.1 周会</p>
<p>尽量控制在15~30分钟，产品经理可在周会前一天与各责任人check各任务事项的进展情况，做到开会前心中有数。</p>
<p>周会的主题：周任务的完成情况，遇到的问题或难题，以及下周计划，明确到工作任务、责任人、时间节点。在会议结束后，在工作群里同步会议结论。</p>
<p>1.3.1.2 周报</p>
<p>与周会配合，文字邮件的形式同步。但周报的内容，根据不同的汇报对象，有不同的侧重点，比如，向上汇报，建议更突出结论性的输出，里程碑完成情况，top风险管理情况等。</p>
<p>若汇报对象为项目组成员，可以更细粒度，本周周计划完成情况，下周计划，风险与问题情况。</p>
<p><strong>1.3.2 阶段性产出文档评审</strong></p>
<p>整个项目生命周期中，不同的阶段会产出不同的文档，对于文档输出和评审是非常关键的一环。</p>
<p>一方面文字输出能留存记录，避免口头传达信息的不准确和理解有误等问题；另一方面，文档评审环节，可以提前把关方案可能存在的问题或风险，避免做完之后与预期不符，造成返工，工作量的浪费。</p>
<p>一般的文档包括：</p>
<ul>
<li>产品需求文档：由产品经理输出，包括功能架构、泳道图、流程图，以及相关的说明等；</li>
<li>研发详细设计文档：由研发输出，包括详细的方案设计、接口文档等；</li>
<li>测试方案、用例与报告：由测试输出，依据产品需求文档与研发设计文档，设计测试方案与用例，经相关人评审后，进行产品测试，并输出测试报告。</li>
</ul>
<p>文档不是一成不变的，可能在项目执行过程中，会根据实际情况进行调整，所以一般在文档开头部分加上修订记录，即什么人，在什么时间点，修改了什么内容。</p>
<h3>1.4 收尾阶段</h3>
<p>收尾阶段的目标，即对可交付产品进行验收，包括内部验收与客户验收，并将项目过程中的相关文档进行归档，总结经验教训，撰写项目结项报告。</p>
<p><strong>1.4.1 产品验收</strong></p>
<p>1.4.1.1 内部验收</p>
<p>一般由产品验收，确定jira问题单是否全部关闭，是否有遗留问题，测试报告、测试结论是否满足交付指标等。</p>
<p>1.4.1.2 客户验收</p>
<p>交付件加密后交付，并在交付后，定期跟进客户集成测试情况，以及客户满意度如何等。</p>
<p><strong>1.4.2 经验教训总结</strong></p>
<p>经验教训总结，即项目复盘是对于每个项目都非常重要，对于一些比较成功的经历、方法等，通过复盘总结，形成经验和规律。一方面可以提高团队的项目管理效率，另一方面，也能形成组织过程资产，为公司减少培训成本。</p>
<p>在这个过程中暴露的问题，比较失败的部分，通过复盘知道如何改进，下次不再犯错，也是下一章要总结的部分。</p>
<h2>2. 教训篇：踩过的那些坑</h2>
<p>项目管理是整合多个部门的资源，协同并进，产出满足需求的产品的过程，这其中不仅仅是对各事项管理，也包括团队成员的协作、沟通等。</p>
<p>这里梳理我在项目管理过程中，暴露的那些问题，踩过的那些坑，以及对应的改进措施。</p>
<h3>2.1 “管事”</h3>
<p>给项目交付留buffer。</p>
<p>这一点是“血的教训”，在项目执行过程中，我对于研发出的产品质量过于乐观，并且风险识别不够及时，后面只留给测试两周的的时间，临近交付不断的发生各种问题，内部原定的里程碑交付时间不断的延期。</p>
<p>所以，对于交付物，一定要有“风险意识”，并且留一定的缓冲时间进行bug解决，问题修复。内部交付时间较实际交付时间，进行一定时间周期的提拉，给未知风险留应急处理时间。</p>
<p>每一个方案调整，必须及时分析其联动影响，并验证可行性。项目各个功能模块之间往往有很多依赖关系，牵一发而动全身。</p>
<p>在实际过程中，我没有充分全面的评估好某一个功能模块的改动，对其他功能的影响，并且进行验证，导致后期联调时，才发现很多本应该在前期方案调整时就应该验证发现的问题，导致返工。</p>
<p>其实这里产品一个人的认知具有局限性，应该先评估出可能影响的相关方，再组织相关方一起讨论细节，才能更全面的评估和验证。</p>
<h3>2.2 “管人”</h3>
<p>适度的强势。</p>
<p>前段时间刚被同事“吐槽”说，平时看着挺小女生的，一工作起来就很强势了。</p>
<p>其实在项目前期，在对自己的项目管理能力不太自信的时候，会比较“软弱”，以前研发跟我说，这个做不了或者比较困难，我可能就“妥协”了。</p>
<p>现在会有明确的项目目标和自己的原则，态度上会更强硬，遇到什么困难，程度有多大，有什么数据支撑。当然有问题也不会让项目组成员独自承担，一定是一起想办法，是否有其他方法解决。</p>
<p>修炼内功才更有说服力。在与同事的项目沟通、协作上，刚开始会觉得如果实力不够的话，就用“人格魅力”凑一凑，够一够，即与项目组成员相处愉快一些，“搞好关系”，这样在资源协调上应该会比较顺利一些。</p>
<p>后面到遇到非常有自己主见的同事，他也提出了我在项目过程中的一些问题，虽然是用非常质疑的口吻，但是我现在是很欣赏和感谢那个同学。</p>
<p>他让我内心变得更大强大，同时也意识到，专业能力、解决问题能力强，才能更有信服力，努力修炼内功才是王道。</p>
<p>写在最后：</p>
<p>对于产品经理来说，项目管理能力是非常重要的一个硬技能：</p>
<ul>
<li>在过程管理上，不断的实战与复盘，内化成自己的能力；</li>
<li>在在心态上，项目管理一定不是一帆风顺的，中间一定有出现各种问题，发生各种风险，但一定要保持一个积极的心态，相信冲锋陷阵的团队成员能力，也相信领导作为军师的后盾力量，方法总比困难多，问题一定是可解的。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验24</title>
      <link>https://ujava.cn/manage/project24.html</link>
      <guid>https://ujava.cn/manage/project24.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验24</source>
      <description>1. 项目组成立 成立项目组是项目能否成功的第一要素，没有项目组，项目管理就无从谈起。成立项目组一般包括以下几个方面：项目背景，目标，领导组，执行组，时间表等。项目组背景与目标比较容易确定，但是领导组与执行组的成立，就要考验项目组的智慧了。 第一， 项 目领导组组长是谁，一般情况下，大项目，都会找一个职位高权力重的人担当组长，但是，这样的人一般事情比较...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;项目组成立</p>
<p>成立项目组是项目能否成功的第一要素，没有项目组，项目管理就无从谈起。成立项目组一般包括以下几个方面：项目背景，目标，领导组，执行组，时间表等。项目组背景与目标比较容易确定，但是领导组与执行组的成立，就要考验项目组的智慧了。</p>
<p>第一，&nbsp;&nbsp;&nbsp;项 目领导组组长是谁，一般情况下，大项目，都会找一个职位高权力重的人担当组长，但是，这样的人一般事情比较多，外地出差时间长，很难真正参与到项目运作当 中。另一方面，也只需要他把控一下方向，控制一下节奏。所以，可以让此人进行全面授权，找一个职位稍微低，但是能够全身参与到项目其中的人担当协助人。</p>
<p>第二，&nbsp;&nbsp;&nbsp;项目执行组的人员安排，涉及到几个部门，就安排几个部门负责人。这里要知道，虽然是部门负责人负责项目组执行，但实际中，往往是部门负责人安排部门其中一个人去参与其中，所以，安排这个人的工作情况，需及时通报部门负责人，如果不行，则需要及时换人。</p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意企业风向</p>
<p>一个项目组的存在与工作目标不仅仅是一个项目是否完工，还可能是公司重点工作是否发生变更，也就是公司"风向"变了。 原来企业高层对项目很关注，慢慢变得不管不问了，这个时候，你也要注意了，项目组是否要停止了。项目组的工作重点也不是一成不变的，某一个阶段需要做哪些工作，哪些工作是重点，哪些工作已经过时，项目负责人必须有高度敏感。 企业风向可以从企业每个月度的工作例会上了解一二，下个月的重点工作是什么，一般在高层工作通报的文件中。作为项目负责人的呢，要明白哪些是项目组需要加大力度做的，哪些是已经完成的，不能再继续的。不能等到高层直接告诉你，让项目做什么，你才知道"风向"已经变了。</p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;项目规划与激励</p>
<p>一般来说，项目组成立的时候，也会对项目进行规划与激励。项目组规划包括时间内容规划，项目分工，项目制度等。一旦项目启动，项目就进入到运作当中，通知什么时间发文，物料什么时候到位，工作例会什么时间开始，市场部该做什么，渠道部该做什么，这些都要明确。 项目激励不能少，许多企业管理者认为，项目组是公司安排的，不需要什么激励。 我不认同这个观点，项目毕竟是员工"额外"的工作，必须有激励来刺激。而应该是：项目组以正激励为主，小项目有小激励，大项目有大激励，谨慎使用负激励。 有时候来看，部分部门负责人参与不多，他只是安排下属员工参与项目组，这个时候需要不需要激励？我认为需要，因为他毕竟是项目参与者的上司，他的态度决定了下属参与的程度，因此，必须进行激励。</p>
<p>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;严格督促</p>
<p>人天生都是有惰性的，能拖的就拖，这个时候，就必须要严格督促。没有督促就没有成果。督促不仅仅是直接面对面要求他人做事情，可以有多种方式。比如：项目例会、工作提醒、进度通报等。&nbsp;项目组负责人要使用一些的工具，比如Linkwedo&nbsp; ，把项目整个过程记录下来，比如资源调用、任务分配记录、工作沟通记录等等。在这样一个公开透明的工作平台去记录工作，项目负责人搞不定的事情表达了出来，可能高层看到你的工作汇报，一个声招呼就安排落实了，所以，这些工具务必学会使用。 项目组中总会有些人勤快一点，有些人懒惰一些，这个时候就要让大家的工作呈现出来。奖励积极者，督促后进者，督促大家提高积极性。可以用阶段例会进行奖励通报，哪些人做得好，为什么能够获得奖励，做得好就该及时获得奖励。</p>
<p>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;勤于沟通</p>
<p>勤于沟通、敢于沟通，不管是对上，还是对下，都是需要的。这也是Linkwedo工具能够良好支持工作沟通的价值。 首先是对上，一定要与项目领导组组长做好沟通，大胆沟通，勤于汇报工作@给他，特别是在项目初期，高层领导不了解你，不知道你是否能够胜任，因此，对你也会有所顾忌，怕你不能承担，这个时候，你要勇于表达自己，表明你的立场：我能。 项目进入正常轨道后，沟通不能少，必须让领导及时知道项目进度，他们心中有底。 对下沟通，要大胆"骚扰"别人，除了督促、要求别人做事情，也要及时点评、提供支持，还要找时机拉拉家常，谈谈心之类。如果项目基金允许的话，可以项目组一起吃个饭，开展体育活动等，来加强沟通。</p>
<p>6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工作魅力</p>
<p>也是很重要的一 点，凭什么让相同级别的同事"替"你做事，不仅仅是项目组赋予你奖罚的权利，更多的是你个人的工作魅力能够感染他们。作为项目组负责人一定要做到身先士 卒，速度、作风、专业，缺一不可。自己必须做好，做得正，把工作全面体现出来，以身作则，让大家看到，你比别人更专业，更投入，你才可能去感动对方，去激 励对方。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验25</title>
      <link>https://ujava.cn/manage/project25.html</link>
      <guid>https://ujava.cn/manage/project25.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验25</source>
      <description>1. 团队成员选择 人员选择要谨慎，要尽量选择合适的人员，在选择团队成员时要重点考虑其团队合作能力、编码可读性、能力和项目的匹配度等因素。 2. 项目远景的确定 项目初期项目经理需要和高层以及客户协商，定下项目的远景目标（即项目的目的，要实现的整体功能等），远景目标不用太长太细，但一定要有，好的远景目标犹如大海中的灯塔一样，可以让项目组不会在项目过程中...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>1.&nbsp;<strong>团队成员选择</strong>&nbsp;人员选择要谨慎，要尽量选择合适的人员，在选择团队成员时要重点考虑其团队合作能力、编码可读性、能力和项目的匹配度等因素。</p>
<p>2.&nbsp;<strong>项目远景的确定</strong>&nbsp;项目初期项目经理需要和高层以及客户协商，定下项目的远景目标（即项目的目的，要实现的整体功能等），远景目标不用太长太细，但一定要有，好的远景目标犹如大海中的灯塔一样，可以让项目组不会在项目过程中迷失方向。</p>
<p>3.&nbsp;<strong>项目计划</strong>&nbsp;项目计划是项目最重要的文档之一，需要由项目经理根据实际情况进行制定，需要注意的是项目计划不是一次确定永远不变的，项目计划是一个从粗到细、从大到小的逐步过程，需要在项目的整个周期不断细化，调整。</p>
<p>4.&nbsp;<strong>需求阶段</strong>&nbsp;按照公司的方向需求由专门负责需求的人员来收集，需求人员将需求定义好形成文档后，再由项目组人员进行设计。身为项目经理一定要尽早参与这一过程，介入越早越好，需求收集过程可以以需求人员为主，项目经理为辅的模式进行，由需求人员负责收集需求并以需求用例的方式编写文档，由项目经理审阅并组织需求评审，只有需求评审通过后，需求收集过程才能阶段性结束。</p>
<p>5.&nbsp;<strong>项目框架选型和搭建</strong>&nbsp;需求确定后，如果客户没有明确要求，项目经理需要为项目确定框架和采用的技术。有时这一过程可以由项目经理和项目组中的技术骨干一起来完成。</p>
<p>6.&nbsp;<strong>设计阶段</strong>&nbsp;由项目经理和技术骨干一起完成项目的总体设计并经过设计评审，然后各个分模块的设计可以分给具体的成员来设计、由项目经理和技术骨干审核；也可以不分统一由项目经理和技术骨干完成，但设计文档一定要由惟一的一个人来完成（项目经理通常是最佳人选），一则可以保持文档编写风格的一致性，二则可以保证项目组有人可以通晓整个项目的详细设计，从整体上把关，三则可以节省项目成员的时间，让其将精力放在实现上。</p>
<p>7.&nbsp;<strong>实现阶段</strong>&nbsp;进入实现阶段后，项目经理需要控制的方面主要有代码质量控制、进度控制控制等，代码质量可以通过代码抽查、复查、制定代码签入规则等手段控制，进度可以通过检查进度表来控制，需要注意的是项目经理要随时准备好帮助项目成员解决遇到的难题，包括技术和非技术方面的。</p>
<p>8.&nbsp;<strong>测试阶段</strong>&nbsp;需求文档确定后，就需要和测试组进行协商，由测试组准备测试用例并提交大概需要的测试时间。随后的各个评审（如设计审核）要保证测试组必须有人参与，因为测试人员和QA人员更能发现评审问题。</p>
<p>9.&nbsp;<strong>实施</strong>&nbsp;进入实施阶段后，项目遇到的问题会比较多，其中很多并不是技术方面的，而是客户管理制度方面的、客户现场环境方面的。由于经过长期的开发阶段项目成员都比较疲惫并且在实施阶段出现的问题比较多，所以项目成员在士气和心情方面容易不稳定，这时就需要项目经理来掌控，要稳定项目成员的心情、提升士气，并多和客户沟通解决发现的问题。</p>
<p>10.&nbsp;<strong>技术测试</strong>&nbsp;如果项目是以前没有做过的类型，则需要通过技术测试来验证选定的技术是否具有可行性，技术测试需要注意的问题有技术测试一定要模拟最终用户的实际环境，不能在开发环境中进行测试。</p>
<p>11.&nbsp;<strong>签入控制和进度控制</strong>&nbsp;项目经理一定要保证每天有合适的时间段用来检查项目成员签入的代码的质量（包括功能正确性和规范性等）和任务的完成情况，发现问题要及时解决。</p>
<p>12.&nbsp;<strong>任务分配</strong>&nbsp;任务分配宜小不宜大，一般来说分配周期可以以一周为一个周期，在给成员分配任务时需要得到成员肯定，不能硬性的分配任务。可以参考XP的任务分配法。</p>
<p>13.&nbsp;<strong>定位问题</strong>&nbsp;项目经理首先要明白自己所处的位置，明白自己是一个枢纽，要起到润滑油的作用，处理好项目各关联方的关系。项目经理不一定是项目组中技术能力和管理能力最强的人，但一定要是项目组中最会处理人际关系的人，所有的管理问题归根结底都是人的问题，把人的关系处理好了，项目管理就成功了一大半，“会做的人让他做，不会做的人教他做，不愿做的人催他做”。</p>
<p>14.&nbsp;<strong>项目规范的制定</strong>&nbsp;身为项目经理就是项目的总负责人，有些项目的基础规范需要项目经理来制定，比如项目代码规范（可以在公司代码规范基础上进行修改）、项目沟通机制（项目例会多少时间召开一次？以什么样的形式召开？项目进行过程中如果遇到了问题怎么反馈?）等。</p>
<p>15.&nbsp;<strong>权利的应用</strong>&nbsp;身为项目经理，在项目中所拥有的权利肯定比其它团队成员要多，行使权利的机会也较多，但项目经理一定要合理的使用自己的权利，权利行使不当容易伤害团队的氛围，影响团队的战斗力。在行使权利时有两点要注意，<br>
1）要多使用影响力，少使用组织赋予型权利，影响力是指自己通过平常的为人处事、通过自己的工作资历和解决问题的能力挣得的，有时可能一个普通的团队成员其影响力会大过项目经理；而组织赋予型权利是公司章程中赋予的，在项目团队中肯定是项目经理的组织赋予型权利最大。多使用影响力少使用组织赋予型权利可以比较柔性的管理项目团队、不会让人感到盛气凌人，不会引起反感，对凝聚团队成员比较有好处。但如果遇到非应用组织赋予型权利不可的时候也不要犹豫，一定要明白组织赋予型权利是解决问题的一种方式，只不过其优先级低于影响力。<br>
2）切莫看低自己，有些项目经理以为自己只是干活的，和普通项目成员的惟一区别只是自己要干的活多一些，这是很错误的认识，如果有这样的认识就不能合理的行使自己的权利，就不能起到枢纽的作用。</p>
<p>16.&nbsp;<strong>月考评的应用</strong>&nbsp;公司规定项目经理给项目成员进行考评以决定项目成员每个月的绩效工资，这等于是交给了项目经理一把双刃剑，应用的好可以提高团队士气，应用的不好不仅会损害团队士气也会增加项目成本。在月考评时需要注意下面的几点：<br>
1） 考评规则提前声明，在项目开始的时候就需要和团队成员一起制定一个考评的简单规则，规则制定时不要一人独断，要多听团队成员的意见。规则制定可以考虑出勤率、代码质量、代码规范、任务完成情况、是否提供了节省团队时间的工具等因素。<br>
2) 考评要合理公正。不能依个人喜好打分，也不能全部打高分，要依据考评规则合理的打分。</p>
<p>17.&nbsp;<strong>加班情况的处理</strong>&nbsp;加班是不得已为之的行为， 要谨慎使用，如果逼不得已非要加班不可也要做好安排，要先将加班申请通过、要协调加班日期、要确定加班需要完成的任务并检查任务完成的情况。另外关于加班有一个说法是如果项目的某一个里程碑是通过大量加班完成的，那么下一个里程碑肯定会延后，我个人觉得这是很有道理的。</p>
<p>18.&nbsp;<strong>出差情况的处理</strong>&nbsp;公司开发人员大部分在济南而项目多是东营的，这就要求项目成员经常出差，这是无法改变的事实，但长时间的出差会影响团队士气和效率、也会增加项目的成本。这就要求项目经理多注意出差对项目的影响，要合理的安排出差的人员和周期，如果某些团队成员出差时间较长了，需要注意长时间的出差是否使其“后院不稳”，若有必要，可以出面帮忙解决。</p>
<p>19.&nbsp;<strong>项目组杂事的处理</strong>&nbsp;项目经理是项目的总负责，也是项目的总管。项目经理要为项目团队做好服务工作，不要让日常的琐事来骚扰团队，该为团队成员挡的琐事一定要挡在团队之外。</p>
<p>20.&nbsp;<strong>责任的担当</strong>&nbsp;项目经理是项目的总负责，所以一定要对项目负起责来，当项目能够顺利完成时，要明白这是项目团队合作的结果并不是自己独立完成的，要和项目团队分享功劳。当项目不能顺利成功时，要明白自己肯定是最大的责任人。另外要学会为项目成员承担责任，当某个项目成员犯错后，作为项目经理需要学会接受来自外部的批评并适度的保护项目成员。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验26</title>
      <link>https://ujava.cn/manage/project26.html</link>
      <guid>https://ujava.cn/manage/project26.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验26</source>
      <description>项目开始阶段是一个最重要的阶段。项目经理在接手一个新项目的时候，首先要尽可能地多从各个方面了解项目的情况，如： 这个项目是什么项目，具体大概做什么事情，是谁提出来的，目的是解决什么问题。在国内很多客户都很不成熟的情况下，千万不要根据项目的名称望文生义地去想象项目的目标。一个名为“办公自动化”的项目很有可能在你进场以后一个月才发现客户其实需要的是一个计算...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目开始阶段是一个最重要的阶段。项目经理在接手一个新项目的时候，首先要尽可能地多从各个方面了解项目的情况，如：</p>
<ol>
<li>
<p>这个项目是什么项目，具体大概做什么事情，是谁提出来的，目的是解决什么问题。在国内很多客户都很不成熟的情况下，千万不要根据项目的名称望文生义地去想象项目的目标。一个名为“办公自动化”的项目很有可能在你进场以后一个月才发现客户其实需要的是一个计算机生产管理辅助信息系统。前期了解情况的工作越详细，后面的惊讶就越少，项目的风险就越小。</p>
</li>
<li>
<p>这个项目里牵涉哪些方面的人，如投资方、具体业务干系方、项目建成后的运营方、技术监督方等等，很多项目里除了业主单位的结构很复杂以外，还有一些其他单位也会牵涉进来，如项目监理公司、业主的行业主管机构等。项目经理需要了解每个方面的人对这个项目的看法和期望是什么。事先了解各个方面的看法和期望，可以让你在做项目碰到问题的时候，就每件事情分析哪些人会在什么方面支持你，哪些人会出于什么目的反对你，从而提前准备联合朋友去对抗敌人，让事情向你所希望的方向发展。没有永远的朋友，也没有永远的敌人，只有一致的利益，这句话作为项目经理是一定要记住的。</p>
</li>
<li>
<p>基本了解了客户的情况后，下面的事情就是了解自己公司各方面对这个项目的看法。首先是高层领导是否重视，这个决定了你在需要资源的时候，公司是否会根据你的要求提供最有力的支持。领导口头肯定是说支持的，你需要做的是了解公司对这个项目的实际期望，是想把项目越做越大还是想赚钱？是想做样板工程还是干脆想敷衍了事，公司领导对项目的态度决定了你做这个项目的战略，而这个战略方针将对你做项目计划产生直接的影响。</p>
</li>
<li>
<p>在做整体项目计划前，还要大致计算一下你手上的资源。首先是时间，现在市场竞争激烈，往往很多项目要求在几乎不可能的时间范围里完成。对于这一点，你在做项目的风险控制计划的时候要充分考虑。其次是人员，根据项目预算和已往经验，大致计算一下未来的项目小组有多少种角色，每个角色目前公司是否有人，是否能完全归这个项目使用，是否需要另外招聘一些人员，招聘的准备工作要尽早启动。最后就是一些设备的准备，项目所需大件关键设备要尽早预定，以后不管发生设备等人还是人等设备的情况，浪费的都是你的时间。</p>
</li>
<li>
<p>现在是做项目说明书的时候了。一份好的项目说明书不仅将要做的事情描述得很清楚（主要是讲做什么，而不是说怎么做），而且把如何检查也说明得很透彻。也就是说它不仅说明白了要做哪些事情，也让客户的业务人员（一般不懂技术）知道项目做成什么样就算完成了。简单地说，项目说明书描述项目做哪些事情和每件事情做到什么程度以及如何检查每一个结果。</p>
</li>
<li>
<p>是到做总体计划的时间了吗？不，你现在已经知道了客户的目标和你手上的资源，那么做计划以前，你还需要和你的经理和客户充分沟通资源的问题。因为很多资源是还不明确的，你需要写一份报告，详细分析这个项目的风险以及对资源的需求情况。如果一些问题不能得到解决的话，将发生什么样的后果。如果资源不够，就要高层改变策略，增加对这个项目的投入。甚至在条件许可的情况下，有些公司会放弃这个项目。总之，没有人能完成一个不可能完成的任务，如果项目经理不能尽早发现风险，那么就只能去当烈士了。</p>
</li>
<li>
<p>明白了要做哪些事情和你手上的筹码以及你做这个项目的总体策略，现在是成立项目小组的时候了。很多项目经理都没有自己选择组员的权利，那么，就尽量发挥你的影响力去寻找那些你想要的人吧。成员的组成根据项目不同，相差较大，很难有什么具体要求，但是，一定要有精通客户业务的人，很多小项目里，这个人就是项目经理本人，大项目里会配备行业专家（Industry expert），这样和客户沟通起来才不会鸡同鸭讲，双方才可以相互理解。我经常看到的情况是我们的技术人员和客户交谈时满口的专业术语，结果搞得客户一头雾水，反过来，他还指责客户不懂技术。其实，明白自己想做什么的客户已经是很好的客户了，不知道自己要做什么，更不懂怎么做还要指手画脚的客户到处存在，但是要明白，是客户选择了你，而不是你选择了客户，有了客户你才有工资拿，心平气和一点吧。</p>
</li>
</ol>
<p>对于这种需求天天变的客户，你就一定要事先做好规矩：</p>
<p>一、统一联系人，客户指定一个人和项目组进行沟通，不能张领导、王领导都来说几句，如果他们意见不一致，那你只有得罪领导的选择了。所以，项目的最初就要定好规矩，我项目组只认一个的意见，有什么要求你们内部先统一再和我谈，我不想卷入你们内部业务部门之间的矛盾之中。</p>
<p>二、所有需求变更全部要有书面文字，这点切记！这样做好处多多：</p>
<ul>
<li>有书面证据，以后他还想改，你有了他以前要求的证据，告诉他：你以前可是这么说的。</li>
<li>便于需求变更管理，需求如何慢慢演变的历史可以看清楚，从而更深切地体会客户的目。</li>
<li>对于客户来说，嘴巴一动最方便，反正是你们做，不花他的资源，所以要求是否合理，是否和项目的目的一致，他是不负责任的。但是如果要他写书面要求，还要签字盖章，他就要谨慎多了，而且一写东西，思想就会更加深入，很多无理要求也就这样胎死腹中了。</li>
</ul>
<ol start="8">
<li>
<p>现在你要面对三群人：你的领导、你的组员和你的客户，和这些人沟通，让他们知道你打算怎么做，什么时候要他们做什么准备，这些事情将是你的主要工作。既然沟通这么重要，那事先定义一下沟通的原则也是一件很要紧的事情。很多沟通原则都是潜规则，如果你在一个部门时间做长了，对这些规则的运用觉得是一件理所应当的事情。但是，你现在面对的是多个部门甚至多个单位，不把沟通规则说清楚，你以后就会吃亏。下面的东西看起来无聊，其实还是很管用的：第一个是规定信息的流动方式和介质，是推还是拉。推的意思就是项目经理将主动发布信息，不管通过电话、邮件还是书面方式，保证将信息传达到每个人。这种情况适合小项目，人少。拉的意思就是项目经理就是一个类似web服务器，你自己需要什么信息就去问他。当然，没有项目经理把自己搞得那么累，他会用发布信息到公共介质的方式公布信息，简单的是白板，复杂一点的是项目的公共信息交互区，潜规则就是我发了你没去看就不要说我没告诉你。说这些看似很无聊，其实里面牵涉信息传达不完全的责任问题。当然，这些都是指一般的方式，而且不要绝对化，一般情况下，主动沟通和被动访问是同时存在的，尤其是对领导，项目经理更加应该主动去和领导沟通。第二个问题就是文档问题，很多人怕写文档，但是项目经理一定要牢记“好记性不如烂笔头”的道理。有理有时候为什么会说不清呢？就是因为没有证据。所以项目经理开始就要和客户说清楚有些文档是必须签字的，比如项目经理的项目日志，每个星期至少让客户签字，另外所有达成共识的东西，比如会议纪要，甚至领导的讲话记录，都要写成文档，双方签字，这样以后扯皮的时候，就能做到有据可查。记住：说了的就和没说一样，只有写下来大家签字后才算真正发生了的。还有一些问题，比如你提交的报告，给领导（包括本方领导和客户领导）做一个选择题，结果领导压住不批，让你无所适从，结果拖延了进度。这时候，你可以等，但是注意要留记录，标明是谁的责任；另外，如果你在开始阶段就和领导商定：如果批示提交三天后没有得到领导答复就算对方同意，这样你就会主动很多。再比如不同事件的审批流程问题：什么等级的事情记录在项目日志里、什么等级的事情要双方项目经理专门签署备忘录、什么等级的事情要双方领导出面签署合同附件等等。事先想得越周到，以后的工作就越主动</p>
</li>
<li>
<p>好了，做了很多前期工作，定义了一些游戏规则，现在是坐下来做计划的时候了。这一节，任意找一本项目管理的书都会说得比我好，所以我就少写一点，说一些自己的体会就是了。首先是找几个关键组员，比如客户业务专家、系统分析员等等，做一下项目模块划分工作。项目分成几块去做，每一块完成什么，模块之间的信息如何交换等等。需求定义的是做什么的问题，而这里说的是怎么做的问题。这里要强调一点：完成一个目标有很多种方式，你要选一种你最熟悉的，而不是看上去最完美的，这个思路会让你的项目减少很多风险。有时候客户会被某种新技术打动，坚持要你采用那种新技术，你就应该告诉他：你选我做这个项目，就应该容许我采用自己最喜欢的方式做事情，新技术之所以有诱惑力，就是因为吃亏的人还不多，我不希望你成为第一批受害者。采用一个计划会让你的工作更加明确，比如用微软的Project软件，你填写完表格以后，就可以知道这个项目有多少件事情要做，每件事情需要什么资源，他们之间的前后关系如何，消耗的时间有多长，完成后有什么标志等。所有的结果最后用一个叫做甘特图的形式表现出来。你做完这个表以后会惊奇地发现，甘特图上项目的结束时间会远远落后于你的计划结束时间（签合同的人永远不会先征求你的意见的）。当然，学过项目管理的人会大谈什么WBS、优化路径之类的东西，但是我的经验是你再优化也不可能把这些东西安排到计划的时间结束。如果你没碰到这个问题，在我恭喜你挑了一个轻松活之前，请你再去确认你是否罗列了所有要做的事情和正确评估了它们所需要的时间。这时候，你就要考虑牺牲一些任务的时间（也意味着质量）了。按照什么标准牺牲？这个项目的战略！我们在第三节提到过的战略。我的经验是如果你什么都赶进度，其结果可能就是十件事情你一件也没做好，想想多么失败啊。所以，把资源投到你熟悉和有把握的事情上，最后的结果是十件事情，你有三件做成了精品，三件完成，还有四件因为某些原因延误，成绩单是否靓丽了很多呢？战略决定优先级，而正确排列事情的优先级是一个项目经理能力的主要体现。</p>
</li>
<li>
<p>好，现在项目已经完成了前期工作，了解了项目的目标、搞清楚了手上的资源，制定了项目的策略，然后编制了项目的整体计划，项目进入实施阶段。进入这个阶段反而是项目经理比较空闲的时候，不像前期的时候项目经理要象记者一样到处和不同的人接触，搞清楚他们在说什么，努力猜测他们在想什么和他们的真正目的，那才是最累人的事情。当然，小项目的项目经理往往自己也是一个资源，要做很多事情，这时候反而比谁都苦。项目经理这段时间的主要工作是保持和客户领导以及自己领导的沟通。和客户领导沟通时特别要注意，除非你需要对方给你支持，那么你才需要讲得具体一点，否则，告诉他一切正常就可以了，而且态度要积极一些，千万不要说一些领导不懂的细节，比如：“王局长，最近项目进度还算正常，就是JVM经常发生一些内存泄漏的情况…”王局长：“(*&amp;$@@”。和自己的领导汇报也要注意这个问题，除非他是一个技术高手，你需要他的技术经验，否则一般就汇报进度是否正常以及有问题时你的对策和打算就可以了，有些需要他支持的地方，比如资源调用需要说详细一点。和组员开会，除了一些项目进度跟踪会议以外，还有很多讨论会，需要大家用头脑风暴方法给出解决问题。与会人员很多都是技术人员，他们的特点是注重细节、缺乏大局观、有点消极悲观、自尊心强（如果总结得不对，欢迎大家拍砖），所以，你作为会议的主持人，只要负责提出问题和记录下他们的观点，千万不要做评判者的角色。一个问题，有很多方面，从不同的角度看，现象是完全不同的，想想盲人摸象的故事吧。这些技术人员，他们往往精通一个方面，就自己的角度发表见解，除非一些很特别的情况，你都应该认为，他们提出的方案，从他们的角度来看是最合理的。你的长处是掌握事情的优先级，评估各个方面的轻重缓急，从而根据他们的意见得出一个合适的（而不是正确的）方案。所以，在会议上，你要充分尊重每一个人和他的意见，夸奖那些意见提得比较好的人，千万不要把会议带入无休止的争论（你要让大家知道事情不是非黑即白的，而是多元的，唉，我们的教育惹的祸…）。会后，你自己写文档，做决定。会议上大家的面子都被照顾了，自己实施起来的阻力就小，如果还有意见的，你就私下找他聊，如果还不能说服他，你就要让他明白，因为你负责这个项目、你担当风险，所以，这个优先级应该你来判断。组织中的高层，并不见得水平会比一般的成员高，但是，他要承担组织的风险，加之信息的不对称性，所以，对事情的优先级的判断肯定比下属强。</p>
</li>
</ol>
<p>终可交付成果一定要是可以被检查的，比如，【界面要求：美观大方、简洁明快】，这个要求我就不知道如何检查。所以，给开发小组布置任务的时候就要考虑如何检查结果，比如我见过一个计划，里面有一个任务【开发人员熟悉EJB编程】，这个任务，除了让这些人去参加一些专业认证考试，否则，结果很难被检查。所以，时刻考虑如何检查结果、如何向客户交付是项目经理一直要注意的事情，我听说有些老项目经理拿到项目是倒排计划的，即首先看如何验收和验收标准，然后决定工作计划。很多项目开始了很久，还不知道如何验收，那么这个项目出问题的可能性就很大了。做项目就是为了验收，我们的角色不是研究机构，我们的目的就是在付出那么多劳动后得到结果。</p>
<p>另外我插一句：我是极其不主张到客户现场开发的。尤其是一大群技术人员直接和客户交流，很容易引起冲突和矛盾（技术人员的本性决定的）。我的做法是项目经理和项目实施人员到现场，软件开发人员还是在公司做项目。项目实施人员就是初级项目经理，他们了解自己的产品，懂得一些客户的业务，关键是在于他们具有良好的沟通能力，俗称“皮厚”。他们是客户和研发人员的桥梁，其职业方向也是很机动灵活，以后可以有很多方向可以转，比开发人员的路要宽得多。</p>
<ol start="11">
<li>
<p>接着，我们再谈谈最让人头痛的需求变更问题。变更通常分为两种：一种是部分更改了原先的目标，即需求变更；另一种是没改变目标，但是客户不满意目前的实现方式，大到流程的实现，小到界面的布局，都是属于这类。碰到这种情况是难以避免的，主要是事先沟通的不够充分和客户随着项目的进展，慢慢想清楚了问题，改变了以前的思路。这时候，如果需要改并且你的战略是容许这种情况的，那么注意下面几点：</p>
<ol>
<li>确保以前的文档，就是记载着以前的结论的东西，客户是否签过字，如果没有，赶紧把你的工作停下来，赶快再和客户自己确认一下你的方案，然后让他签字，避免以后说话没有凭据；</li>
<li>和客户坐下来，探讨他修改的根本目的是什么，是不是有同样能达到相同目的、但是对你来说有代价更小的选择？</li>
<li>（项目初期的工作）明确更改流程，一般是客户指定一人签字（否则客户每个领导都有权力来插一杠子，你就废了），以正式项目文件的方式提交给你，然后，你做评估分析，分析对成本、进度的影响，在你的领导同意后，出相应意见书，主要是要说明更改设计的原因和指出由此带来的不确定后果（这个东西先写出来，后面如果真的发生了，至少不是你的错）。然后再让客户在上面签字。见过医院给病人做手术以前让家人签的免责条款吗？对，就学习那个，让大家都意识到任何的更改都有成本和代价。</li>
</ol>
</li>
<li>
<p>系统开发告一段落后，就进入客户培训、系统验收阶段，这个阶段，我一般会注意以下几个问题：</p>
</li>
</ol>
<p>一、给客户做培训前，多注意一些表面功夫。很多程序员认为，系统的逻辑核心是否正确是关键，至于界面如何，界面上的用词是否准确，那是无关紧要的问题，而且培训的时候也是信手拈来，想到哪里说到哪里，下面听讲的人不知所云，云山雾罩，培训效果自然可以想象。我的体会是，给客户做培训的版本，如果你在做多次测试以后仍然不能确定逻辑是否合乎要求，那么，你至少要在界面上多花一点功夫。注意每个界面的布局、用词、链接的正确性等等，总之不要让客户看到一些他不该看到的东西。文档方面，准备至少两个文档：用户手册和培训手册。这两个文档的内容很多都是一致的，但是角度完全不同。用户手册往往是站在系统设计者的角度，按照自己的思路，分模块讲解系统的操作和功能；而培训手册，一定要站在客户业务人员的角度，根据每个角色面对不同业务的办理，如何通过使用本系统的一系列功能来实现目标。所以，第一次培训以前，系统界面是否完整正确、培训文档是否完备都是很关键的因素，第一炮打不响，以后就麻烦很多</p>
<p>作为项目经理，其实脑子里就是几样东西：做哪些事情、做到什么程度、怎么交货、手上的资源以及各个事情的优先级。所谓多快好省那是人类的梦想，这四个方面都是相互矛盾的，属于典型的又要马儿跑，又要马儿不吃草的类型。考虑问题的轻重缓急方面，往往是把快放在第一位，各方领导都会给你最后期限，所以保进度是第一位的；省是第二位的，企业的根本目的是盈利，如果收入不能增加的话，至少费用要控制住；好是第三位的，没办法，谁都想精益求精，但是，没有强大的资源保障，质量只好先牺牲了；最后是多，客户的要求源源不断，如何降低客户的期望值，让他们从理想回到现实也是项目经理的分内工作。</p>
<p>验收前，除了做好文档工作，即可交付成果以外，多花时间搞清楚客户的做事情流程是很重要的事情，这些在前面已经有所提及，这里就不再多说。</p>
<p>我对验收最大的体会就是举证问题。即千万不要让客户这么想：你必须有证据证明你的系统是没问题的。这样你就没戏了，微软那么多天才，做了XP还天天打补丁，要你的程序没问题，既不可能，你也没办法拿出证据。你要让客户明白，所谓验收，就是我按照测试文档的测试用例跑一遍，结果和预期结果一致就应该算通过了，而且还容许有一些小错误留在验收后改正，他可以对测试用例提意见。所以，验收前双方要确认测试计划和测试用例。如果他认为系统不符合要求，那么他应该举证，证明这个系统和最初设计相背离的。所以，参考法律概念，千万不要举证倒置。另外，认为系统完美了才能验收的想法也是错误的，软件开发合同里一定要注明验收以后维护期的费用问题，否则，客户担心一旦验收就得不到你们的支持，自然不配合验收，那么，你这个项目经理就很难交功课了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验27</title>
      <link>https://ujava.cn/manage/project27.html</link>
      <guid>https://ujava.cn/manage/project27.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验27</source>
      <description>要想成为一个好的项目经理，您需要弄清项目经理所面临的问题、机会和期望，明白项目团队将会有冲突，弄清谁是利益的关系者，明白判断项目成功的四个标准：预算、进度、效绩标准和客户满意，还要为组建一个和谐的团队，充当教练、领队和冲突仲裁人。不能因为项目中的挫折而止步不前，更不能安于现状。你在整个项目实施中，是领导也是小兵。 如何组织开发团队 如何构建软件开发团队...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>要想成为一个好的项目经理，您需要弄清项目经理所面临的问题、机会和期望，明白项目团队将会有冲突，弄清谁是利益的关系者，明白判断项目成功的四个标准：预算、进度、效绩标准和客户满意，还要为组建一个和谐的团队，充当教练、领队和冲突仲裁人。不能因为项目中的挫折而止步不前，更不能安于现状。你在整个项目实施中，是领导也是小兵。</p>
<p><strong><em>如何组织开发团队</em></strong></p>
<p>如何构建软件开发团队取决于可供选择的人员、项目的需求以及组织的需求。本文阐述了项目实施过程中各种团队组织的策略。</p>
<p>有效的软件项目团队由担当各种角色的人员所组成。每位成员扮演一个或多个角色；可能一个人专门负责项目管理，而另一些人则积极地参与系统的设计与实现。常见的一些项目角色包括：分析师、策划师、数据库管理员、设计师、操作／支持工程师、程序员、项目经理、项目赞助者、质量保证工程师、需求分析师、主题专家（用户）、测试人员。</p>
<p>作为一个项目经理人，您是如何组织项目团队的？是采用垂直方案、水平方案还是混合方案？以垂直方案组织的团队由多面手组成，每个成员都充当多重角色。以水平方案组织的团队由专家组成，每个成员充当一到两个角色。以混合方案组织的团队既包括多面手，又包括专家。</p>
<p>一个重要的考虑因素是可供选择的人员的性质。如果大多数人员是多面手，则您往往需要采用垂直方案，同样，如果大多数人员是专家，则采用水平方案。如果您正引入一些新人，即使这些人员都是合同工，则仍然需要优先考虑您的项目和组织。本文描述了形成团队组织的垂直、水平和混合方案，并指出了它们各自的优缺点。本次讨论的一个重要含意是您的团队组织和用于管理项目的手段之间应构成默契；任何方法上的失谐都很可能导致项目产生问题。</p>
<p><strong>垂直团队组织</strong></p>
<p>垂直团队由多面手组成。用例分配给了个人或小组，然后由他们从头至尾地实现用例。</p>
<p><strong>优点</strong></p>
<p>● 以单个用例为基础实现平滑的端到端开发。<br>
● 开发人员能够掌握更广泛的技能。</p>
<p><strong>缺点</strong></p>
<p>● 多面手通常是一些要价很高并且很难找到的顾问。 　<br>
● 多面手通常不具备快速解决具体问题所需的特定技术专长。<br>
● 主题专家可能不得不和若干开发人员小组一起工作，从而增加了他们的负担。<br>
● 所有多面手水平各不相同。</p>
<p><strong>成功因素</strong></p>
<p>● 每个成员都按照一套共同的标准与准则工作。<br>
● 开发人员之间需要进行良好的沟通，以避免公共功能由不同的组来实现。<br>
● 公共和达成共识的体系结构需要尽早在项目中确立。</p>
<p><strong>水平团队组织</strong></p>
<p>水平团队由专家组成。此类团队同时处理多个用例，每个成员都从事用例中有关其自身的方面。</p>
<p><strong>优点</strong></p>
<p>● 能高质量地完成项目各个方面（需求、设计等）的工作。<br>
● 一些外部小组，如用户或操作人员，只需要与了解他们确切要求的一小部分专家进行交互。</p>
<p><strong>缺点</strong></p>
<p>● 专家们通常无法意识到其它专业的重要性，导致项目的各方面之间缺乏联系。<br>
● “后端”人员所需的信息可能无法由“前端”人员来收集。<br>
● 由于专家们的优先权、看法和需求互不相同，所以项目管理更为困难。</p>
<p><strong>成功因素</strong></p>
<p>● 团队成员之间需要有良好的沟通，这样他们才能彼此了解各自的职责。<br>
● 需要制定专家们必须遵循的工作流程和质量标准，从而提高移交给其他专家的效率。</p>
<p><strong>混合团队组织</strong></p>
<p>混合团队由专家和多面手共同组成。多面手继续操作一个用例的整个开发过程，支持并处理多个使用例中各部分的专家们一起工作。</p>
<p><strong>优点</strong></p>
<p>● 拥有前两种方案的优点。<br>
● 外部小组只需要与一小部分专家进行交互。<br>
● 专家们可集中精力从事他们所擅长的工作。<br>
● 各个用例的实现都保持一致。</p>
<p><strong>缺点</strong></p>
<p>● 拥有前两种方案的缺点。<br>
● 多面手仍然很难找到。<br>
● 专家们仍然不能认识到其他专家的工作并且无法很好地协作，尽管这应该由多面手来调节。<br>
● 项目管理仍然很困难。</p>
<p><strong>成功因素</strong></p>
<p>● 项目团队成员需要良好的沟通。<br>
● 需要确定公共体系结构。<br>
● 必须适当地定义公共流程、标准和准则。</p>
<p><strong>项目团队士气是项目成功的一个因素</strong></p>
<p>大部分项目成功的定义说的是项目如何按时完成、是否在预算内以及是否满足用户的需要。但是，在如今要找到好的软件专业人员都非常困难，更不用说留住他们的这种情况下，还需要将项目成功的定义扩展为包括项目团队的士气。可能在努力完成一个软件项目后，不料却因为压榨他们过度而失去了重要的开发人员，这样做可能会符合组织的短期需要，但它对构建一个高效的软件部门的长远利益来说肯定是有害的。衡量项目成功与否的一个重要手段是项目结束后团队的士气。在项目结束之际，项目团队的各个成员是否觉得他们从自己的经历中学到了一些知识、是否喜欢为这次项目工作，以及是否希望参与组织的下一个项目都是非常重要的。</p>
<p><strong><em>项目规划技巧</em></strong></p>
<p>项目计划技巧对于现今的软件开发人员来说是必需的。这里有一些帮助您有效地计划下一个项目的建议。</p>
<p>认识到信心来自规划的过程，而不是计划本身。</p>
<p>创建项目计划会迫使您早在编写代码之前就考虑如何构建您的系统——减少项目的风险，因为您已经考虑了各种策略和方法并且已经选择了最有意义的一项。您的目的不应该只是不花气力产生一个计划；它应该是一个实际可行的计划，您可以根据它来成功管理您的项目。</p>
<p><strong>软件过程推动计划的开发</strong></p>
<p>每个软件过程都有一个不同的集合，它包括组织团队的活动方法以及规划项目常用的技术。由于这个原因，基于 Rational Unified Process (RUP)的项目规划不同于OOSP项目的规划，而OOSP项目的规划也不同于eXtreme Programming (XP) 项目的规划。不同的过程有不同的计划。</p>
<p><strong>从粗粒度的计划开始</strong></p>
<p>在项目将要开始时，应该制定一个粗粒度的、确定项目高级活动和预期里程碑的计划。粗粒度的计划将组织成迭代——根据项目的大小和性质，每次迭代通常在三周到八周之间发生（四周到六周为更佳）。其中一些迭代将集中在项目初期，而很多迭代将集中在整个应用的功能部分开发，还有一些迭代集中在将您的系统转变成产品。</p>
<p><strong>实施者应该是计划人员</strong></p>
<p>创建项目计划的最佳人员是负责实施该计划的人员。当规划由一个人创建而由另一个人实施时，如果项目不能按时完成或超出预算，他们不太会相信计划，而很有可能会责备它。也就是说，参与项目的每个人都应该投入到项目计划的开发和进展中。</p>
<p><strong>不要忘记“不该忘记的事”</strong></p>
<p>计划不仅要反映需求设计、建模、编程和测试的“真实”工作，而且还应该反映辅助活动（然而仍是重要的），它包括：休假和法定假日、培训和教育、项目管理活动（如规划和人员管理）、开销（如系统当机时间、会议和回复电子邮件）、体系结构定义、测试之后的系统返工、系统交付、与重用相关的活动（如普遍化 ）。</p>
<p><strong>将任何设想和约束编入文档</strong></p>
<p>规划时您总要作一些假设，如能够及时获得应用程序服务器的新发行版，或可以得到熟悉您正在应用的技术和技巧的开发人员。同时，您将在一些约束下工作，如影响计划的强制截止期限或资源限制。将这些假设和约束编入文档，这样，当您实施项目的任何时候更新计划时，都可以记起您先前做出的一些“不寻常”决定。</p>
<p><strong>认识到不同的资源意味着不同的计划</strong></p>
<p>十名有经验的开发人员组成的团队创造出的成效要远远多于十名初学者组成的团队所创造的成效。要想更加实际的话，您的计划必须反映项目可使用的资源的真实情况。</p>
<p><strong>创建现实的计划</strong></p>
<p>项目组必须相信其项目的目的、估价和时间表。要做到这点，您必须真实地规划，避免规划超出您能理解的范围。仅当您打算研究未知事项时，才能容忍无知。</p>
<p><strong>只规划有价值的事</strong></p>
<p>IBM DeveloperWorks 网站提供了许多可应用于您项目的最佳实践。然而，根据项目的性质，不是所有这些技术都将适合于您的独特情况。要将这些最佳实践简单地看作是您放置在“项目管理工具箱”中的工具，您可以根据需要适当使用这些工具。</p>
<p><strong>适当使用项目管理工具</strong></p>
<p>一些项目管理工具，如 Microsoft Project，提供了重要功能， 如Gantt图表（活动时间表）的开发、规划与实际结果的比较、PERT 图表（网络图表）的开发、任务的定义、任务之间相关性的定义、对任务的资源分配和资源平衡。所有这些事情似乎象是一个好主意，并且它们通常是好主意——但它们还需要许多精力来创建和维护，而且很少为项目组提供实际价值。的确，它让一些项目管理人员感到富有成效。的确，高级管理喜欢看见您有一个计划。但是，没有一行代码是由所有这个活动产生的。规划是有价值的活动；但投入大量的时间来创建规划图表通常不是有价值的活动。</p>
<p><strong><em>谨慎应用技术方案处理管理问题</em></strong></p>
<p>对于在项目中遇到的问题，您确信需要用技术来解决吗？本文改编自作者所著的Process Patterns 的第五章，Scott Ambler建议改进管理，而不是新技术，可能就是您的解决方案。</p>
<p>还没有一种点能表明用部署最新技术中来解决通过改变管理实践去解决问题的（请参阅参考资料中 The Squandered Computer）。事实上是，您不应该将所有商业过程所得的好处都归功于支持这些更改的软件项目。没有这些新的软件或硬件，您可能会得到同样的好处。</p>
<p>将技术解决方案识别成非技术问题是经常重复发生在信息技术界的常见错误。这种经常发生的错误将其看成是称作 Apply Technical Solution to Non-Technical Problem（将技术解决方案应用到非技术问题）自身的过程反模式（过程反模式是一种已证明在实际运行当中并不是行之有效的方法）。</p>
<p>技术解决方案仅适用于解决技术问题。例如，“网络计算机”的概念仍然是计算机界中热衷的时尚。其基本概念就是通过网络计算机来替代个人计算机，组织就可以大大缩减支持计算机软硬件的开支。</p>
<p>研究表明，如果包括培训和支持这些计算机费用的话，那每年支持一台个人计算机的平均开支大约在 $5,000 到 $30,000 之间。网络计算机（也称之为 Java 终端，因为它们仅运行已经打包成 Java 字节代码的程序）理论上将缩减开支，因为它们仅需要简单的维护和支持。尽管做了大量的广告宣传，但迄今为止，网络计算机的销售量十分可怜。从表面上看，网络计算机试图解决的问题看起来是技术性的。但当您想到这一点的时候，问题实际已经成为管理问题之一了。</p>
<p>一些组织一年要花费 $30,000来支持计算机的原因不是因为个人计算机，而是由于对个人计算机的误用。这些组织不是由具有资格的专业人员来安装公共配置，而是让用户选择和安装他们自己的软件。一旦用户遇到了麻烦，组织的开支就飞涨。另外还有文件格式不相容的问题。若没有公共的软件套件，用户得浪费大量时间在同一供应商所提供的不同软件版本之间转换文件，或从不同供应商所提供的不同软件之间转换文件。基于类似的原因，当用户购买他们自己的设备时，硬件培训和支持也变得更加困难。</p>
<p>在这种情况下所发生的问题是与过程相关：个人计算机软硬件的管理不当。因而购置网络计算机这一技术解决方案是否能够解决问题值得怀疑。技术解决方案适用于技术问题，管理解决方案适应于管理问题，而过程解决方案则适用于过程问题。在谈完了所有内容之后，我真正的意思也许仅仅是在工作中要使用正确的工具。</p>
<p><strong><em>基于需求的规划策略：按优先次序排序</em></strong></p>
<p>成功的项目组认识到不能等同地创建所有的需求，因此，需要对需求进行优先次序排序并按此顺序操作。</p>
<p>某些需求比其它需求重要得多。例如，对于联机银行的需求来说，对帐户间资金转移的支持要比银行每月声明的 Elbonian语言版本重要得多。成功的软件团队将首先集中精力构建最重要的功能，尽可能地满足用户需求中关键的功能，而那些次关键性功能留到以后处理。需求排序使您的团队能够为组织的软件利润作出最大贡献。然而，要有效地对需求进行优先次序排序，必须考虑几个因素：商业价值、交付成本、交付日期、交付复杂程度、风险（请参阅提示“控制风险：不让风险控制您”）、与其它需求的关系、何时需要该需求。</p>
<p><strong>可能的优先级别范围</strong></p>
<p>只要明确的定义了优先级并且在应用上保持一致，那么使用什么优先级别范围是无关紧要的。一般的优先级别范围包括：</p>
<p>● 高级、中等、低级</p>
<p>● 必需的、条件的、可选的</p>
<p>● 数字的（例如，1、2、3）</p>
<p><strong>如何对需求按优先次序排序</strong></p>
<p>您应该让授权的个人或小组来建立并确认指派的优先权。对需求的优先级进行优先次序排序通常是一个协商的过程，它涉及到许多项目参与者，包括您的用户、用户管理、高级管理、开发人员、操作人员和支持部门。</p>
<p>大多数项目小组将组织成一个“配置控制委员会 (CCB)”——有时称为“更改控制委员会”或“项目筹划指导委员会” ——它由系统中关键的并且希望是知识渊博的参与者组成。通常由该小组定期开会决定任何新需求的优先级和指派（对于系统的发布或者对于在现有开发成果中的重复）。</p>
<p><strong>为何对需求进行优先次序排序？</strong></p>
<p>需求排序列表是输入进项目定界过程中的关键因素。项目早期，需要认识到，最困难的事之一是不要打算能交付项目参与者要求的每个功能。项目范围定义了项目组将要交付的范围。这是很重要的，因为它有助于避免“超出范围”，即，项目进展的附加的新需求。已定义的项目范围使您能协商是否有责任交付新确定的需求，并判断新需求对于交付日期／成本的增加的合理性以及讨论是否应该在后续发行版中交付该需求。缺少确定的范围，项目组将承担无法交付的风险，因为经常要向正在构建的项目中添加“再多一条功能”。</p>
<p><strong><em>规划迭代：及时开发详细计划</em></strong></p>
<p>项目不断进行时，需要详细规划即将实施的迭代活动。在当今日新月异的环境中，提前几个月甚至几年做详细规划是毫无价值的，但您可以对下几周（典型的迭代的时间跨度）进行成功地详细规划。</p>
<p>项目规划的普遍且难以置信的有效方法是从粗略的项目规划开始（请参阅“项目规则技巧”），即从项目开始时开发，然后在完成构成项目的各种迭代时缓慢发展形成。随着项目不断进展，需要更新整个粗略的项目规划，更新它以反映近来努力的实际成果以及您的团队将继续从事的下一个（或两个）迭代的规划细节。在为单一迭代开发细致的规划时，应该执行这些步骤。</p>
<p><strong>实行真实性检查</strong></p>
<p>通过询问并且回答一些难题来开始详细的规划工作：项目是否仍在按计划进行？您的方法是否仍有意义？您的团队是否由合适的人员组成？您是否仍有资金管理者支持？如果其中任何一个问题的答案是否，则需要解决问题，这可能意味着新（且非常短）迭代使您的团队回到正常轨道上。对处于困境的项目进行大计划是毫无价值的。</p>
<p><strong>标识详细的任务</strong></p>
<p>在项目开始时，体系结构和转移迭代只是列出需要实现的任务列表。然而，要规划迭代，必须评估已为它指定的需求（请参阅“基于需求的规划策略”）。随着项目发展，您将对于对个别需求有更好理解。您可能会发现，现在需要更改给迭代指定的原始需求，这些需求最初是有意义的。或许已经标识并添加了新的需求；或许已经扩展或缩减了需求；或许已经更改了优先级。不管什么原因，您会发现您需要重新定义打算在该迭代中实现的内容。根据需求，标识需要实现的任务。</p>
<p><strong>标识任务相关性</strong></p>
<p>某些任务取决于其它任务。例如，在部署源代码之前，必须先编写它。测试案例的开发可以在编码之前开始。实际代码的测试必须等待，直到已经编写了某些代码（尽管或许不是所有代码）为止。问题是某些任务必须在其它任务完成之后才能开始；某些任务必须等待，直到另一个任务开始了为止，它才可以开始；某些任务不能完成，直到另一个任务完成为止；某些任务不能完成，直到另一个任务开始了为止。</p>
<p><strong>均衡资源</strong></p>
<p>需要紧记的重要事情是，每个人一次只可处理那么多任务，并且在工作的那一天只有那么多时间。这个概念称为资源均衡，确保任务分派是合理的。 指定用 10% 的时间完成 10 项任务很可能无法完成任何任务， 而且指定用 50% 的时间完成 5 项任务的人员也不可能完成这些任务。确保现实的规划的最好方法是，让执行计划的人员参与计划开发。</p>
<p><strong>保持迭代短小</strong></p>
<p>迭代周期应该保持比较短。应该将大于 8 周的迭代分割，以便让您迅速将软件交付给用户。因为正在尝试弥补在先前迭代中跳过的工作（如文档编制），或者因为您的需求正在增加而没有添加新的迭代来反映这一事实，所以当项目进展时迭代长度增长是一种趋势。执行真实性检查并按照它们的结果行动，将帮助您使迭代周期保持简短。</p>
<p><strong>考虑并行开发</strong></p>
<p>分几个子团队来同时进行系统的不同部分始终是一种有效的办法，尤其对于系统纵向片段的开发。并行开发可以大大地缩短产品的上市时间，这是当今高度市场竞争性的一个重要因素，尽管它以增加协调工作为代价。共同的体系结构、共享知识视野、共同的开发实践、定期团队会议及共享工作场地使并行开发成为可能。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验28</title>
      <link>https://ujava.cn/manage/project28.html</link>
      <guid>https://ujava.cn/manage/project28.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验28</source>
      <description>​有人说：项目管理是变理想为现实，化抽象为具体的一门科学和艺术。 这是对项目管理的一种精辟总结。项目管理专业的方法和知识能教会我们如何快捷、科学、艺术地做事。 因为它除了交付项目，更能管理人生。 毕业后这一路走来，得到过很多大佬的指点，自己也有所沉淀，都说站在巨人的肩膀上，可以看的更远。 好的经验就是最好的行动指南。 越总结，越优秀。 我浓缩了36条项...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>​有人说：项目管理是变理想为现实，化抽象为具体的一门科学和艺术。</p>
<p>这是对项目管理的一种精辟总结。项目管理专业的方法和知识能教会我们如何快捷、科学、艺术地做事。</p>
<p><strong>因为它除了交付项目，更能管理人生。</strong></p>
<p>毕业后这一路走来，得到过很多大佬的指点，自己也有所沉淀，都说站在巨人的肩膀上，可以看的更远。</p>
<p><strong>好的经验就是最好的行动指南。</strong></p>
<p>越总结，越优秀。</p>
<p>我浓缩了36条项目管理经验，是指南，也是经验。建议收藏，结合自己的经验进行内化，效果更好。</p>
<p>​</p>
<p><strong>一：认识项目经理</strong></p>
<p>为了成功管理一个项目，**项目经理通常承担着管理者和领导者的双重角色，**但也有着说不完的辛酸和无奈。</p>
<p><strong>01 项目经理的词汇中最有价值也是最少用到的是“不”。</strong></p>
<p><strong>02</strong>&nbsp;如果你喜欢一个人，你就让他去当项目经理，因为项目会使他有业绩；如果你恨一个人，你就让他去当项目经理，因为十有八九他会被失败的项目毁了。</p>
<p><strong>03</strong>&nbsp;卓有成效的管理者善于用人之长。</p>
<p>——著名管理学家彼得·杜拉克</p>
<p><strong>04</strong>&nbsp;“专才”对越来越少的事物了解得越来越多，直到最后他对不存在的事物无所不知；然而，“通才”对越来越多的事物了解得越来越少，直到最后他对一切事物一无所知。</p>
<p>二：<strong>项目启动</strong></p>
<p><strong>01</strong>&nbsp;项目不是在结束时失败，而是在开始时失败。</p>
<p><strong>02</strong>&nbsp;花大量的时间来确定需求，需求将会消失。</p>
<p><strong>03</strong>&nbsp;“我说不清我的需求是什么，但我能说清，你给我的不是我想要的”</p>
<p>——这就是客户的需求</p>
<p><strong>04 大变更用迭代型和增量型，你和我说要造飞船，后面才知道要造的是宇宙飞船</strong></p>
<p><strong>密集的小变更用敏捷型，比如造一个敞篷车改为造一个SUV。</strong></p>
<p><strong>05</strong>&nbsp;你可以冻结用户的要求，但你不能阻止他的期望。</p>
<p>​</p>
<p><strong>三：项目计划/项目目标</strong></p>
<p><strong>01</strong>&nbsp;领导不应该直接管人管事儿，而应该管计划；项目不应该被领导惯着，而应该被计划惯着；员工不应该按领导的指示做事，而应该按计划的安排做事。</p>
<p><strong>02</strong>&nbsp;如果你，不知道要到哪里去，即使给你张地图，也没有任何帮助</p>
<p>——项目的目标管理</p>
<p><strong>03</strong>&nbsp;计划细节永远不要超出你的控制范围。</p>
<p><strong>04</strong>&nbsp;计划的首要原则就是让具体做事的人参与到计划的制定中来。</p>
<p><strong>05</strong>&nbsp;Plan is nothing, planning is everything.</p>
<p>——拿破仑</p>
<p><strong>06</strong>&nbsp;<strong>不能纪录下来的诺言，等于什么也没说，签字就意味着牵制。</strong></p>
<p><strong>四：项目执行</strong></p>
<p><strong>01</strong>&nbsp;我们应该将行动纳入决策当中，否则就是纸上谈兵。</p>
<p>——管理学大师彼得·德鲁克</p>
<p><strong>02</strong>&nbsp;我们不能用产生问题的思维方式来解决问题。</p>
<p>——爱因斯坦</p>
<p><strong>03</strong>&nbsp;慢慢计划，快速执行。</p>
<p><strong>04</strong>&nbsp;问题再大、再复杂，也不会让你跑都跑不掉。</p>
<p>——Charles Schultz</p>
<p><strong>05</strong>&nbsp;当事情进展顺利的时候，某些事情将会出问题。</p>
<p><strong>06 最危险的常用语就是“我们一直是专业做的。”</strong></p>
<p>​<br>
<strong>五：项目控制/监督</strong></p>
<p><strong>01</strong>&nbsp;眼睛盯住细节的，是工程师；眼睛盯住结果的，是老板；眼睛盯住过程的，是项目经理</p>
<p><strong>02</strong>&nbsp;无法评估，就无法管理。</p>
<p>——管理学家琼·玛格丽塔</p>
<p><strong>03</strong>&nbsp;<strong>随着时间增长，改变行动方向所需的努力成几何倍增长。</strong></p>
<p><strong>04</strong>&nbsp;<strong>项目团队的成员憎恶每周报告项目进度，因为它生动地表明项目进展甚微。</strong></p>
<p><strong>05</strong>&nbsp;每个大型项目内总有一个想要脱离出去的小项目。</p>
<p><strong>06</strong>&nbsp;正是那些不可测量的事物，才使可测量得以诞生。</p>
<p>——伽利略</p>
<p><strong>六：项目风险管理</strong></p>
<p><strong>01</strong>&nbsp;如果你担心某种情况发生，那么它就更有可能发生。</p>
<p>——墨菲定律</p>
<p><strong>02</strong>&nbsp;两个可能发生事件，只有那个不期望发生的事件会发生。</p>
<p><strong>03</strong>&nbsp;不仅每一个项目是唯一的，它的相关风险也是唯一的。</p>
<p><strong>04 当你觉得一切正常时，某个差错已发生。</strong></p>
<p>​<strong>七：相关方沟通管理</strong></p>
<p><strong>01</strong>&nbsp;项目运作成功的秘密在于，要让所有的决策者，对全部事实，都有相同的理解。</p>
<p><strong>02</strong>&nbsp;说服别人最好的方法是使用我们的耳朵。</p>
<p><strong>03</strong>&nbsp;解决项目冲突的办法总是存在的，问题是我们不一定能找到它。</p>
<p><strong>04</strong>&nbsp;人<strong>们只会告诉你问的东西，而不会告诉你他想的东西。</strong></p>
<p><strong>05</strong>&nbsp;如果你不能说服他们，那就把他们弄糊涂。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验29</title>
      <link>https://ujava.cn/manage/project29.html</link>
      <guid>https://ujava.cn/manage/project29.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验29</source>
      <description>1.要求员工去做不易之事 我发现人们通常比他们认为的要能干得多。大多数时候，要扩展和实现潜力，我们只需要要求人们去做即可。为团队中的每一个人制定特定的挑战，可以帮助他们集中精力，发现更多潜力。 最近，我要求一个团队成员担任正在招聘的新职位的导师(旁白：虽然目前还没有找到合适的人选)。然后，我发现这位同事改变了他的编码方式。现在的他 会积极地寻找问题的答...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>1.要求员工去做不易之事</p>
<p>我发现人们通常比他们认为的要能干得多。大多数时候，要扩展和实现潜力，我们只需要要求人们去做即可。为团队中的每一个人制定特定的挑战，可以帮助他们集中精力，发现更多潜力。</p>
<p>最近，我要求一个团队成员担任正在招聘的新职位的导师(旁白：虽然目前还没有找到合适的人选)。然后，我发现这位同事改变了他的编码方式。现在的他 会积极地寻找问题的答案，更愿意开口说话，因为他知道他很快将成为导师。我定时跟进并提醒他所要面临的挑战，也会在适当的时候提供建议。这使他专注于挑 战，因为他知道我相信他的能力。</p>
<p>2.了解每个团队成员</p>
<p>团队的每个人都有其独特的优势和才能。亲自去了解他们可以帮助我知道他们对工作有什么喜欢和不喜欢的地方。这能让我深刻了解什么挑战能让每一个人奋起拼搏，提升他们成功的更大潜力。了解团队成员的长处意味着我可以了整个团队的利益利用这些优势为。</p>
<p>建立高品质的工作关系需要时间和一致性。所以，我每周举行一对一的会议。我给每个人时间用于谈论事情的进展。我常常提前准备几个问题来鼓励反馈。我 最喜欢的问题是“这周你最喜欢和你最不喜欢的工作是什么？”通过问这个问题，可以帮助我了解每个员工的长处和弱点，并揭开一些隐藏着的有关于团队成员可能 对当前培养方法不舒服的问题。这是一个很好的起点。</p>
<p>在Lucid，每个团队在工作之外每个月都会举办活动，以促进彼此之间更好的了解。例如，我们团队所举办过的活动就有密室逃生、玻璃吹制和泡泡足球 等。或者甚至干脆到外面走走，一起共进午餐，这些都是相互了解的好机会。这给了我一个机会去了解大家真正关心的东西，以及他们在非工作环境中是什么样的。</p>
<p>我还发现在午休时和大家坐在一起也是有益的。离开一段时间，哪怕30分钟也会让我下午的工作更有效率。当我在午餐时间与某一个团队成员坐在一起吃饭时，通常都能展开一段愉快的对话。相较于更正式的会议中，这种休闲的环境可能会让人更乐于接受对方的关心。</p>
<p>3.保护团队时间</p>
<p>干扰和问题时不时地冒头，如果任其发展，会妨碍一个团队的成功。作为一个管理者，当我能过滤其他员工的请求时，正是我的团队最成功的时候。无论是销 售团队成员需要添加某个功能以便于达成交易，还是会影响用户的一个迫切问题，总会提出辅助项目。团队成员很容易受到来自于更重要和长期项目的潜在干扰而偏 离航向。当我过滤掉这些类型的问题时，我的团队便能保持专注于最重要的项目。</p>
<p>当团队致力于冲刺期间竞相完成工作时，Lucid实行的scrum方法就能派上用场了。明确知道工作应在冲刺的最后阶段完成可以帮助大家避免局限于 可能出现的不太重要的问题。通常情况下，如果一些非紧急的问题来了，我会把它积压下一个冲刺期间。其他员工也会因为完成了他们的要求而满意，而团队则可以 继续专心致志不必中断。</p>
<p>我需要提高警惕的是，当事情在松弛时段出现或当有人走进我们工作空间的时候。我得注意和尽量去做第一个回答问题的人，这样整支团队就不会受到问题和疑问的干扰。这意味着我要花更多的时间来处理非冲刺的问题，但它可以让团队的其他成员保持专注。</p>
<p>4.培养一种尝试的文化</p>
<p>失败是每个学习过程的一部分。犯错是必然的。保护团队避免打扰并不意味着阻止他们扩展一些有益的——有时甚至是不舒服的学习机会。</p>
<p>花费时间来学习和提高是很重要的，这样你可以避免犯以前的错误。留些时间用于定期回顾是从失败中学习的伟大方法。每两个星期的冲刺阶段结束后，我们 会空出时间来回顾我们做的好的地方以及我们没有做好的地方。坦然地承认错误并从错误中学习使得团队成员愿意承担风险去发现巨大的回报。</p>
<p>在回顾中，有一个特别的部分，我喜欢称之为“Andy’s screw up of the sprint”。这是我以前曾犯过错误的地方。我通常会花几分钟的时间来浏览我搞砸了什么以及从中我学到了什么。共享失败使得开会的氛围变得不那么评判 化，演绎了为了学习而不耻于承认错误的正确榜样。</p>
<p>5.让团队成为英雄</p>
<p>作为团队的领袖，很自然地会牢记每一次事情出错的日子。退一步，而不是深挖并非我的最初反应。让大家有机会去带头一定的挑战很重要，这样当事情进展顺利的时候，他们也可以得到赞誉。</p>
<p>我们的团队最近为Lucidpress构建了InDesign。我对这个问题很感兴趣，但是我移交了很多任务给Thayne，Lucidpress 团队中的一员。我让他来带头探索方法。他在构建实现方面完成得非常惊艳。原本我并不愿意放手，但我这样做了，并见到了成效。Thayne渐渐成熟起来，工 作出色，最后还基于我们做的一些工作编写了一个新的开源项目。</p>
<p>6.不要这么严肃</p>
<p>总会有事情进展困难，大家心情焦虑，压力沉重的时候。这时候，你就不应该过于严肃。不妨开个玩笑(即使是冷笑话)，分享一个有趣的YouTube视频或完美的xkcd。</p>
<p>压力的残酷会阻碍成功。用一种幽默的态度来看待问题，保护大家避免受自我压力的戕害。有时候是应该严肃，但这样的情况并不多见。一般情况下，一定程度的快乐可以让每个人都变得更富有成效。</p>
<p>在我们紧张地试图完成InDesign Import测试版的时候，我会在我们的每日站会中分享我们一点轻松的东西。这一两分钟是给团队很好的休息时间。我还在我的办公桌上放了一些Nerf枪， 以帮助放松情绪。它们也可以吸引别人的注意力，尽管他们还戴着耳麦(虽然，我不建议经常这样做)。</p>
<p>7.要及时进行艰难的对话</p>
<p>这是我历经艰辛才学到的教训。我碰到了一个老是偷懒的团队成员。我相信大家会自己做好工作，而且他们一般也不会让我失望。这是我第一次碰到这样一个 似乎一点都不在乎工作完成如何的人。我没有很快地和他交流，而是一直等待着，希望情况会好转(当然，事实是依然如此)。到我终于下定决心解决这一问题的时 候，他已经来不及做太多的改变，因为这位成员是一名实习生。如果我能早点和他说说，反正也许他能做出更大的改变，并且大大提高团队的士气。</p>
<p>当问题出现，或我需要反馈时，那么就应该马上把人拉到一边，让他们知道。可能会让人尴尬，但绝对比辞退一个人要不那么难以开口。</p>
<p>备注：关心每一个人</p>
<p>领导力最重要的部分实际上是关心团队中的每个人。这不是一件可以假装的事情。当我专注于帮助我的团队取得成功是因为我真心关心他们时，我的团队给了 我他们最佳的努力。我们成为了一个所向披靡的团队。更容易给出反馈，因为他们知道我心中牢记他们的利益。团队成员也更愿意忽视我的领导错误，因为他们知道 我的原意是关心他们。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验30</title>
      <link>https://ujava.cn/manage/project30.html</link>
      <guid>https://ujava.cn/manage/project30.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验30</source>
      <description>这些年集团公司一直在狠抓管理，有的项目经理会说，我们项目只要把集团公司四大目标做好就完事了，至于集团公司提出的各项管理要求，对项目来说是一种负担和麻烦，根本没必要，对于这种观点，你怎么看？（项目经理） 回答：这种观点不正确，做好建设项目管理的“四个目标”是项目经理在本职岗位上应该完成的基本任务。 集团出台的各项管理制度涉及的范围面更广，是企业生产经营活...</description>
      <pubDate>Thu, 14 Nov 2024 01:50:33 GMT</pubDate>
      <content:encoded><![CDATA[<ol>
<li>这些年集团公司一直在狠抓管理，有的项目经理会说，我们项目只要把集团公司四大目标做好就完事了，至于集团公司提出的各项管理要求，对项目来说是一种负担和麻烦，根本没必要，对于这种观点，你怎么看？（项目经理）</li>
</ol>
<p>回答：这种观点不正确，做好建设项目管理的“四个目标”是项目经理在本职岗位上应该完成的基本任务。</p>
<p>集团出台的各项管理制度涉及的范围面更广，是企业生产经营活动和员工日常工作行为的指引，是完善企业运营机制，加强规范化管理，保障企业有序运行，提高员工能力，端正员工行为的必要措施。因此，做好“四个目标”是具体工作任务，而集团的各项管理制度是实现包含做好“四个管理目标”在内的各项任务的有力措施和保障。</p>
<ol start="2">
<li>我们知道，项目工程点多面广，千头万绪，哪项工作都很重要，作为项目经理，承担着管理、培养、督促、协调等各方面职责，包括发挥示范引领作用，你是怎么做到思路清晰、目标明确、抓大放小、规范管理的？（项目经理）</li>
</ol>
<p>答：项目工程虽点多面广，但主线只有一个，即紧紧围绕更好实现四个目标去开展工作。在工作中，项目经理首先要以身作则，严格遵守企业规章制度和项目管理规定，严格规范自己的言和行，以诚待人、关心同志，做到勇担当、负责人、干工作、全力拼，树立自身作为项目部带头人在项目团队中管理威信和人格魅力。</p>
<p>另外充分利用团队的力量去开展工作，抓好、用好关键岗位、关键部门的人员，譬如生产经理、项目总工、商务经理，材料主管、安全主管等项目关键人员，最大限度的发挥他们的潜能，同时相信和支持他们对自己本部门工作的治理能力。再者，项目团队严禁搞拉帮结派，小圈子文化，做到公平、公正，奖罚分明。</p>
<ol start="3">
<li>安全、质量、成本和进度这四大目标是项目管理的核心内容，作为第一责任人，你是怎么做到统筹协调、一体推进的？（项目经理）</li>
</ol>
<p>答：项目经理作为建设项目管理“四个目标”的第一责任人，首先把安全优作为各项目标得以实现的核心和前提，坚决贯彻“安全一票否决”制，把安全作为底线、红线、高压线、生命线来认识和对待；工程质量始终遵循“百年大计，质量第一”的方针，质量是企业命脉，是企业良性发展的根本保障，提高工程质量有利于促进安全生产，确保安全生产能促进安全质量的提高，两者相互统一、相互促进；在工期方面，牢固树立“时间是最大的成本”的意识，干工作往前赶、不拖拉，没有工期的如期履约或提前，成本就会大幅增加，利润就会大幅降低；“降成本，增利润”是企业良性、快速发展的源泉，也是员工能够获得较好待遇，增强幸福感的根本保障，从某种意义上来说，干工程项目不盈利、不能产生价值，项目就失去了存在的意义。</p>
<ol start="4">
<li>
<p>在四大目标之中，安全排在首位，安全隐患不除会给集团公司带来巨大的风险，在安全管理方面，你都采取了哪些做法？（安全主管或项目经理）</p>
</li>
<li>
<p>质量是企业的生命，这些年建筑工程质量的各项要求也在不断发生变化，包括新设备的采用、新材料的使用、新工艺的运用以及新技术的应用，在工作中，你是怎么把握的？尤其是涉及变更洽商时，你是怎么做的？（技术总工）</p>
</li>
<li>
<p>时间是最大的成本，这些年，集团公司领导一直反复强调工期进度和成本控制的问题，在这方面，你有什么好的经验做法与我们分享？（项目经理）</p>
</li>
</ol>
<p>答：在工程建设过程中，进度与成本的关系为时间与费用的关系，因此，怎样合理确定施工工期，做好工期优化，对工程成本的控制会有很大的影响。首先，施工工期、资源投入量与成本消耗三者之间即相互联系又相互制约，通过对项目施工进度网络计划的优化，合理改变工序之间的逻辑关系，充分利用关键工作的时间差，科学调整工期与资源消耗使之最小。另外，重视工程物资供应方面的资源平衡，要求资源的计划量不超过资源的可供应量，务必做到资源的均衡使用、充分利用，避免浪费和无意义的占用。再者，编制详尽、合理、操作性强的施工组织方案、策划，并认真加以落实，对加快工期，降低成本有关键性作用。</p>
<ol start="7">
<li>当好项目经理很不容易，可以说是一个复合型人才，需要具备一定的专业技术能力、外部沟通能力、内部管理能力、问题发现能力、应急处置能力和信息化应用能力，以外部沟通能力为例，需要与政府部门、甲方代表、分包单位等各方面打交道，这方面，你有什么心得体会？（项目经理）</li>
</ol>
<p>答：比较强的外部沟通能力是项目经理综合素质中必须具备的重要能力之一，是工程项目够顺利实施的重要推动因素。作为工程项目的投资人，甲方代表就是我们施工企业的衣食父母，是我们工程实施结果和所做工作是否满意的最有发言权的评价者，不仅关系到工程预期收益目标是否能顺利实现，也关系到市场进一步的深化开拓。因此，在搞好工程安全、质量、进度的前提下，我们要在态度上尊重甲方，在业务上搞好服务配合，在彼此交往中建立信任、加深感情，成为朋友，真正做到干一项工程，交一批朋友，拓一片市场；政府部门是执法者，是市场秩序监管的主体，是工程实施结果好坏的评判者，因此，必须与政府有关部门建立良好的关系，以便在工程施工中有一个相对宽松的施工工环境；分包受总包管理，是工程具体任务更为直接的参与者和实施者，对待分包一方面加强管理，树立总包权威，一方面真诚相待，多站在对方的立场上看问题、想问题，帮助协调解决好分包遇到的实际困难，这样双方才能形成良好配合，劲往一处使，共同完成项目目标</p>
<ol start="8">
<li>在项目管理方面，你还有没有其他项目可以借鉴的好做法、好经验？（项目经理）</li>
</ol>
<p>答：1、在施工建设准备阶段，临建施工要充分考虑利用工程永久设施，最大限度的做到永临结合，节约成本。</p>
<p>2、在工程实施中，注重图纸优化工作，加强项目在优化过程中利润的获取能力。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验11</title>
      <link>https://ujava.cn/manage/project11.html</link>
      <guid>https://ujava.cn/manage/project11.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验11</source>
      <description>一、项目管理的一些经验 二、项目管理的经典法则 三、6W3H 6W3H是一个非常实用的工具，它包含了项目管理中需要考虑的重要问题。下面，我们就一一解析这些问题。 - What（什么）： 首要明确项目具体要做什么，这包括项目的目标，预期的结果，需要完成的任务等。 - Why（为什么）： 为什么要做这个项目？这个问题帮助我们明确项目背后的动机、理由和价值。...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<h2>一、项目管理的一些经验</h2>
<p>|                                                                                                                                                                                                                     |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验12</title>
      <link>https://ujava.cn/manage/project12.html</link>
      <guid>https://ujava.cn/manage/project12.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验12</source>
      <description>一、明确项目目标 在项目管理中，首先需要明确项目的目标。一个优秀的项目经理应该能够将项目目标简明扼要地表达出来，并确保所有团队成员都能够理解并致力于实现这些目标。为了明确项目目标，需要认真分析项目的背景和需求，明确项目的范围和重点，同时根据项目的实际情况制定相应的目标。 二、制定详细计划 制定详细计划是项目管理中非常重要的一环。一个好的计划不仅可以指导...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>一、明确项目目标</p>
<p>在项目管理中，首先需要明确项目的目标。一个优秀的项目经理应该能够将项目目标简明扼要地表达出来，并确保所有团队成员都能够理解并致力于实现这些目标。为了明确项目目标，需要认真分析项目的背景和需求，明确项目的范围和重点，同时根据项目的实际情况制定相应的目标。</p>
<p>二、制定详细计划</p>
<p>制定详细计划是项目管理中非常重要的一环。一个好的计划不仅可以指导项目团队的工作，还可以帮助项目经理更好地掌握项目进度和成本。在制定计划时，需要充分考虑项目的目标、任务、资源、时间等因素，制定合理、科学的计划，同时根据实际情况及时调整计划，以确保项目顺利推进。</p>
<p>三、有效沟通</p>
<p>项目管理中需要大量的沟通协调工作，包括与团队成员、利益相关者以及客户之间的沟通。一个优秀的项目经理应该具备良好的沟通技巧，能够及时解决各种沟通问题，确保项目的信息流畅，避免信息孤岛和误解。在沟通中，需要采用多种沟通方式，如会议、报告、邮件等，及时反馈信息，加强团队成员之间的协作与配合。</p>
<p>四、合理分配资源</p>
<p>项目管理中需要合理分配各种资源，包括人力、物力、财力等。一个优秀的项目经理应该能够充分了解项目的资源需求，同时根据项目实际情况进行合理分配。在资源分配时，需要考虑各种因素，如团队成员的能力和经验、项目的优先级和紧急程度等，以确保项目资源的合理利用和最大化的项目效益。</p>
<p>五、及时跟踪进度</p>
<p>项目管理中需要及时跟踪项目的进度，掌握项目的进展情况。一个优秀的项目经理应该能够制定合理的跟踪计划，及时掌握项目进展情况，发现问题及时调整计划。在跟踪进度时，需要采用多种方式，如定期会议、进度报告等，及时反馈信息，确保项目进度顺利。</p>
<p>六、应对风险</p>
<p>项目管理中会面临各种各样的风险，如何应对风险是项目管理中非常重要的一环。一个优秀的项目经理应该能够预测并分析项目中可能出现的风险，同时制定相应的应对措施。在应对风险时，需要快速反应、及时调整计划、重新分配资源等，以确保项目能够顺利进行。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验13</title>
      <link>https://ujava.cn/manage/project13.html</link>
      <guid>https://ujava.cn/manage/project13.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验13</source>
      <description>项目管理是一项复杂且需要技巧的工作，它涉及到的时间、成本、质量、风险等多个方面需要精细的协调和管理。本文将通过九个方面的总结，分享项目管理的核心心得，帮助你成为更优秀的项目经理。 一、明确项目目标，建立项目计划 首先，要明确项目的目标，这包括了解项目的具体需求、目标和预期结果。在明确目标后，需要制定详细的项目计划，包括项目的时间表、预算、资源分配等。项...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>项目管理是一项复杂且需要技巧的工作，它涉及到的时间、成本、质量、风险等多个方面需要精细的协调和管理。本文将通过九个方面的总结，分享项目管理的核心心得，帮助你成为更优秀的项目经理。</p>
<p>一、明确项目目标，建立项目计划</p>
<p>首先，要明确项目的目标，这包括了解项目的具体需求、目标和预期结果。在明确目标后，需要制定详细的项目计划，包括项目的时间表、预算、资源分配等。项目计划是项目实施的基础，也是项目管理的第一步。</p>
<p>二、合理分配资源，优化资源配置</p>
<p>在项目管理中，资源的分配和利用至关重要。这包括合理分配人力、时间、金钱和其他物质资源。同时，要根据项目的实际需求，适时调整资源分配，确保项目顺利进行。</p>
<p>三、跨部门沟通，建立协同机制</p>
<p>项目管理并不仅仅是管理团队内部的事务，它涉及到多个部门和团队之间的协同合作。因此，建立良好的沟通机制和协同工作方式是项目管理中非常重要的一环。</p>
<p>四、风险管理，未雨绸缪</p>
<p>项目实施过程中可能会遇到各种预期或未预期的风险，如技术难题、预算超支、团队成员流失等。项目经理需要提前预测并评估这些风险，并制定相应的应对措施，以确保项目能够顺利进行。</p>
<p>五、质量管理，贯穿始终</p>
<p>质量管理是项目管理的重要组成部分。从项目的初期规划到实施阶段，再到项目的收尾阶段，都需要对项目的质量进行持续的监控和管理。一旦发现质量问题，需要及时采取纠正措施。</p>
<p>六、变更管理，应对变化</p>
<p>在项目实施过程中，可能会遇到需求变更、技术变更等问题。项目经理需要制定变更管理计划，明确变更流程和责任人，以确保变更对项目的影响最小化。</p>
<p>七、团队管理，激发团队潜力</p>
<p>一个成功的项目离不开一个高效的团队。项目经理需要关注团队成员的需求和困难，通过激励和培训等方式激发团队成员的潜力，提高团队的凝聚力和执行力。</p>
<p>八、成本控制，精细化管理</p>
<p>项目管理中，成本控制也是一项重要任务。项目经理需要对项目的成本进行精细化管理，包括预算制定、成本控制、成本分析等。同时，要注重成本效益原则，寻求成本和效益的最佳平衡。</p>
<p>九、项目收尾，总结经验教训</p>
<p>最后，在项目收尾阶段，要对项目进行总结和评估，分析项目的成功经验和不足之处。同时，要根据项目实施过程中的问题和教训，不断优化和改进项目管理流程和方法。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验14</title>
      <link>https://ujava.cn/manage/project14.html</link>
      <guid>https://ujava.cn/manage/project14.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验14</source>
      <description>在软件项目经理的面试中，如何准确地描述自己的项目管理经验是一项关键技能。这不仅展示了您的专业能力，也是您对公司潜在贡献的体现。下面是一些具体的建议和技巧，帮助您在面试中更好地展示自己的项目管理经验。 首先，您需要清晰地阐述您过去负责的项目。这包括项目的规模、复杂性、预算和团队规模等。通过具体的数据和事实，让面试官了解您所面对的挑战和所取得的成就。例如，...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>在软件项目经理的面试中，如何准确地描述自己的项目管理经验是一项关键技能。这不仅展示了您的专业能力，也是您对公司潜在贡献的体现。下面是一些具体的建议和技巧，帮助您在面试中更好地展示自己的项目管理经验。</p>
<p>首先，您需要清晰地阐述您过去负责的项目。这包括项目的规模、复杂性、预算和团队规模等。通过具体的数据和事实，让面试官了解您所面对的挑战和所取得的成就。例如，您可以说：“在我之前的工作中，我负责了一个价值百万美元的软件开发项目，团队规模达到了20人，项目的目标是在六个月内交付。”</p>
<p>其次，突出您在项目管理中所采取的方法论。是否采用了敏捷开发、瀑布模型或其他项目管理方法？您是如何根据项目的实际情况调整和优化项目管理流程的？例如，您可以分享：“在这个项目中，我采用了敏捷开发的方法，每周进行一次迭代，确保项目能够灵活应对需求变更和意外情况。”</p>
<p>接下来，讲述您在项目中遇到的困难和挑战，以及您是如何克服这些困难的。这能够展示您的问题解决能力和应变能力。例如，您可以描述：“在项目执行过程中，我们遇到了一个技术难题，导致项目进度严重滞后。为了解决这个问题，我组织了一次技术攻关会议，邀请了行业内的专家参与讨论，最终成功解决了这个问题。”</p>
<p>此外，强调您在团队管理和沟通方面的能力。项目管理不仅仅是技术层面的工作，更重要的是如何带领团队、协调资源、确保项目的顺利进行。您可以分享：“在项目中，我注重团队建设和沟通协作。我定期组织团队会议，了解每个成员的工作进展和困难，及时提供支持和帮助。同时，我也与项目干系人保持密切沟通，确保项目需求能够准确传达给团队。”</p>
<p>在描述项目管理经验时，您还可以突出您的风险管理能力。这包括如何识别项目中的潜在风险、制定风险应对策略以及监控风险的变化。例如，您可以说：“在项目开始之前，我进行了全面的风险评估，识别出了可能出现的技术难题、人力资源不足等问题。针对这些风险，我制定了相应的应对策略，并在项目执行过程中密切关注风险的变化，确保项目能够按计划进行。”</p>
<p>最后，展示您在项目中所取得的成果和贡献。这可以是项目的成功交付、客户的好评、团队的成长等。通过具体的成果和数据，让面试官了解您的项目管理能力对项目成功的重要性。例如，您可以总结：“通过我和团队的共同努力，这个项目最终成功交付，并得到了客户的高度评价。在这个过程中，我们团队的凝聚力和执行力也得到了很大的提升。”</p>
<p>总之，在描述项目管理经验时，要注重具体性、逻辑性和条理性。通过清晰、简洁的语言，将您的项目管理经验生动地展现出来，让面试官对您的能力和专业性产生深刻的印象。同时，要保持自信、真诚和热情的态度，让面试官感受到您对软件项目经理这个职位的热情和期待。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验15</title>
      <link>https://ujava.cn/manage/project15.html</link>
      <guid>https://ujava.cn/manage/project15.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验15</source>
      <description>对于项目管理人员来说，如何进行有效的项目管理，提高项目的效率是一个值得关注和探讨的问题。 1、WBS 工作分解结构（简称 WBS）是把整个项目逐层分解到较小的、便于管理的要素：可交付成果。 项目分解成任务，任务再分解成一项项工作。即：项目→任务→工作。工作分解结构以可交付成果为导向，对项目要素进行分组，它归纳和定义了项目的整个工作范围，每向下分解一层代...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>对于项目管理人员来说，如何进行有效的项目管理，提高项目的效率是一个值得关注和探讨的问题。</p>
<p><strong>1、WBS</strong></p>
<p>工作分解结构（简称 WBS）是把整个项目逐层分解到较小的、便于管理的要素：可交付成果。</p>
<p>项目分解成任务，任务再分解成一项项工作。即：项目→任务→工作。工作分解结构以可交付成果为导向，对项目要素进行分组，它归纳和定义了项目的整个工作范围，每向下分解一层代表对项目工作的更详细定义。<br>
</p>
<p>WBS 处于规划过程的中心，也是制定进度计划、资源需求、成本预算、风险管理计划和采购计划等的重要基础。<br>
</p>
<p><strong>2、项目甘特图</strong></p>
<p><strong>拯救你的项目进度计划。</strong></p>
<p>甘特图能够清晰地反映各项任务之间的关系以及每项工作的完成进度，简单且便于编制，管理者可以通过甘特图快速、直观地弄清项目的剩余任务，评估工作进度，在项目管理中被广泛应用。</p>
<p>甘特图包含以下三个含义：</p>
<p>1、以图形或表格的形式显示活动；</p>
<p>2、通用的显示进度的方法；</p>
<p>3、构造时含日历天和持续时间，不将周末节假算在进度内。</p>
<p><strong>3、抓住关键问题</strong></p>
<p>**项目可分为启动、规划、执行、监控、收尾等等不同的阶段，**每个阶段需要明确关键目标，锁定核心问题。作为项目经理，需要把控三点：</p>
<p>（1）驱动管理节点，紧盯目标，这个目标是宏观的目标，包括业务目标、进度目标、人员目标。</p>
<p>（2）保障沟通通道，保障信息传达的有效性，步调一致，协调各团队有效参与。</p>
<p>（3）运用管理机制，包括目标负责制、沟通机制、需求管理机制等。</p>
<p><br>
<strong>4、建立全员风险管理意识</strong></p>
<p>建立和运用机制持续聚焦项目目标、方案、进度（计划），促成高效执行。同时要发掘和同步风险，准备预案以降低和消除风险危害。</p>
<p>风险在每一个启动的项目里是长期存在的，因此，识别、反馈和处理风险也是持续要做的工作。在项目中一定要建立全员风险管理的意识，鼓励团队成员及时识别和处理风险。</p>
<p><strong>5、建立项目管理的知识体系</strong></p>
<p>2023年PMP考试加入了《PMBOK指南第七版》涉及的范围没有变，考试内容发生整合，<strong>由五大过程组启动、规划、执行、监控、收尾变为三大模块，且敏捷内容增加到50%</strong></p>
<p>过程: 启动，规划，执行，监控，收尾</p>
<p>人员: 人员沟通，团队管理</p>
<p>商业环境: 可行性分析Q，法律法规</p>
<p>解项目管理的知识并掌握基础概念是建立项目管理知识体系的重要一步。小骐为大家分享一本书，PMP的教材《PMBOK指南》。</p>
<p>《PMBOK指南》（Project Management Body of Knowledge）是由项目管理协会（PMI）发布的一本权威性的项目管理标准，其中包含了项目管理的核心概念、流程和最佳实践。</p>
<p>通过阅读《PMBOK指南》等相关书籍，学习项目管理的基础概念，包括项目生命周期、项目过程组、知识领域等。这将为你提供项目管理的框架和理论基础。****</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验16</title>
      <link>https://ujava.cn/manage/project16.html</link>
      <guid>https://ujava.cn/manage/project16.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验16</source>
      <description>管理项目相关方，最重要的一点就是要协调不同相关方之间的利益。 利益决定立场：对任何一个相关方，不要首先关注其立场，而要首先关注其利益。他之所以有这样或那样的立场，那是因为他有这样或那样的利益。 我们很容易犯一个错误，就是过分关注自己的利益，有过分关注别人的立场。 我们要改一下，既要关注自己的利益，也要关注别人的利益，要通过关注别人的利益来关注别人的立场...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<h2><strong>管理项目相关方，最重要的一点就是要协调不同相关方之间的利益。</strong></h2>
<p><strong>利益决定立场</strong>：对任何一个相关方，不要首先关注其立场，而要首先关注其利益。他之所以有这样或那样的立场，那是因为他有这样或那样的利益。</p>
<p>我们很容易犯一个错误，就是过分关注自己的利益，有过分关注别人的立场。</p>
<p>我们要改一下，既要关注自己的利益，也要关注别人的利益，要通过关注别人的利益来关注别人的立场。</p>
<p>协调相关方之间的利益，可以从三方面入手：</p>
<p><strong>1、引导相关方的期望</strong></p>
<p>合理的期望，防止他们他们对项目的期望太高，做项目的最终目的是让相关方满意。相关方对项目的满意度又取决于他们实际得到的除以他们期望的，在项目范围说明书中，最重要的内容就是“项目除外工作”，即本项目必须不做的工作，明确告诉别人本项目必须不做什么。</p>
<p><strong>2、注意相关方的利益关系</strong></p>
<p>可以用利己和利人这两个维度来看某件事是否应该做：如果利己也利人，必须做；利己不利人，尽量不做；利己不利人也不害人，可以做；首先要寻找共同利益，共同利益是指同一个利益，即使我想要的，也是他想要的，其次要寻找他们之间的利益联系，利益联系是指两个相关联的利益，如果我实现了我的利益，他就能够实现他的利益，最后才关注他们之间的利益冲突，利益冲突是此消彼长的两个利益，如果我赢了，他就自然会输。这三者的顺序不能搞反了，即不能首先关注利益冲突。</p>
<p><strong>3、考虑多种多样的利益</strong></p>
<p>物质或经济利益</p>
<p>获得了愉悦的心情，获得了新的人生感悟，实现了心灵成长，改善了让人际关系，提升了个人信誉，更好的融入了项目管理职业群体，更好的融入了团队，这七种都是非物质或经济利益。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验17</title>
      <link>https://ujava.cn/manage/project17.html</link>
      <guid>https://ujava.cn/manage/project17.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验17</source>
      <description>在现代企业中，多项目并行管理已成为常态，有效的进度管理是确保项目成功的关键。明确目标、合理分配资源、有效沟通是实现高效进度管理的核心要素。尤其是在资源有限的情况下，如何在多个项目之间进行优先级排序和资源调配，成为了项目经理必须面对的挑战。本文将深入探讨多项目进度管理的策略与技巧，帮助项目经理更好地掌控项目进度，提升整体工作效率。 img_12.pngi...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<blockquote>
<p>在现代企业中，<strong>多项目并行管理已成为常态</strong>，有效的进度管理是确保项目成功的关键。<strong>明确目标、合理分配资源、有效沟通</strong>是实现高效进度管理的核心要素。尤其是在资源有限的情况下，如何在多个项目之间进行优先级排序和资源调配，成为了项目经理必须面对的挑战。本文将深入探讨多项目进度管理的策略与技巧，帮助项目经理更好地掌控项目进度，提升整体工作效率。</p>
</blockquote>
<figure><figcaption>img_12.png</figcaption></figure>
<h3>一、明确项目目标与优先级</h3>
<p>明确项目目标是进度管理的第一步。每个项目都有其独特的目标和预期成果，项目经理需要在项目启动阶段与相关利益相关者进行深入沟通，确保所有人对项目目标有一致的理解。<strong>项目目标的清晰度直接影响到后续的进度安排和资源分配</strong>。</p>
<p>在确定目标后，项目经理需要对多个项目进行优先级排序。<strong>优先级排序可以基于项目的紧急性、重要性及资源需求等因素</strong>。例如，某些项目可能由于市场需求的变化而需要优先完成，而另一些项目则可以适当延后。通过合理的优先级排序，项目经理能够更有效地分配资源，确保关键项目按时完成。</p>
<h3>二、合理资源分配与调度</h3>
<p>资源是项目成功的关键因素之一。在多项目管理中，项目经理需要对团队成员、资金、设备等资源进行合理的分配与调度。<strong>资源的合理分配不仅能提高工作效率，还能降低项目风险</strong>。</p>
<p>在资源分配时，项目经理应考虑团队成员的技能与经验，确保将合适的人才分配到合适的项目中。此外，项目经理还需要定期评估资源使用情况，及时调整资源分配策略，以应对项目进展中的变化。例如，当某个项目进展缓慢时，项目经理可以考虑从其他项目中调配资源，以加快进度。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验18</title>
      <link>https://ujava.cn/manage/project18.html</link>
      <guid>https://ujava.cn/manage/project18.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验18</source>
      <description>01把握好项目的五个阶段 一般来说，项目管理分成启动、计划、实施、控制和收尾五个阶段，每个阶段都有一些要点值得项目经理重点关注。做到知己知彼，能让我们的管理工作更有章法。 1、启动阶段三件事儿： 第一，澄清项目目标，找准项目背后的问题所在; 第二，找准项目干系人，特别是潜在的支持者和反对者，团结一切可以团结的力量; 第三，风险评估，结合公司内外部的环境...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<p><strong>01把握好项目的五个阶段</strong></p>
<p>一般来说，项目管理分成启动、计划、实施、控制和收尾五个阶段，每个阶段都有一些要点值得项目经理重点关注。做到知己知彼，能让我们的管理工作更有章法。</p>
<p>1、启动阶段三件事儿：</p>
<p>第一，澄清项目目标，找准项目背后的问题所在;</p>
<p>第二，找准项目干系人，特别是潜在的支持者和反对者，团结一切可以团结的力量;</p>
<p>第三，风险评估，结合公司内外部的环境，做出风险预案。</p>
<p>2、计划阶段三件事儿：</p>
<p>第一，组建项目的核心小组，成员要能满足项目对于经验、技能和资源的要求。</p>
<p>第二，完成任务分解，跟据“横向到边，纵向到底”的原则，使项目的颗粒度足够分解到个人或小组可完成、可测量的程度。</p>
<p>第三，设置进度安排，为各项任务设定责任人、完成时间并匹配所需资源。特别提醒注意的是，项目经理要有从公司外部整合资源(人及财物)，以及适当“外包”项目工作的意识，要有超越公司边界的全局意识。</p>
<p>3、实施阶段三件事儿：</p>
<p>第一，带好团队，通过基于事和基于人的方式对团队进行激励;</p>
<p>第二，管理项目进度，通过会议、文档及相关的项目管理工作，使项目有序推进;</p>
<p>第三，处理好沟通协作的问题，特别是跨部门、跨部门的沟通问题，争取让各方都能在协作中实现各自价值。这里我想特别提醒一下，协作的基础是价值共享，项目经理要争取让协作各方能够获得或物质、或荣誉、或情感上的回报，这样的协作关系才持久。</p>
<p>4、控制阶段三件事儿：</p>
<p>第一，识别计划的偏离，判断变化影响的是任务还是目标，因势而变。第二，用好控制工作，包括费用表、人员负载量表等，使项目资源与项目进度相匹配。第三，设定并管理项目的里程碑，通过不断实现“小”的胜利，来实现项目“大”的成功。</p>
<p>5、收尾阶段三件事儿：</p>
<p>第一，总结汇报，通过有效的形式呈现项目成果，并做完整交付。</p>
<p>第二，项目复盘，要深入分析项目目标、项目里程碑与最终成果之间的差距，分析得失，固化经验。</p>
<p>第三，项目知识管理，不单单是资料留存，更重要的是知识流转和应用。</p>
<p>当然，每个阶段要做的工作远不止三件儿。这里主要是为了方便大家理解和记忆，做了一些甄选。好的项目经理，不需要死记硬背这些内容，因为这些要点已经融入到了他的全盘工作计划中。</p>
<p><strong>02清醒认识项目管理与传统管理的区别</strong></p>
<p>项目管理与传统管理有很多相同之处，也有一些独特的地方值得我们注意，着重提示三点：</p>
<p>1、要明确项目经理的权利边界</p>
<p>不同的公司，项目经理的权利大小真的会有天壤之别。但多数情况下，项目经理拥有的是“虚线”权利，即组织、协调的权利，并不能直接决定团队成员的绩效、薪资乃至升迁。在这样的情况下，建议项目经理一方面向公司争取自己的权利资源，为自己的团队激励手段增添砝码;另一方面，通过个人影响力、通过成果共享、荣誉共享等软性因素来带领团队。</p>
<p>2、要注意项目管理中的“柔性”</p>
<p>通常来说，越是复杂的项目，成员的多样性就越强。这就要求项目管理在带团队的时候，能因人而异地情境式领导。好的项目经理，往往要能够容忍一定的模糊性。</p>
<p>3、要注意与职级高于自己的团队成员处理好工作关系</p>
<p>越来越多的企业推行P族和M族的职业发展双通道，这就导致很有可能出现低层级的项目经理带领高层级的专业人才的现象。所谓术业有专攻，项目经理要对自己有信心，用平等、平和的心态与团队成员相处。</p>
<p><strong>03项目经理的“蜕变”</strong></p>
<p>稚嫩——善用项目管理工具(如流程、表单、协同办公软件等)，但又不拘泥于工具。工欲善其事必先利其器，用好工具能让项目工作事半功倍。项目经理之于工具，要看到工具背后的价值和意义，让工具作为管理的辅助，而不是为了显示专业。</p>
<p>成熟——善于将工作模块化分工，使合适的人做合适的工作，并让项目成员有相对独立的成就感。分工是管理技能的核心，很多项目经理只是单纯地将工作分下去，而不考虑人员匹配的问题，更不考虑成员个体感受的问题。员工成就感是现在80后、90后管理的一个核心点，项目经理要通过合理分工(工作有衔接但又相对独立)来在项目进行中为成员“设计”成就感。</p>
<p>卓越——能够抓住工作主线的项目管理能力。做项目都知道有个概念叫“关键路径”，其实从管理的角度就是抓主要矛盾，抓关键问题。多数情况下，项目经理不需要做很多很细节的工作，但是他要能为团队：争取关键资源;在复杂决策前敢于拍板;能够对重要风险有提前预警的能力。</p>
<p>这些能力的获得，往往需要长时间的项目磨砺。职场中的每个人，如果不是项目经理，那么就一定是一个或若干个项目的团队成员。了解并掌握项目管理的核心要素，将有助于我们不断提升职业化的工作能力，并不断创造新的价值。</p>
<p><strong>04成功的项目管理必备七大秘诀</strong></p>
<p>1、坚强的领导核心</p>
<p>作为一个项目部，项目经理理所当然地居于管理的核心位置，他的组织、管理、沟通及协调能力，甚至人格魅力都是极为重要的。一个项目的成败，可以说项目经理起到了决定性作用，因为他是统领项目的最高决策者。一个具有全局眼光、高屋建瓴的领导者，能在千头万绪中抓住要害，关注重点，又能对下充分授权，抓大放小。</p>
<p>一个项目仅有强悍的项目经理是不够的，项目班子成员紧密团结在项目经理周围，方可确保令出一致、禁行令止、互为支持。项目班子既要讲民主，大事一起商量，开诚布公，不独断，不专行;同时，也要讲集中，在充分调查事实、协调各方意见的情况下，进行意见的统一。</p>
<p>所以说，组成一个坚强的项目管理班子，是成功的项目管理的关键要素。</p>
<p>2、成功的团队建设</p>
<p>一个项目部管理人员多则上百人，少则数十人，共同组成一个项目管理团队。项目管理部，实际上是一个临时机构，它随着项目的开工而成立，随着项目的完工而解散，中间不断有人抽调而走，也有补充进来，人际关系的变幻、工作内容的更迭时刻都在发生。</p>
<p>工程自身的特性注定了项目管理的艰苦、枯燥，再加之繁重的工作任务、巨大的精神压力，情绪压抑很普遍，由此项目的人性化管理就显得非常重要。它需要营造一个快乐的工作氛围，通过组织各类活动，比如旅游、球类比赛、演讲比赛、文艺演出等，甚至不时的项目聚餐，以充分发挥特别是年青管理人员的才华，缓解紧张情绪，加强项目凝聚力，提升项目战斗力。这些活动，做为项目领导班子，不但要大力提倡和支持，还应该尽可能地参加，其效果是很明显的。</p>
<p>3、前瞻的管理策划</p>
<p>“项目不是在结束时失败，而是在开始时失败”，由此说明项目管理策划的重要性。</p>
<p>项目管理策划应该在项目成立之初展开，一般包括管理目标、管理模式、组织架构、项目经理授权、总进度计划、现场管理人员流量、分包方案、物资采购方案、施工机械及监测设备配置方案、办公设备配置计划、现场临建方案、临水临电方案、总平面布置计划、主要技术方案、现场作业人员流量、资金流量计划及预算成本等十几个方面。</p>
<p>项目管理策划由项目部配合总部机构联合编制，应切合实际，科学合理，具有可操作性。策划经内部审批后，进行项目全体管理人员交底，做到人人熟知，自觉执行，贯彻落实。实施过程中，不断对照检查，及时纠偏，确保大方向不错，大目标不偏。</p>
<p>4、严格的制度考核</p>
<p>1、包括对项目内部管理制度，比如各项例会制度、岗位责任制、人员考核制度及内部工作流程等;</p>
<p>2、包括工期、质量、安全、文明施工等方面的具体考核办法，比如对工期，在确定各节点目标时，应与分包商签订目标责任状，约定奖罚额度，严格进行过程和节点考核，并及时兑现;</p>
<p>3、还应建立专项总包和分包管理制度，明确总、分包管理职责，管理流程和管理要求等。</p>
<p>大多数企业都制定有各项项目管理制度，但不能原封照搬。每个项目都有其自身的特点，在制订各项制度时应结合自身情况予以调整，甚至很多制度需重新或自创制定。</p>
<p>5、谨慎的分包选择</p>
<p>一般的劳务公司没有相应的管理机构，更谈不上管理，也没有相对固定的熟练工人，法律债务的执行能力很差，遇到劳资纠纷或工伤纠纷就采取回避、躲藏或推诿的方式，将总承包商推到前面。</p>
<p>因此，大多数公司选择长期合作的分包队伍，但是这样的队伍是很有限的。随着公司合同额的急剧增大，承接的项目越来越多，原有的分包远远满足不了工程的需要，出现了分包乱拉工人、找临时工的情况，对工程进度、质量等方面的管理造成不良影响。</p>
<p>为此，总承包商尝试引进新的队伍，寻求扩大分包选择空间。但是，由于对新队伍了解不深，加之这些队伍良莠不齐，对比原有的队伍反而感觉有较大差距，甚至有些队伍中途撒手不干，直接导致总承包商不敢大胆使用，成为目前不少建筑企业遇到的两难问题。</p>
<p>所以，这需要从公开招投标、履约保证金的交纳、劳务来源的控制、实名制的推行、工人工资的发放等方面加强管理，以降低管理风险。</p>
<p>6、有力的技术保障</p>
<p>面对超大、复杂的结构，强有力的技术保障尤为重要。</p>
<p>比如：</p>
<p>1)国家大剧院整个网壳结构的预起拱控制，以确保网壳曲线、弧度等最终符合设计要求;</p>
<p>2)央视新址两个巨大的悬臂钢结构，如何进行预起拱及确保准确合龙的问题;</p>
<p>3)国家体育场大量不规则的异型钢结构的加工制作和安装问题;</p>
<p>4)昆明新机场七条巨型钢彩带弯扭构件的加工制作及安装问题等。</p>
<p>所以，项目部必须配备足够的技术管理人员，由一名经验丰富、坚毅干练的带头人负责，进行大量繁杂、细致的技术工作。还得做好零碎、繁琐的事，比如图纸、测量、试验、资料及深化设计等，做为技术负责人必须时刻关注这些问题，安排合适、胜任的人员，并要有较强的预见性和计划性，通过技术例会制度进行布置、落实及检查，避免意外问题发生，以造成不良影响和不必要的损失。</p>
<p>7、有效的风险控制</p>
<p>1)对于合同风险，主要通过耐心、细致的合同谈判工作尽量加以避免，对明显不合理、不公平的条款需做大量的说服工作，对于每项条款都应仔细分析、推敲，避免合同重大误解和陷阱。</p>
<p>2)对于工期风险，往往是因为投标时由业主规定且必须响应招标文件形成的。这些严重压缩的工期，还经常伴随着巨额的延期处罚。面对这种情况，一方面需要强有力的施工组织，先强内功，确保工程顺利推进;另一方面，利用不可抗力因素、工程款支付及非承包商自身原因，加强工期索赔。最为关键的是，利用工程进展顺利的有利形势，营造双方融洽的氛围，不失时机地签订工期补充协议，或重新确定业主认可的工期节点目标，以化解工期风险。</p>
<p>3)对于质量风险，有些业主不切实际地确定过高的质量目标，由于工程自身条件限制而难以达到，合同中却约定了较大额度的奖罚。面对这样的问题，应切实抓好工程质量，争取本应可取得的质量奖项，避免因质量问题在结算时受到制约。同时，也要耐心向业主解释，取得谅解，同意降低质量获奖目标。</p>
<p>4)安全风险是一个较为严峻的问题，很多地区制定了专门针对建筑企业因死亡事故要求退出当地建筑市场或停止一定时间投标的规定，且当前对工人的伤亡赔偿额与日俱增，一旦发生安全事故对于一个项目、一个企业可能都是致命的打击。因此，加强安全防范、加大安全投入、杜绝死亡事故的发生是规避安全风险的当务之急。</p>
<p>5)成本风险是每个项目必须面对的切实问题，激烈的市场竞争，普遍的低价中标，不规范的业主行为，加剧了成本风险。针对成本风险，应逐项认真分析，采取切实可行的开源节流方法。对亏损项目，可从分包竞标、材料公开招标方面低价选择，严格控制成本支出。同时，运用设计变更或改变做法等方式，是避免亏损的有效途径。</p>
<p>6)劳务风险也是一个不可忽视的问题。选择一个实力雄厚、管理有序、讲求信誉的劳务分包，可有效降低工期、质量及安全管理等带来的风险。工人工资发放、工伤赔偿纠纷等问题，已经成为近年来社会、政府关注的焦点，必须引起高度重视，应在劳动合同签订、实名制落实、劳资发放监控、工人上访有效管理等方面加大管理力度，建立规则制度和预案，由专人负责日常管理，成立突发事件处理小组，才能较好地控制劳务风险。</p>
<p>总之，一个成功的项目管理，还有其他很多方面需要借鉴。项目管理是一项繁重、艰苦的工作，需要付出大量的心血、智慧和汗水，期盼通过广大工程建设者的不懈努力，不断总结，相互交流，将项目管理水平推向前进。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验19</title>
      <link>https://ujava.cn/manage/project19.html</link>
      <guid>https://ujava.cn/manage/project19.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验19</source>
      <description>1. 为大型任务制定工作计划表 如果你的团队经常承担某种特定的通用任务，那么你就需要为这些任务开发一个活动检查列表和工作计划表。每个检查列表应该包括这个大任务可能需要的所有步骤。这些检查列表和工作表将帮助小组成员确定和评估与他必须处理的大型任务相关的工作量。 2. 将培训时间放到计划中 确定你的团队成员每年在培训上花费多少时间，并把它从组员工作在指定任...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<h3>1. 为大型任务制定工作计划表</h3>
<p>如果你的团队经常承担某种特定的通用任务，那么你就需要为这些任务开发一个活动检查列表和工作计划表。每个检查列表应该包括这个大任务可能需要的所有步骤。这些检查列表和工作表将帮助小组成员确定和评估与他必须处理的大型任务相关的工作量。</p>
<h3>2. 将培训时间放到计划中</h3>
<p>确定你的团队成员每年在培训上花费多少时间，并把它从组员工作在指定任务上的可用时间中，减去。你可能在平均值中早已经减去了休假时间、生病时间和其他时间，对于培训时间也要同样处理。</p>
<h3>3. 把任务分解为“英寸大小的小圆石”</h3>
<p>“英寸大小的小圆石”是缩小了的里程碑。把大任务分解成多个小任务，帮助你更加精确的估计他们，暴露出在其他情况下你可能没有想到的工作活动，并且保证更加精确、细密的状态跟踪。</p>
<h3>4. 在质量控制活动后应有修改工作</h3>
<p>几乎所有的质量控制活动，如测试和技术评审，都有发现缺陷或其他提高的可能。你的项目进度或工细分结构。应该把每次质量控制活动后的修改，作为一个单独的任务包括进去。</p>
<h3>5. 为“过程改进”安排时间</h3>
<p>如果你想把自己的团队提升到一个更高的软件工程能力水平，就必须在“过程改进”上投入更多的时间。可以从项目进度中留出一些时间，因为软件项目活动应该包括能够使你下一个项目更加成功的过程改进。不要把团队成员的可利用时间100%投入到项目任务中，这样会很大程度上限制他们的能力提升。</p>
<h3>6. 管理项目的风险</h3>
<p>如果你主动去识别和控制风险，那么他们就会控制你。在做项目计划时，花一些时间集中讨论可能的风险因素，评估他们的潜在危害，并且决定如何减轻或预防它们。</p>
<h3>7. 定义项目成功的标准</h3>
<p>在项目的开始，要确保各方对于判断项目是否成功有统一的认识。通常，按照进度完成项目时唯一明显的成功要素，但肯定还有其他的因素存在。比如，实现指定的销量、增加市场占有率、获得特定用户的认可、淘汰一个高维护需求的遗留系统等。</p>
<h3>8. 把握不同要求之间的平衡</h3>
<p>每个项目都需要平衡它的功能、人员、预算、进度和质量目标。我们把以上五个项目方面中的每一个方面，综合成一个约束条件，你必须在这个约束中进行操作：你可以定义成与项目成功对应的驱动力，或者定义成通向成功的自由程度。</p>
<h3>9. 公开、公正的跟踪项目动态</h3>
<p>项目经理要营造良好的风气，让项目成员对准确的报告项目的状态感到安全，努力让项目在准确的、基于数据的事实基础上运行，而是因为害怕报告坏消息对项目状态刻意美化。</p>
<h3>10. 沟通承诺</h3>
<p>千万不要向别人承诺明知不可能做到的事情，要坦诚的与客户和管理人员沟通项目实际成果，这样才能更好地获取他们的理解和更有力的支持。</p>
<h3>11. 项目100%做完，才算完成</h3>
<p>把任务分解为“英寸大小的小圆石”的一个好处是：你可以区分每个小任务到底是不是完成了。这比估计一个大任务在某个时间点完成多少百分比要实在的多。</p>
<h3>12. 定义产品发布标准</h3>
<p>你可以将发布标准基于：还存在有多少个高优先级的缺陷、性能度量、特定功能完全可操作，或其他方面表明项目已经达到了了它的目的。不管你选择了什么标准，都应该是可实现的、可测量的、文档化的，并且与客户所指的“质量”一致。</p>
<h3>13. 记录你的估算</h3>
<p>当你准备估算你的工作时，把它们记录下来，并且记录你是如何完成每个任务的，理解创建估算所用的假设和方法，能够使他们在必要的时候更容易防护和调整，而且它将帮助你改善你的估算过程。</p>
<h3>14. 考虑意外缓冲</h3>
<p>事情往往不会像你计划的一样顺利进行，所以你的预算和进度安排应该在主要阶段后面包括一些意外的缓冲，以适应无法预料的事件。不幸的是，你的领导或客户可能把这些缓冲当作是你的托辞，而不是明智的承认事实确实如此。</p>
<h3>15. 遵守学习曲线</h3>
<p>如果你在项目中第一次尝试新的过程、工具或技术，就必须承受短期内生产力降低的代价。不要期望第一次尝试新方法就能获得惊人的收益，在进度安排时要考虑不可避免的学习曲线。</p>
]]></content:encoded>
    </item>
    <item>
      <title>项目管理经验20</title>
      <link>https://ujava.cn/manage/project20.html</link>
      <guid>https://ujava.cn/manage/project20.html</guid>
      <source url="https://ujava.cn/rss.xml">项目管理经验20</source>
      <description>1） 项目周期估算 项目周期估算的时候必须考虑几个因素：项目成员的技术水平、职业的素养、被激励的程度。如果没有把握的话，应该尽量悲观的估计，方法是先估计正常的周期，然后乘一个系数。 2）尽早QC（质量检查） 很多时候，团队成员的技能水平往往达不到要求的目标，那么，如果等到方案阶段快要结束的时候再次检查方案的质量就太迟了，要么得到低劣粗糙基本不能用的概要...</description>
      <pubDate>Mon, 11 Nov 2024 07:04:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>1）&nbsp;项目周期估算<br>
&nbsp;&nbsp;&nbsp;项目周期估算的时候必须考虑几个因素：项目成员的技术水平、职业的素养、被激励的程度。如果没有把握的话，应该尽量悲观的估计，方法是先估计正常的周期，然后乘一个系数。</p>
<p>2）尽早QC（质量检查）<br>
&nbsp;&nbsp;&nbsp;&nbsp;很多时候，团队成员的技能水平往往达不到要求的目标，那么，如果等到方案阶段快要结束的时候再次检查方案的质量就太迟了，要么得到低劣粗糙基本不能用的概要设计，要不然准备宣布方案阶段延期。所以，在方案设计取得阶段性成果的时候就应该启动QC，并且不断QC，每一个关键的交付都应该QC（通常需求分析报告、需求规格说明书、概要设计、代码、测试案例、切换方案都需要QC）。</p>
<p>3）输出<br>
&nbsp;&nbsp;&nbsp;开发阶段的输出不仅仅是代码，还有可能有性能优化报告（针对性能需求）、配置说明（配置模块），这些应该明确的安排到WBS（工作分解结构）中进行跟踪。</p>
<p>4）模糊任务的跟踪<br>
&nbsp;&nbsp;&nbsp;在接近阶段切换的时候，有很多模糊的任务需要用CheckList跟踪，比如切换到SIT（系统集成测试）阶段时，就需要跟踪设计评审意见的落实、代码评审意见的落实情况，并且这个跟踪应该尽早，并提醒成员尽早反馈。</p>
<p>5）明确的任务<br>
&nbsp;&nbsp;&nbsp;不要给项目成员分配模糊的任务，任何任务都要有明确的输出，同样的道理，文档编写任务应该指定明确的模板。</p>
<p>6）不可控时间的预留<br>
&nbsp;&nbsp;&nbsp;有很多进度不能由PM把握，比如提交官方的TR（评审），就应该预留充足的时间，以免对项目总体进度产生恶劣影响。</p>
<p>7）测试<br>
&nbsp;&nbsp;&nbsp;系统的测试计划是必须的，测试一样要用矩阵来进行跟踪，每个功能点、每个意外情况都要跟踪起来。盲目的测试往往也可以发现问题，但更可能的遗漏掉更加重要的问题。</p>
<p>8）工作日志<br>
&nbsp;&nbsp;&nbsp;不管项目成员做了什么，都应该要求他们用工作日志记录下来。这样可以防止偷懒 😃</p>
]]></content:encoded>
    </item>
    <item>
      <title>设计脑图</title>
      <link>https://ujava.cn/synthesis/mindmap.html</link>
      <guid>https://ujava.cn/synthesis/mindmap.html</guid>
      <source url="https://ujava.cn/rss.xml">设计脑图</source>
      <description>脑图样例</description>
      <category>设计高频</category>
      <pubDate>Tue, 05 Nov 2024 06:48:40 GMT</pubDate>
      <content:encoded><![CDATA[<h2>脑图样例</h2>
]]></content:encoded>
    </item>
    <item>
      <title>组件Linux</title>
      <link>https://ujava.cn/assembly/linux.html</link>
      <guid>https://ujava.cn/assembly/linux.html</guid>
      <source url="https://ujava.cn/rss.xml">组件Linux</source>
      <description>在 Linux 系统中，有许多常用的命令用于日常操作、文件管理、系统监控、网络管理等。以下是一些常用的 Linux 命令以及它们的简单说明： 1. 文件和目录管理 ls: 列出目录内容 cd: 切换目录 pwd: 显示当前工作目录 mkdir: 创建新目录 rm: 删除文件或目录 cp: 复制文件或目录 mv: 移动或重命名文件 touch: 创建空文...</description>
      <category>设计组件</category>
      <pubDate>Tue, 05 Nov 2024 06:39:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>在 Linux 系统中，有许多常用的命令用于日常操作、文件管理、系统监控、网络管理等。以下是一些常用的 Linux 命令以及它们的简单说明：</p>
<h3>1. 文件和目录管理</h3>
<ul>
<li>
<p><strong><code>ls</code></strong>: 列出目录内容</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ls</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">            # 列出当前目录的文件和文件夹ls -l         # 列出文件的详细信息ls -a         # 列出所有文件，包括隐藏文件</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>cd</code></strong>: 切换目录</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /path/to/directory</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">  # 切换到指定目录cd ..                  # 返回上一级目录cd ~                   # 返回到用户的主目录</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>pwd</code></strong>: 显示当前工作目录</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">pwd</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">  # 显示当前所在的目录</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>mkdir</code></strong>: 创建新目录</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mydir</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">            # 创建一个名为 mydir 的目录mkdir -p parent/child  # 创建父目录及其子目录（如果父目录不存在）</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>rm</code></strong>: 删除文件或目录</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">rm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file.txt</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">           # 删除文件rm -r directory       # 删除目录及其所有内容rm -f file.txt        # 强制删除文件（无提示）rm -rf /*             # 跑路命令，慎用！！！</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>cp</code></strong>: 复制文件或目录</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">cp</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file2</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">        # 复制文件cp -r dir1 dir2       # 递归复制目录及其内容</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>mv</code></strong>: 移动或重命名文件</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">mv</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file2</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">        # 重命名文件mv file1 /path/to/dir # 移动文件到指定目录</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>touch</code></strong>: 创建空文件或更新文件时间戳</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">touch</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> newfile.txt</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     # 创建新文件或更新现有文件的时间戳</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>cat</code></strong>: 显示文件内容</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">cat</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file.txt</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">          # 显示文件内容</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>more</code>&nbsp;/&nbsp;<code>less</code></strong>: 分页查看文件内容</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">less</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file.txt</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">         # 分页查看文件内容more file.txt         # 逐页查看文件内容</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>find</code></strong>: 搜索文件</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">find</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /path</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -name</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> filename</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">      # 按名称搜索文件find /path -type d -name dir   # 搜索目录</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<h3>2. 系统管理和监控</h3>
<ul>
<li>
<p><strong><code>top</code></strong>: 实时显示系统进程信息</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">top</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         # 实时查看系统资源和进程</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>htop</code></strong>: 更友好的进程查看工具（需要单独安装）</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> htophtop</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                         # 启动 htop 进程监控工具</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>ps</code></strong>: 查看当前正在运行的进程</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ps</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> aux</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                       # 显示所有正在运行的进程ps -ef                       # 显示详细的进程信息</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>kill</code></strong>: 终止进程</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">kill</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> PID</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     # 使用进程 ID（PID）终止进程kill -9 PID                  # 强制终止进程</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>df</code></strong>: 查看磁盘空间使用情况</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">df</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -h</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        # 以人类可读的格式显示磁盘使用情况</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>du</code></strong>: 查看目录大小</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">du</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -h</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                        # 显示当前目录下所有文件和文件夹的大小du -sh folder                # 显示指定目录的大小</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>free</code></strong>: 查看内存使用情况</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">free</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -h</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                      # 以人类可读的格式显示内存使用情况</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>uptime</code></strong>: 查看系统运行时间</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">uptime</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                       # 显示系统的运行时间及负载</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>uname</code></strong>: 显示系统信息</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">uname</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -a</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     # 显示完整的系统信息</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>shutdown</code></strong>: 关闭或重启系统</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> shutdown</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -h</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> now</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">         # 立即关闭系统sudo shutdown -r now         # 立即重启系统</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>reboot</code></strong>: 重启系统</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> reboot</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                  # 重启系统</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<h3>3. 权限和用户管理</h3>
<ul>
<li>
<p><strong><code>chmod</code></strong>: 修改文件权限</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 755</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">      # 设置文件权限为 755，数字表示法使用三个数字来指定权限，每个数字表示用户、组和其他用户的权限。chmod u+x file      # 给文件的所有者添加可执行权限，字母表示法允许你使用字符来添加、移除或设置权限</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>chown</code></strong>: 更改文件所有者</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> chown</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> user:group</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">   # 更改文件的所有者和组</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>useradd</code></strong>: 创建用户</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> useradd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  usernamesudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> useradd</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -M</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> username</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> #不创建用户主目录sudo passwd username # 设置密码</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>groupadd</code></strong>: 创建用户组</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> groupadd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> groupnamesudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> usermod</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -G</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> groupname</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> username</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic"> #把用户添加到组，如果已有组会替换sudo usermod -aG groupname username #把用户附加到组，不会替换其他组，一个用户可以在多个组sudo usermod -aG sudo username #这将把用户 username 添加到 sudo 组，从而授予他们超级用户权限，非root用户执行命令可以不用sudo。sudo usermod -aG docker username  #假设安装了docker，这将把用户 username 添加到 docker 组，用户执行docker命令可以不用加sudo。</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<h3>4. 网络管理</h3>
<ul>
<li>
<p><strong><code>ping</code></strong>: 检测网络连接</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ping</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> google.com</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">              # 测试到 google.com 的连通性</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>ifconfig</code></strong>: 查看或配置网络接口（旧版本中常用）</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ifconfig</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     # 查看网络接口信息</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>ip</code></strong>: 查看或配置网络接口（新版本中推荐）</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ip</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> addr</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> show</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                 # 显示网络接口和 IP 地址</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>netstat</code></strong>: 查看网络连接和端口（需要安装&nbsp;<code>net-tools</code>）</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> net-toolsnetstat</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -tuln</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                # 查看监听的端口</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>ss</code></strong>: 查看网络连接（<code>netstat</code>&nbsp;的替代工具）</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ss</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -tuln</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                     # 查看正在监听的端口</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>curl</code></strong>: 请求网页或 API</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> http://example.com</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">      # 发送 HTTP 请求并获取网页内容</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>wget</code></strong>: 下载文件</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wget</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> http://example.com/file.zip</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">  # 下载文件</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<h3>5. 软件包管理（基于 Debian/Ubuntu 系统）</h3>
<ul>
<li>
<p><strong><code>apt</code></strong>: 管理软件包</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> update</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                   # 更新软件包列表sudo apt upgrade                  # 更新所有已安装的软件包sudo apt install package_name     # 安装软件包sudo apt remove package_name      # 删除软件包sudo apt autoremove               # 自动删除不再需要的包</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<h3>6. 文本处理</h3>
<ul>
<li>
<p><strong><code>grep</code></strong>: 搜索文本内容</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'search_term'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file.txt</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">       # 在文件中搜索关键词</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>sed</code></strong>: 文本替换</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sed</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 's/old/new/g'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file.txt</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">        # 将文件中的 old 替换为 new</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>awk</code></strong>: 文本处理工具</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">awk</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '{print $1}'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> file.txt</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">         # 打印文件的第一列</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>cut</code></strong>: 切割文本</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">cut</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">':'</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /etc/passwd</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">         # 按冒号分隔，显示第一列</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<h3>7. 压缩和解压</h3>
<ul>
<li>
<p><strong><code>tar</code></strong>: 压缩和解压 tar 包</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">tar</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -czvf</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> archive.tar.gz</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /path</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    # 压缩目录为 tar.gztar -xzvf archive.tar.gz          # 解压 tar.gz 文件</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>zip</code></strong>: 压缩 zip 包</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">zip</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -r</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> archive.zip</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /path</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">          # 压缩目录为 zip</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p><strong><code>unzip</code></strong>: 解压 zip 包</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">unzip</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> archive.zip</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">                 # 解压 zip 文件</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>组件模版</title>
      <link>https://ujava.cn/assembly/0template.html</link>
      <guid>https://ujava.cn/assembly/0template.html</guid>
      <source url="https://ujava.cn/rss.xml">组件模版</source>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
    </item>
    <item>
      <title>组件Coze</title>
      <link>https://ujava.cn/assembly/Coze.html</link>
      <guid>https://ujava.cn/assembly/Coze.html</guid>
      <source url="https://ujava.cn/rss.xml">组件Coze</source>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
    </item>
    <item>
      <title>组件Apollo</title>
      <link>https://ujava.cn/assembly/apollo.html</link>
      <guid>https://ujava.cn/assembly/apollo.html</guid>
      <source url="https://ujava.cn/rss.xml">组件Apollo</source>
      <description>思维导图 img_193.pngimg_193.png 一、概述 Apollo（阿波罗）是携程框架部门研发的开源配置管理中心，能够集中化管理应用不同环境、不同集群的配置，配置修改后能够实时推送到应用端，并且具备规范的权限、流程治理等特性。部署是区分环境的 设置不同的namespace，作用不同，类似不同的property文件 key、value对应关系...</description>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
      <content:encoded><![CDATA[<h2><strong>思维导图</strong></h2>
<figure><figcaption>img_193.png</figcaption></figure>
<h2><strong>一、概述</strong></h2>
<p>Apollo（阿波罗）是携程框架部门研发的开源配置管理中心，能够集中化管理应用<strong>不同环境、不同集群</strong>的配置，配置修改后能够<strong>实时推送到应用端，并且具备规范的权限、流程治理</strong>等特性。部署是区分环境的 设置不同的namespace，作用不同，类似不同的property文件 key、value对应关系，替换工程变量值。</p>
<p>目前Apollo在github有22.6k颗星，在官网登记的使用的公司有451家，算是很流行的配置中心的框架技术。所以接下来跟着我一起学习Apollo配置中心吧。<br>
</p>
<h2><strong>二、为什么使用配置中心</strong></h2>
<p>首先，没有配置中心之前传统的配置都是写在配置文件中，比如各种yml、perproties、xml文件。</p>
<p>写在各种文件里最大的问题在于<strong>如果需要改配置信息，需要重新部署发布应用才能生效</strong>，这是第一个问题。</p>
<p>后面为了做到动态读取配置信息，后面有人改进一下把配置信息存储在数据库的一张表，程序读取表中的配置信息，这种方式很多公司都还在使用，因为简单，而且灵活(修改配置只需要执行个SQL语句，不需要重新部署发布)。但是也不是最完美的，因为<strong>缺少了权限控制，没有管理界面进行统一配置，没有历史版本的配置信息，不支持回滚(防止误操作)</strong>。</p>
<p>实际上配置中心在市面上已经有很多，比如Nacos、Consul、spring-cloud-config、Apollo等等。</p>
<p>相对其他的，我觉得选择Apollo的原因是，界面比较美观，操作简便，部署简单，依赖较少，开箱即用。</p>
<h2><strong>三、安装部署</strong></h2>
<h3><strong>3.1 获取安装包</strong></h3>
<p>先到官网下载安装包。<br>
</p>
<p>下载后解压，如下：<br>
</p>
<h3><strong>3.2 创建数据库</strong></h3>
<p>使用MySQL数据库(版本要求:5.6.5+)。</p>
<h4><strong>3.2.1 创建ApolloPortalDB数据库</strong></h4>
<p>使用github上面的sql脚本创建ApolloPortalDB数据库，导入相关的表以及数据。<br>
</p>
<h4><strong>3.2.2 创建ApolloConfigDB数据库</strong></h4>
<p>使用github上面的sql脚本创建ApolloConfigDB数据库，导入相关的表以及数据。<br>
</p>
<h3><strong>3.3 修改配置</strong></h3>
<p>需要改一下数据库连接信息，路径在/config下。</p>
<h4><strong>3.3.1 apollo-configservice配置</strong></h4>
<p>修改apollo-configservice的数据库连接信息application-github.properties，如下：</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"># </span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">DataSource</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">url</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> jdbc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">mysql</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//192.168.0.107:3306/ApolloConfigDB?characterEncoding=utf8</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">username</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 账号</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">password</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 密码</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>3.3.2 apollo-adminservice配置</strong></h4>
<p>修改apollo-adminservice的数据库连接信息application-github.properties，如下：</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"># </span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">DataSource</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">url</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> jdbc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">mysql</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//192.168.0.107:3306/ApolloConfigDB?characterEncoding=utf8</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">username</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 账号</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">password</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 密码</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>3.3.3 apollo-portal配置</strong></h4>
<p>修改apollo-portal的数据库连接信息application-github.properties，如下：</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"># </span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">DataSource</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">url</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> jdbc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">mysql</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//192.168.0.107:3306/ApolloPortalDB?characterEncoding=utf8</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">username</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 账号</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">spring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">datasource</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">password</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 密码</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>再修改apollo-env.properties配置，这是关于环境配置的，如下：</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">local</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">http</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//localhost:8080</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">## 开发环境</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">dev</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">http</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//192.168.0.107:8080</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">## 不需要配置的环境参考</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">${</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">lpt_meta</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">}</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">配置</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">fat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">${</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">fat_meta</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">uat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">${</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">uat_meta</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">lpt</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">${</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">lpt_meta</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">}</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">pro</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">${</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">pro_meta</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>3.4 部署</strong></h3>
<p>然后把三个文件夹都上传到Linux服务器。<br>
</p>
<h4><strong>3.4.1 部署发布apollo-configservice</strong></h4>
<p>部署发布服务有顺序，首先发布apollo-configservice，直接执行scripts/startup.sh。<br>
</p>
<p>有可能会出现这个错误(我就出现了)，不用担心，实际上进程还没有结束，还在启动，我们可以到日志记录的文件夹(下图来源于startup.sh脚本)查看日志。<br>
</p>
<p>启动时间比较长，因为这个服务包括启动Eureka注册中心，需要耐心等待。观察apollo-configservice.log文件，当看到如下信息后，表示启动成功。<br>
</p>
<p>Eureka注册中心启动成功，可以打开<a href="http://192.168.0.107:8080/%E6%9F%A5%E7%9C%8B%EF%BC%9A" target="_blank" rel="noopener noreferrer">http://192.168.0.107:8080/查看：</a><br>
</p>
<h4><strong>3.4.2 部署发布apollo-adminservice</strong></h4>
<p>接着发布apollo-adminservice，直接执行scripts/startup.sh。查看日志的方式跟上面一样。启动成功后，可以看到Eureka的服务列表中多了一个服务。<br>
</p>
<h4><strong>3.4.3 部署发布apollo-portal</strong></h4>
<p>接着发布apollo-portal，直接执行scripts/startup.sh。portal是提供Web界面的服务，所以启动成功后，可以打开<a href="http://192.168.0.107:8070/%E7%99%BB%E5%BD%95web%E7%95%8C%E9%9D%A2%EF%BC%8C%E9%BB%98%E8%AE%A4%E8%B4%A6%E5%8F%B7%E5%AF%86%E7%A0%81%E6%98%AFapollo/admin%E3%80%82" target="_blank" rel="noopener noreferrer">http://192.168.0.107:8070/登录web界面，默认账号密码是apollo/admin。</a><br>
<br>
</p>
<p>到此，安装就完成了！</p>
<h2><strong>四、SpringBoot整合Apollo</strong></h2>
<p>接下来，整一个Demo(相当于java客户端)，使用SpringBoot整合Apollo，实现动态读取配置。</p>
<h3><strong>4.1 Mave依赖</strong></h3>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;com.ctrip.framework.apollo&lt;/</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;apollo-client&lt;/</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;1.1.0&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>4.2 AppId</strong></h3>
<p>在classpath路径下，创建/META-INF/app.properties文件。如下：</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"># 应用的唯一标识，后面创建工程需要用到</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">app</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">id</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">apollo</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">demo</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>4.3 Apollo Meta Server</strong></h3>
<p>其实就是配置Apollo服务器的地址。官网提供的方式有很多，我这里选其中一种比较简单的方式。在classpath路径下创建apollo-env.properties文件，配置如下：</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">dev</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">http</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//192.168.0.107:8080</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"># </span><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">fat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">http</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//apollo.fat.xxx.com</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"># </span><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">uat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">http</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//apollo.uat.xxx.com</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"># </span><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">pro</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">http</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//apollo.xxx.com</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>4.4 Environment</strong></h3>
<p>其实是配置环境，因为上面可以配置四种环境，这里配置具体选择哪个环境。这里介绍两种方式：</p>
<p>第一种通过Java System Property。<br>
</p>
<p>第二种通过配置文件。<br>
</p>
<p>到相对应的路径下创建server.properties，配置如下：</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">env</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B">DEV</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3><strong>4.5 @EnableApolloConfig</strong></h3>
<p>在启动类上加上注解@EnableApolloConfig。</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">SpringBootApplication</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//开启apollo配置</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">EnableApolloConfig</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> ApolloDemoApplication</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> static</span><span style="--shiki-light:#0184BC;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[] </span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">        SpringApplication</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">ApolloDemoApplication</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>4.6 测试类</strong></h3>
<p>这样就完成了，接下来再创建一个Controller进行测试一下。</p>
<p>代码语言：javascript</p>
<p>复制</p>
<div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" data-title="javascript" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">RestController</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> ApolloController</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    //冒号后面的是默认值</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"${configValue:default}"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> String</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> configValue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">RequestMapping</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"/apollo/getConfig"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> String</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> getConfig</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> configValue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>4.7 管理界面创建对应的配置</strong></h3>
<p>第一步，创建项目。<br>
<br>
</p>
<p>第二步，创建配置。<br>
</p>
<p>第三步，发布。<br>
</p>
<h3><strong>4.8 测试</strong></h3>
<p>启动项目apollo-demo，然后请求路径<a href="http://localhost:8888/apollo/getConfig%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%E9%A1%B5%E9%9D%A2%E3%80%82" target="_blank" rel="noopener noreferrer">http://localhost:8888/apollo/getConfig，可以看到页面。</a></p>
<p>控制台可以看到推送配置信息的日志：<br>
</p>
<h2><strong>五、架构设计</strong></h2>
<p>讲完了安装和SpringBoot整合的demo后，我们是时候探究一下原理，为什么要有三个服务，又是如何做到配置信息发布后，客户端实时获取到最新的配置的。继续往下看。</p>
<p>首先看一张官网的架构设计图。</p>
<h3><strong>5.1 基础模型</strong></h3>
<p>作者在官网上有个基础模型的架构图，忽略掉很多细节后实际上非常简单：<br>
</p>
<ol>
<li>用户在配置中心对配置进行修改并发布。</li>
<li>配置中心通知Apollo客户端有配置更新。</li>
<li>Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用。</li>
</ol>
<h3><strong>5.2 架构模块</strong></h3>
<p>如果我们把Apollo配置中心服务端展开的话，架构图如下：<br>
</p>
<p>看到这里，整个架构看起来就比较清晰了。接下来从上往下简单介绍一下：</p>
<p><strong>Portal服务</strong>：提供Web界面供用户管理配置，通过MetaServer获取AdminService服务列表（IP+Port），通过IP+Port访问AdminService服务。</p>
<p><strong>Client</strong>：实际上就是我们创建的SpringBoot项目，引入ApolloClient的maven依赖，为应用提供配置获取、实时更新等功能。</p>
<p><strong>Meta Server</strong>：从Eureka获取Config Service和Admin Service的服务信息，相当于是一个Eureka Client。主要是为了封装服务发现的细节，对Portal和Client而言，永远通过一个Http接口获取Admin Service和Config Service的服务信息，而不需要关心背后实际的服务注册和发现组件。Meta Server只是一个逻辑角色，在部署时和Config Service是在一个JVM进程中的，所以IP、端口和Config Service一致。</p>
<p><strong>Eureka</strong>：注册中心。Config Service和Admin Service会向Eureka注册服务。为了简单起见，目前Eureka在部署时和Config Service是在一个JVM进程中的。</p>
<p><strong>Config Service</strong>：提供配置获取接口。提供配置更新推送接口(基于Http long polling)。服务对象为Apollo客户端(Client)。</p>
<p><strong>Admin Service</strong>：提供配置管理接口。提供配置发布、修改等接口。服务对象为Portal。</p>
<h3><strong>5.3 配置发布后的实时推送设计</strong></h3>
<p>上面讲完各个角色的用途，那这些角色是怎么配合一起工作的呢，我们来看一张图：<br>
</p>
<p>上图简要描述了配置发布的大致过程：</p>
<ol>
<li>用户在Portal操作配置发布。</li>
<li>Portal调用Admin Service的接口操作发布。</li>
<li>Admin Service发布配置后，发送ReleaseMessage给各个Config Service。</li>
<li>Config Service收到ReleaseMessage后，通知对应的客户端(Client)。</li>
</ol>
<p>关键点在于AdminService发送ReleaseMessage给ConfigService，这一步是如何异步发送的呢，一般异步发送我们很容易想到消息队列，但是实际上我们在安装部署时并没有使用到消息队列。</p>
<p>答案在于：</p>
<ul>
<li>Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录，消息内容就是配置发布的AppId+Cluster+Namespace。</li>
<li>然后Config Service有一个线程会每秒扫描一次ReleaseMessage表，看看是否有新的消息记录。</li>
<li>Config Service如果发现有新的消息记录，那么就会通知到所有的消息监听器，监听器得到配置发布的AppId+Cluster+Namespace后，会通知对应的客户端。<br>
</li>
</ul>
<blockquote>
<p>在实现上，考虑到Apollo的实际使用场景，以及为了尽可能减少外部依赖，我们没有采用外部的消息中间件，而是通过数据库实现了一个简单的消息队列。</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>组件Disconf</title>
      <link>https://ujava.cn/assembly/disconf.html</link>
      <guid>https://ujava.cn/assembly/disconf.html</guid>
      <source url="https://ujava.cn/rss.xml">组件Disconf</source>
      <description>摘要 为了更好的解决分布式环境下多台服务实例的配置统一管理问题，本文提出了一套完整的分布式配置管理解决方案（简称为disconf[4]，下同）。首先，实现了同构系统的配置发布统一化，提供了配置服务server，该服务可以对配置进行持久化管理并对外提供restful接口，在此基础上，基于zookeeper实现对配置更改的实时推送，并且，提供了稳定有效的容...</description>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
      <content:encoded><![CDATA[<h2>摘要</h2>
<p>为了更好的解决分布式环境下多台服务实例的配置统一管理问题，本文提出了一套完整的分布式配置管理解决方案（简称为disconf[4]，下同）。首先，实现了同构系统的配置发布统一化，提供了配置服务server，该服务可以对配置进行持久化管理并对外提供restful接口，在此基础上，基于zookeeper实现对配置更改的实时推送，并且，提供了稳定有效的容灾方案，以及用户体验良好的编程模型和WEB用户管理界面。其次，实现了异构系统的配置包管理，提出基于zookeeper的全局分布式一致性锁来实现主备统一部署、系统异常时的主备自主切换。通过在百度内部以及外部等多个产品线的实践结果表明，本解决方案是有效且稳定的。</p>
<h2>技术背景</h2>
<p>在一个分布式环境中，同类型的服务往往会部署很多实例。这些实例使用了一些配置，为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理成千上百个服务实例的配置问题。</p>
<p>王阿晶提出了基于zooKeeper的配置信息存储方案的设计与实现[1], 它将所有配置存储在zookeeper上，这会导致配置的管理不那么方便，而且他们没有相关的源码实现。淘宝的diamond[2]是淘宝内部使用的一个管理持久配置的系统，它具有完整的开源源码实现，它的特点是简单、可靠、易用，淘宝内部绝大多数系统的配置都采用diamond来进行统一管理。他将所有配置文件里的配置打散化进行存储，只支持KV结构，并且配置更新的推送是非实时的。百度内部的BJF配置中心服务[3]采用了类似淘宝diamond的实现，也是配置打散化、只支持KV和非实时推送。</p>
<p>同构系统是市场的主流，特别地，在业界大量使用部署虚拟化（如JPAAS系统，SAE，BAE）的情况下，同一个系统使用同一个部署包的情景会越来越多。但是，异构系统也有一定的存在意义，譬如，对于“拉模式”的多个下游实例，同一时间点只能只有一个下游实例在运行。在这种情景下，就存在多台实例机器有“主备机”模式的问题。目前国内并没有很明显的解决方案来统一解决此问题。</p>
<h2>功能特点与设计理念</h2>
<p>disconf是一套完整的基于zookeeper的分布式配置统一解决方案。</p>
<p><strong>它的功能特点是</strong></p>
<ul>
<li>支持配置（配置项+配置文件）的分布式化管理
<ul>
<li>配置发布统一化</li>
<li>配置发布、更新统一化（云端存储、发布）:配置存储在云端系统，用户统一在平台上进行发布、更新配置。</li>
<li>配置更新自动化：用户在平台更新配置，使用该配置的系统会自动发现该情况，并应用新配置。特殊地，如果用户为此配置定义了回调函数类，则此函数类会被自动调用。</li>
</ul>
</li>
<li>配置异构系统管理
<ul>
<li>异构包部署统一化：这里的异构系统是指一个系统部署多个实例时，由于配置不同，从而需要多个部署包（jar或war）的情况（下同）。使用Disconf后，异构系统的部署只需要一个部署包，不同实例的配置会自动分配。特别地，在业界大量使用部署虚拟化（如JPAAS系统，SAE，BAE）的情况下，同一个系统使用同一个部署包的情景会越来越多，Disconf可以很自然地与他天然契合。 异构主备自动切换：如果一个异构系统存在主备机，主机发生挂机时，备机可以自动获取主机配置从而变成主机。</li>
<li>异构主备机Context共享工具：异构系统下，主备机切换时可能需要共享Context。可以使用Context共享工具来共享主备的Context。</li>
</ul>
</li>
<li>注解式编程，极简的使用方式：我们追求的是极简的、用户编程体验良好的编程方式。通过简单的标注+极简单的代码撰写，即可完成复杂的配置分布式化。</li>
<li>需要Spring编程环境</li>
</ul>
<p><strong>它的设计理念是：</strong></p>
<ul>
<li>简单，用户体验良好：
<ul>
<li>摒弃了打散化配置的管理方式[2,3]，仍旧采用基于配置文件的编程方式，这和程序员以前的编程习惯（配置都是放在配置文件里）一致。特别的，为了支持较为小众的打散化配置功能，还特别支持了配置项。</li>
<li>采用了基于XML无代码侵入编程方式：只需要几行XML配置，即可实现配置文件发布更新统一化、自动化。</li>
<li>采用了基于注解式的弱代码侵入编程方式：通过编程规范，一个配置文件一个配置类，代码结构简单易懂。XML几乎没有任何更改，与原springXML配置一样。真正编程时，几乎感觉不到配置已经分布式化</li>
</ul>
</li>
<li>可以托管任何类型的配置文件，这与[2,3]只能支持KV结构的功能有较大的改进。</li>
<li>配置更新实时推送</li>
<li>提供界面良好Web管理功能，可以非常方便的查看配置被哪些实例使用了。</li>
</ul>
<h2>详细设计</h2>
<h3>架构设计</h3>
<p><strong>专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」</strong>：<br>
</p>
<p><strong>Disconf的功能特点描述图：</strong>：<br>
</p>
<p>每个模块的简单介绍如下：</p>
<ul>
<li>Disconf-core
<ul>
<li>分布式通知模块：支持配置更新的实时化通知</li>
<li>路径管理模块：统一管理内部配置路径URL</li>
</ul>
</li>
<li>Disconf-client
<ul>
<li>配置仓库容器模块：统一管理用户实例中本地配置文件和配置项的内存数据存储</li>
<li>配置reload模块：监控本地配置文件的变动，并自动reload到指定bean</li>
<li>扫描模块：支持扫描所有disconf注解的类和域</li>
<li>下载模块：restful风格的下载配置文件和配置项</li>
<li>watch模块：监控远程配置文件和配置项的变化</li>
<li>主备分配模块：主备竞争结束后，统一管理主备分配与主备监控控制</li>
<li>主备竞争模块：支持分布式环境下的主备竞争</li>
</ul>
</li>
<li>Disconf-web
<ul>
<li>配置存储模块：管理所有配置的存储和读取</li>
<li>配置管理模块：支持配置的上传、下载、更新</li>
<li>通知模块：当配置更新后，实时通知使用这些配置的所有实例</li>
<li>配置自检监控模块：自动定时校验实例本地配置与中心配置是否一致</li>
<li>权限控制：web的简单权限控制</li>
</ul>
</li>
<li>Disconf-tools
<ul>
<li>context共享模块：提供多实例间context的共享。</li>
</ul>
</li>
</ul>
<h3>流程设计</h3>
<p><strong>运行流程详细介绍：</strong></p>
<p>与2.0版本的主要区别是支持了：主备分配功能/主备切换事件。</p>
<ul>
<li><strong>启动事件A</strong>：以下按顺序发生。
<ul>
<li>A3：扫描静态注解类数据，并注入到配置仓库里。</li>
<li>A4+A2：根据仓库里的配置文件、配置项，去 disconf-web 平台里下载配置数据。这里会有主备竞争</li>
<li>A5：将下载得到的配置数据值注入到仓库里。</li>
<li>A6：根据仓库里的配置文件、配置项，去ZK上监控结点。</li>
<li>A7+A2：根据XML配置定义，到 disconf-web 平台里下载配置文件，放在仓库里，并监控ZK结点。这里会有主备竞争。</li>
<li>A8：A1-A6均是处理静态类数据。A7是处理动态类数据，包括：实例化配置的回调函数类；将配置的值注入到配置实体里。</li>
</ul>
</li>
<li><strong>更新配置事件B</strong>：以下按顺序发生。
<ul>
<li>B1：管理员在 Disconf-web 平台上更新配置。</li>
<li>B2：Disconf-web 平台发送配置更新消息给ZK指定的结点。</li>
<li>B3：ZK通知 Disconf-cient 模块。</li>
<li>B4：与A4一样。</li>
<li>B5：与A5一样。</li>
<li>B6：基本与A4一样，唯一的区别是，这里还会将配置的新值注入到配置实体里。</li>
</ul>
</li>
<li><strong>主备机切换事件C</strong>：以下按顺序发生。
<ul>
<li>C1：发生主机挂机事件。</li>
<li>C2：ZK通知所有被影响到的备机。</li>
<li>C4：与A2一样。</li>
<li>C5：与A4一样。</li>
<li>C6：与A5一样。</li>
<li>C7：与A6一样。</li>
</ul>
</li>
</ul>
<h3>模块实现</h3>
<p>disconf-web提供了前后端分离的web架构，具体可见：<a href="https://github.com/knightliao/disconf/tree/master/disconf-web" target="_blank" rel="noopener noreferrer">https://github.com/knightliao/disconf/tree/master/disconf-web</a></p>
<p>本部分会重点介绍disconf-client的实现方式。</p>
<h4>注解式disconf实现</h4>
<p>本实现会涉及到 配置仓库容器模块、扫描模块、下载模块、watch模块，</p>
<p>使用AOP拦截的一个好处是可以比较轻松的实现配置控制，比如并发环境下的配置统一生效。关于这方面的讨论可以见<a href="https://github.com/knightliao/disconf/wiki/%E7%BB%86%E8%8A%82%E8%AE%A8%E8%AE%BA" target="_blank" rel="noopener noreferrer">这里</a>。</p>
<p>特别地，本方式提供的编程模式非常简单，例如使用以下配置类的程序在使用它时，可以直接@Autowired进来进行调用，使用它时就和平常使用普通的JavaBean一样，但其实它已经分布式化了。配置更新时，配置类亦会自动更新。</p>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">Service</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">DisconfFile</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">filename</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> &amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">redis</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">properties</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> JedisConfig</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    // 代表连接地址</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> String</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> host</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    // 代表连接port</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> port</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    /**</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     * 地址, 分布式文件配置</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     * </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     * </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">@return</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     */</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">DisconfFileItem</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">name</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> &amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">redis</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">host</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> associateField</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> &amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">host</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> String</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> getHost</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> host;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> setHost</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">String</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> host</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">host</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> host;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    /**</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     * 端口, 分布式文件配置</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     * </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     * </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">@return</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">     */</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">DisconfFileItem</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">name</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> &amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">redis</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">port</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> associateField</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> &amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">port</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&amp;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">#</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">34</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> getPort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> port;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> setPort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;--shiki-light-font-style:inherit;--shiki-dark-font-style:italic"> port</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">port</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> port;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>基于XML配置disconf实现</h4>
<p>本实现提供了无任何代码侵入方式的分布式配置。</p>
<p>ReloadablePropertiesFactoryBean继承了Spring Properties文件的PropertiesFactoryBean类，管理所有当配置更新时要进行reload的配置文件。对于被管理的每一个配置文件，都会通过 配置仓库容器模块、扫描模块、下载模块、watch模块 进行配置获取至配置仓库里。</p>
<p>ReloadingPropertyPlaceholderConfigurer继承了Spring Bean配置值控制类PropertyPlaceholderConfigurer。在第一次扫描spring bean里，disconf会记录配置文件的配置与哪些bean有关联。</p>
<p>ReloadConfigurationMonitor是一个定时任务，定时check本地配置文件是否有更新。</p>
<p>当配置中心的配置被更新时，配置文件会被下载至实例本地，ReloadConfigurationMonitor即会监控到此行为，并且通知 ReloadingPropertyPlaceholderConfigurer 对相关的bean类进行值更新。</p>
<p>特别的，此种方式无法解决并发情况下配置统一生效的问题。</p>
<h4>主备分配实现</h4>
<p>在实现中，为每个配置提供主备选择的概念。用户实例在获取配置前需要先进行全局唯一性竞争才能得到配置值。在这里，我们采用基于zookeeper的全局唯一性锁来实现。</p>
<h2>Comparisons</h2>
<p>|淘宝Diamond[2]|Disconf|比较|<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>组件Kafka</title>
      <link>https://ujava.cn/assembly/kafka.html</link>
      <guid>https://ujava.cn/assembly/kafka.html</guid>
      <source url="https://ujava.cn/rss.xml">组件Kafka</source>
      <description>简介 在大数据领域开发者常常会听到MQ这个术语，该术语便是消息队列的意思， Kafka是分布式的发布—订阅消息系统。它最初由LinkedIn(领英)公司发布，使用Scala语言编写，与2010年12月份开源，成为Apache的顶级项目。Kafka是一个高吞吐量的、持久性的、分布式发布订阅消息系统。它主要用于处理活跃的数据(登录、浏览、点击、分享、喜欢等...</description>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
      <content:encoded><![CDATA[<h2>简介</h2>
<p>在大数据领域开发者常常会听到MQ这个术语，该术语便是消息队列的意思，<br>
Kafka是分布式的发布—订阅消息系统。它最初由LinkedIn(领英)公司发布，使用Scala语言编写，与2010年12月份开源，成为Apache的顶级项目。Kafka是一个高吞吐量的、持久性的、分布式发布订阅消息系统。它主要用于处理活跃的数据(登录、浏览、点击、分享、喜欢等用户行为产生的数据)。</p>
<h3>1.消息 Message</h3>
<p>网络中的两台计算机或者两个通讯设备之间传递的数据。例如说：文本、音乐、视频等内容。</p>
<h3>2.队列 Queue(栈的特点FILO 队列FIFO)</h3>
<p>一种特殊的线性表（数据元素首尾相接），特殊之处在于只允许在首部删除元素和在尾部追加元素。入队、出队</p>
<h3>3.消息队列 MQ</h3>
<p>消息+队列，保存消息的队列。消息的传输过程中的容器；主要提供生产、消费接口供外部调用做数据的存储和获取。</p>
<h2>消息队列分类</h2>
<p>MQ主要分为两类：点对点(p2p)、发布订阅(Pub/Sub)</p>
<h3>1.共同点</h3>
<p>消息生产者生产消息发送到queue中，然后消息消费者从queue中读取并且消费消息。</p>
<h3>2.不同点</h3>
<p>p2p模型包括：消息队列(Queue)、发送者(Sender)、接收者(Receiver) ，一个生产者生产的消息只有一个消费者(Consumer)(即一旦被消费，消息就不在消息队列中)。比如说打电话。</p>
<p>Pub/Sub包含：消息队列(Queue)、主题(Topic)、发布者(Publisher)、订阅者(Subscriber)每个消息可以有多个消费者，彼此互不影响。比如我发布一个微博：关注我的人都能够看到。</p>
<h2>Kafka的特点</h2>
<p>Kafka如此受欢迎，而且有越来越多的系统支持与Kafka的集成，主要由于Kafka具有如下特性。<br>
● 高吞吐量、低延迟：Kafka每秒可以处理几十万条消息，它的延迟最低只有几毫秒。<br>
● 可扩展性：Kafka集群同Hadoop集群一样，支持横向扩展。<br>
● 持久性、可靠性：Kafka消息可以被持久化到本地磁盘，并且支持Partition数据备份，防止数据丢失。<br>
● 容错性：允许Kafka集群中的节点失败，如果Partition（分区）副本数量为n，则最多允许n-1个节点失败。<br>
● 高并发：单节点支持上千个客户端同时读写，每秒钟有上百MB的吞吐量，基本上达到了网卡的极限</p>
<h2>Kafka组成</h2>
<ol>
<li>Topic：主题，Kafka处理的消息的不同分类。</li>
<li>Broker：消息代理，Kafka集群中的一个kafka服务节点称为一个broker，主要存储消息数据。存在硬盘中每个topic都是有分区的。</li>
<li>Partition：Topic物理上的分组，一个topic在broker中被分为1个或者多个partition，分区在创建topic的时候指定。</li>
<li>Replica：数据副本，可以为保存在Kafka中的数据指定副本数，以提高数据冗余性，防止数据丢失；</li>
<li>Message：消息，是通信的基本单位，每个消息都属于一个partition</li>
</ol>
<h3>Kafka服务相关</h3>
<ol>
<li>Producer：消息和数据的生产者，向Kafka的一个topic发布消息。</li>
<li>Consumer：消息和数据的消费者，定于topic并处理其发布的消息。</li>
<li>Zookeeper：协调kafka的正常运行。</li>
<li>KRaft：Kafka的KRaft模式在2.8.0版本中被引入。从2.8.0版本开始，Kafka提供了对KRaft的支持，其中最大的变化之一就是不再依赖外部的ZooKeeper来管理Kafka的元数据。因此，如果你使用2.8.0版本或更高版本的Kafka，你将能够使用KRaft模式，无需安装和配置ZooKeeper。<br>
</li>
</ol>
<h3>Kafka架构设计</h3>
<p>一个典型的Kafka集群包含若干个生产者（Producer）、若干Kafka集群节点（Broker）、若干消费者（Consumer）以及一个Zookeeper集群或者KRaft模式。Kafka通过Zookeeper管理集群配置，选举Leader以及在消费者发生变化时进行负载均衡。生产者使用推（Push）模式将消息发布到集群节点，而消费者使用拉（Pull）模式从集群节点中订阅并消费消息。</p>
<h3>主题和分区的具体定义如下。</h3>
<p>● 主题是生产者发布到Kafka集群的每条信息所属的类别，即Kafka是面向主题的，一个主题可以分布在多个节点上。<br>
● 分区是Kafka集群横向扩展和一切并行化的基础，每个Topic可以被切分为一个或多个分区。一个分区只对应一个集群节点，每个分区内部的消息是强有序的。<br>
● Offset（即偏移量）是消息在分区中的编号，每个分区中的编号是独立的。<br>
</p>
<h2>Kafka分布式集群的构建</h2>
<p>在kafka2.0版本以前是依赖于zookeeper集群中安装<br>
·|| Kafka使用Zookeeper作为其分布式协调框架，能很好地将消息生产、消息存储、消息消费的过程结合在一起。同时借助Zookeeper,Kafka能够将生产者、消费者和集群节点在内的所有组件，在无状态的情况下建立起生产者和消费者的订阅关系，并实现生产者与消费者的负载均衡。<br>
可以看出Kafka集群依赖于Zookeeper，所以在安装Kafka之前需要提前安装Zookeeper。Zookeeper集群在前面Hadoop集群的构建过程中已经在使用，Kafka可以共用之前安装的Zookeeper集群，接下来只需要安装Kafka集群即可。<br>
</p>
<p>·|| 较新版本的 Apache Kafka（从2.8.0版本开始）引入了KRaft，这是一个内置的分布式存储 系统，用于管理Kafka的元数据信息，不再需要依赖外部的 ZooKeeper。因此，你在使用较新版本的Kafka时，不再需要单独安装和配置 ZooKeeper。<br>
在KRaft模式下，Kafka内部有自己的元数据存储，这消除了对外部 ZooKeeper 的依赖。这样做的目的是简化 Kafka 集群的维护和部署，以及提高可用性。<br>
<br>
在基于zookeeper和kraft两种集群管理机制下，200万分区数据量下的耗时比较。基于自带的KRaft，性能表现会更优。<br>
</p>
<h3>基于KRaft下的kafka安装</h3>
<p>解压压缩包</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>tar -zxvf kafka_2.12-3.6.0.tgz -C kafka</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>编辑环境变量</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>export KAFKA_HOME=/home/hadoop/kafka/kafka_2.12-3.6.0</span></span>
<span class="line"><span>export PATH=$KAFKA_HOME/bin:PATH</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>编辑配置文件server.properties<br>
文件所在路径${KAFKA_HOME}/config/kraft/server.properties<br>
该文件中几个重点参数</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>process.roles=broker,controller ##broker相当于从节点，controller相当于主节点</span></span>
<span class="line"><span>node.id=2 ##节点ID 每个节点必须唯一</span></span>
<span class="line"><span>controller.quorum.voters=1@vm02:9093,2@vm03:9093,3@vm04:9093</span></span>
<span class="line"><span>##参与主节点选举，格式(node.id)@(hostname):(port)</span></span>
<span class="line"><span>advertised.listeners=PLAINTEXT://hostname:9092 ##对外服务地址，消费者、生产者对该节点的访问</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>生成集群ID</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-storage.sh random-uuid</span></span>
<span class="line"><span>6foHn9NLQpiMAirIK7EG4A</span></span>
<span class="line"><span>##生成6foHn9NLQpiMAirIK7EG4A 的uuid</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>所有节点执行，kafka初始化</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-storage.sh format -t 6foHn9NLQpiMAirIK7EG4A -c ./$KAFKA_HOME/config/kraft/server.properties</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>所有节点执行，启动kafka</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-server-start.sh -daemon $KAFKA_HOME/config/kraft/server.properties</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>查看kafka进程</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>jps</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><figcaption>img_234.png</figcaption></figure>
<h2>使用示例</h2>
<h3>创建topic</h3>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-topics.sh --create --topic your_topic --bootstrap-server vm02:9092,vm03:9092,vm04:9092 --partitions 3 --replication-factor 2</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>注： --bootstrap-server vm02:9092,vm03:9092,vm04:9092 此处参数可以指定集群所有节点，也可以指定localhost:9092,创建的主题并不意味着后期的消费者和生产者只能指定在 localhost 节点上。这里的 --bootstrap-server 参数在创建主题时主要是为了指定初始的 Kafka 节点，它告诉 Kafka 工具在哪里查找集群的元数据。</p>
<p>后期的消费者和生产者在连接到 Kafka 集群时，会从指定的初始节点获取集群的元数据，然后与整个集群建立连接。一旦获取了元数据，消费者和生产者就可以与整个 Kafka 集群进行通信，而不仅仅限制在初始指定的节点上。因此，使用 --bootstrap-server localhost:9092 创建的主题对于后期的消费者和生产者，仍然可以在整个 Kafka 集群的任何节点上进行使用，只要它们能够连接到集群并获取到正确的元数据信息。</p>
<h3>查看已创建的topic的详细信息</h3>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-topics.sh --describe --bootstrap-server vm02:9092,vm03:9092,vm04:9092  --topic your_topic</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><figcaption>img_235.png</figcaption></figure>
<h3>修改已创建topic</h3>
<p>在官方对于alter参数的解释中，</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>--alter                                  Alter the number of partitions and     </span></span>
<span class="line"><span>                                           replica assignment. Update the       </span></span>
<span class="line"><span>                                           configuration of an existing topic   </span></span>
<span class="line"><span>                                           via --alter is no longer supported   </span></span>
<span class="line"><span>                                           here (the kafka-configs CLI supports </span></span>
<span class="line"><span>                                           altering topic configs with a --     </span></span>
<span class="line"><span>                                           bootstrap-server option).</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><a href="http://kafka-topics.sh" target="_blank" rel="noopener noreferrer">kafka-topics.sh</a> --alter选项在最新版本中已不再支持更新现有主题的配置，这意味着一旦主题被创建，就不能使用–alter选项来更改其分区数和副本分配。<a href="http://xn--kafka-configs-vm3u73ej03aci7k2e8dbkb.sh" target="_blank" rel="noopener noreferrer">可以通过使用kafka-configs.sh</a></p>
<h4>修改主题的配置参数。</h4>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-configs.sh --bootstrap-server vm02:9092,vm03:9092,vm04:9092 \</span></span>
<span class="line"><span>--entity-type topics --entity-name your_topic \</span></span>
<span class="line"><span>--alter --add-config retention.ms=86400000</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>查看topic 定义相关参数信息。</h4>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-configs.sh --bootstrap-server \</span></span>
<span class="line"><span>vm02:9092,vm03:9092,vm04:9092 \</span></span>
<span class="line"><span>--entity-type topics --entity-name your_topic --describe</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><figcaption>img_236.png</figcaption></figure>
<h4>删除已创建topic</h4>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-topics.sh --delete --topic your_topic --bootstrap-server vm02:9092,vm03:9092,vm04:9092</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4>创建生产者producer</h4>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-console-producer.sh --broker-list 192.168.56.101:9092 --topic mrt</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>场景应用示例</h2>
<p>以postgresql数据库中的public.conn_fdw表作为生产者producer身份把数据推向kafka，然后在使用kafka把数据推推向消费者数据库Oracle</p>
<h3>在postgresql数据库中创建测试数据表，</h3>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>CREATE TABLE public.conn_fdw (</span></span>
<span class="line"><span>	id int4 NULL,</span></span>
<span class="line"><span>	"name" varchar(50) NULL,</span></span>
<span class="line"><span>	age int4 NULL,</span></span>
<span class="line"><span>	city varchar(50) NULL,</span></span>
<span class="line"><span>	salary int4 NULL</span></span>
<span class="line"><span>);</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>在Oracle中创建同样的表结构</h3>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>create table SYSTEM.CONN_FDW</span></span>
<span class="line"><span>(</span></span>
<span class="line"><span>  id     NUMBER,</span></span>
<span class="line"><span>  name   VARCHAR2(50),</span></span>
<span class="line"><span>  age    NUMBER,</span></span>
<span class="line"><span>  city   VARCHAR2(50),</span></span>
<span class="line"><span>  salary NUMBER,</span></span>
<span class="line"><span>  load_time timestamp default current_timestamp</span></span>
<span class="line"><span>);</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>创建主题conn_fdw</h4>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-topics.sh --create --topic conn_fdw \</span></span>
<span class="line"><span>--bootstrap-server vm02:9092,vm03:9092,vm04:9092 \</span></span>
<span class="line"><span>--partitions 3 \</span></span>
<span class="line"><span>--replication-factor 2</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>查看已经创建的主题conn_fdw</h4>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>kafka-topics.sh --describe \</span></span>
<span class="line"><span>--bootstrap-server vm02:9092,vm03:9092,vm04:9092  \</span></span>
<span class="line"><span>--topic conn_fdw</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><br>
在此图中有</p>
<h3>添加maven依赖</h3>
<p>添加相应的依赖包，以作为java代码class的支持</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>    &lt;dependency&gt;</span></span>
<span class="line"><span>      &lt;groupId&gt;org.apache.kafka&lt;/groupId&gt;</span></span>
<span class="line"><span>      &lt;artifactId&gt;kafka_2.12&lt;/artifactId&gt;</span></span>
<span class="line"><span>      &lt;version&gt;2.3.0&lt;/version&gt;</span></span>
<span class="line"><span>    &lt;/dependency&gt;</span></span>
<span class="line"><span>    &lt;dependency&gt;</span></span>
<span class="line"><span>      &lt;groupId&gt;org.postgresql&lt;/groupId&gt;</span></span>
<span class="line"><span>      &lt;artifactId&gt;postgresql&lt;/artifactId&gt;</span></span>
<span class="line"><span>      &lt;version&gt;42.2.23&lt;/version&gt; &lt;!-- 使用你的 PostgreSQL 版本 --&gt;</span></span>
<span class="line"><span>    &lt;/dependency&gt;</span></span>
<span class="line"><span>    &lt;dependency&gt;</span></span>
<span class="line"><span>      &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;</span></span>
<span class="line"><span>      &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;</span></span>
<span class="line"><span>      &lt;version&gt;1.2.3&lt;/version&gt; &lt;!-- 请使用最新版本 --&gt;</span></span>
<span class="line"><span>    &lt;/dependency&gt;</span></span>
<span class="line"><span>    &lt;dependency&gt;</span></span>
<span class="line"><span>      &lt;groupId&gt;com.oracle.database.jdbc&lt;/groupId&gt;</span></span>
<span class="line"><span>      &lt;artifactId&gt;ojdbc10&lt;/artifactId&gt; &lt;!-- 使用你的 Oracle JDBC 版本 --&gt;</span></span>
<span class="line"><span>      &lt;version&gt;19.8.0.0&lt;/version&gt;</span></span>
<span class="line"><span>    &lt;/dependency&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Kafka生产者代码</h3>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import org.apache.kafka.clients.producer.KafkaProducer;</span></span>
<span class="line"><span>import org.apache.kafka.clients.producer.Producer;</span></span>
<span class="line"><span>import org.apache.kafka.clients.producer.ProducerConfig;</span></span>
<span class="line"><span>import org.apache.kafka.clients.producer.ProducerRecord;</span></span>
<span class="line"><span>import java.sql.Connection;</span></span>
<span class="line"><span>import java.sql.DriverManager;</span></span>
<span class="line"><span>import java.sql.ResultSet;</span></span>
<span class="line"><span>import java.sql.Statement;</span></span>
<span class="line"><span>import java.util.Properties;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>public class PgKafkaProducer {</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    public static void main(String[] args) {</span></span>
<span class="line"><span>        // Kafka 配置</span></span>
<span class="line"><span>        Properties props = new Properties();</span></span>
<span class="line"><span>        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.0.0.102:9092,10.0.0.103:9092,10.0.0.104:9092");</span></span>
<span class="line"><span>        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");</span></span>
<span class="line"><span>        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // PostgreSQL 连接配置</span></span>
<span class="line"><span>        String jdbcUrl = "jdbc:postgresql://10.0.0.108:5432/postgres";</span></span>
<span class="line"><span>        String username = "postgres";</span></span>
<span class="line"><span>        String password = "postgres";</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);</span></span>
<span class="line"><span>             Statement statement = connection.createStatement()) {</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            // 查询 PostgreSQL 数据</span></span>
<span class="line"><span>            String query = "SELECT id,name,age,city,salary FROM public.conn_fdw";</span></span>
<span class="line"><span>            ResultSet resultSet = statement.executeQuery(query);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            // Kafka 生产者</span></span>
<span class="line"><span>            try (Producer&lt;String, String&gt; producer = new KafkaProducer&lt;&gt;(props)) {</span></span>
<span class="line"><span>                while (resultSet.next()) {</span></span>
<span class="line"><span>                    // 将每一行数据作为消息发送到 Kafka 主题</span></span>
<span class="line"><span>                    String key = String.valueOf(resultSet.getInt("id"));</span></span>
<span class="line"><span>                    String value = resultSet.getString("name") + "," +</span></span>
<span class="line"><span>                            resultSet.getInt("age") + "," +</span></span>
<span class="line"><span>                            resultSet.getString("city") + "," +</span></span>
<span class="line"><span>                            resultSet.getInt("salary");</span></span>
<span class="line"><span></span></span>
<span class="line"><span>                    ProducerRecord&lt;String, String&gt; record = new ProducerRecord&lt;&gt;("conn_fdw", key, value);</span></span>
<span class="line"><span>                    producer.send(record);</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        } catch (Exception e) {</span></span>
<span class="line"><span>            e.printStackTrace();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>消费者代码</h3>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>import org.apache.kafka.clients.consumer.Consumer;</span></span>
<span class="line"><span>import org.apache.kafka.clients.consumer.ConsumerConfig;</span></span>
<span class="line"><span>import org.apache.kafka.clients.consumer.ConsumerRecords;</span></span>
<span class="line"><span>import org.apache.kafka.clients.consumer.KafkaConsumer;</span></span>
<span class="line"><span>import java.sql.Connection;</span></span>
<span class="line"><span>import java.sql.DriverManager;</span></span>
<span class="line"><span>import java.sql.PreparedStatement;</span></span>
<span class="line"><span>import java.util.Collections;</span></span>
<span class="line"><span>import java.util.Properties;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>public class KafkaToOracleConsumer {</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    public static void main(String[] args) {</span></span>
<span class="line"><span>        // Kafka 配置</span></span>
<span class="line"><span>        Properties kafkaProps = new Properties();</span></span>
<span class="line"><span>        kafkaProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.0.0.102:9092,10.0.0.103:9092,10.0.0.104:9092");</span></span>
<span class="line"><span>        kafkaProps.put(ConsumerConfig.GROUP_ID_CONFIG, "conn_fdw_groupid");</span></span>
<span class="line"><span>        kafkaProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");</span></span>
<span class="line"><span>        kafkaProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        // Oracle 连接配置</span></span>
<span class="line"><span>        String jdbcUrl = "jdbc:oracle:thin:@192.168.48.1:1521:orcl";</span></span>
<span class="line"><span>        String username = "system";</span></span>
<span class="line"><span>        String password = "system";</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);</span></span>
<span class="line"><span>             PreparedStatement preparedStatement = connection.prepareStatement(</span></span>
<span class="line"><span>                     "INSERT INTO SYSTEM.CONN_FDW (id, name, age, city, salary) VALUES (?, ?, ?, ?, ?)")) {</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            // Kafka 消费者</span></span>
<span class="line"><span>            try (Consumer&lt;String, String&gt; consumer = new KafkaConsumer&lt;&gt;(kafkaProps)) {</span></span>
<span class="line"><span>                consumer.subscribe(Collections.singletonList("conn_fdw"));</span></span>
<span class="line"><span></span></span>
<span class="line"><span>                while (true) {</span></span>
<span class="line"><span>                    ConsumerRecords&lt;String, String&gt; records = consumer.poll(100);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>                    records.forEach(record -&gt; {</span></span>
<span class="line"><span>                        // 解析 Kafka 消息</span></span>
<span class="line"><span>                        String[] values = record.value().split(",");</span></span>
<span class="line"><span>                        int id = Integer.parseInt(values[0]);</span></span>
<span class="line"><span>                        String name = values[1];</span></span>
<span class="line"><span>                        int age = Integer.parseInt(values[2]);</span></span>
<span class="line"><span>                        String city = values[3];</span></span>
<span class="line"><span>                        int salary = Integer.parseInt(values[4]);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>                        // 插入到 Oracle 数据库</span></span>
<span class="line"><span>                        try {</span></span>
<span class="line"><span>                            preparedStatement.setInt(1, id);</span></span>
<span class="line"><span>                            preparedStatement.setString(2, name);</span></span>
<span class="line"><span>                            preparedStatement.setInt(3, age);</span></span>
<span class="line"><span>                            preparedStatement.setString(4, city);</span></span>
<span class="line"><span>                            preparedStatement.setInt(5, salary);</span></span>
<span class="line"><span>                            preparedStatement.executeUpdate();</span></span>
<span class="line"><span>                        } catch (Exception e) {</span></span>
<span class="line"><span>                            e.printStackTrace();</span></span>
<span class="line"><span>                        }</span></span>
<span class="line"><span>                    });</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        } catch (Exception e) {</span></span>
<span class="line"><span>            e.printStackTrace();</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>此时可以通过同时执行两段代码，在跑起来的过程中向生产者PG数据库插入以下数据库，然后到Oracle 数据库中观察数据流的流入情况。</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(1, 'John', 30, 'New York', 50000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(2, 'Alice', 25, 'Los Angeles', 60000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(3, 'Bob', 35, 'Chicago', 70000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(4, 'Eva', 28, 'San Francisco', 55000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(5, 'Mike', 32, 'Seattle', 65000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(6, 'Sophia', 29, 'Boston', 75000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(7, 'David', 27, 'Denver', 52000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(8, 'Emily', 31, 'Austin', 68000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(9, 'Daniel', 26, 'Phoenix', 58000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(10, 'Olivia', 33, 'Houston', 72000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(11, 'Liam', 24, 'Portland', 49000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(12, 'Ava', 34, 'Atlanta', 71000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(13, 'Logan', 30, 'Miami', 62000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(14, 'Mia', 28, 'Dallas', 54000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(15, 'Jackson', 29, 'Minneapolis', 67000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(16, 'Sophie', 31, 'Detroit', 59000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(17, 'William', 27, 'Philadelphia', 70000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(18, 'Emma', 32, 'San Diego', 66000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(19, 'James', 26, 'Raleigh', 63000);</span></span>
<span class="line"><span>INSERT INTO public.conn_fdw</span></span>
<span class="line"><span>(id, "name", age, city, salary)</span></span>
<span class="line"><span>VALUES(20, 'Avery', 35, 'Tampa', 71000);</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>组件Rocket</title>
      <link>https://ujava.cn/assembly/rocket.html</link>
      <guid>https://ujava.cn/assembly/rocket.html</guid>
      <source url="https://ujava.cn/rss.xml">组件Rocket</source>
      <description>简介 RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力，同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。 核心概念 Topic：消息主题，一级消息类型，生产者向其发送消息。 Message：生产者向T...</description>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
      <content:encoded><![CDATA[<h2>简介</h2>
<p>RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力，同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。</p>
<h2>核心概念</h2>
<ul>
<li>
<p><strong>Topic</strong>：消息主题，一级消息类型，生产者向其发送消息。</p>
</li>
<li>
<p><strong>Message</strong>：生产者向Topic发送并最终传送给消费者的数据消息的载体。</p>
</li>
<li>
<p><strong>消息属性</strong>：生产者可以为消息定义的属性，包含Message Key和Tag。</p>
</li>
<li>
<p><strong>Message Key</strong>：消息的业务标识，由消息生产者（Producer）设置，唯一标识某个业务逻辑。</p>
</li>
<li>
<p><strong>Message ID</strong>：消息的全局唯一标识，由消息队列RocketMQ系统自动生成，唯一标识某条消息。</p>
</li>
<li>
<p><strong>Tag</strong>：消息标签，二级消息类型，用来进一步区分某个Topic下的消息分类</p>
</li>
<li>
<p><strong>Producer</strong>：也称为消息发布者，负责生产并发送消息至Topic。</p>
</li>
<li>
<p><strong>Consumer</strong>：也称为消息订阅者，负责从Topic接收并消费消息。</p>
</li>
<li>
<p><strong>分区</strong>：即Topic Partition，物理上的概念。每个Topic包含一个或多个分区。</p>
</li>
<li>
<p><strong>消费位点</strong>：每个Topic会有多个分区，每个分区会统计当前消息的总条数，这个称为最大位点MaxOffset；分区的起始位置对应的位置叫做起始位点MinOffset。</p>
</li>
<li>
<p><strong>Group</strong>：一类生产者或消费者，这类生产者或消费者通常生产或消费同一类消息，且消息发布或订阅的逻辑一致。</p>
</li>
<li>
<p><strong>Group ID</strong>：Group的标识。</p>
</li>
<li>
<p><strong>队列</strong>：个Topic下会由一到多个队列来存储消息。</p>
</li>
<li>
<p><strong>Exactly-Once投递语义</strong>：Exactly-Once投递语义是指发送到消息系统的消息只能被Consumer处理且仅处理一次，即使Producer重试消息发送导致某消息重复投递，该消息在Consumer也只被消费一次。</p>
</li>
<li>
<p><strong>集群消费</strong>：一个Group ID所标识的所有Consumer平均分摊消费消息。例如某个Topic有9条消息，一个Group ID有3个Consumer实例，那么在集群消费模式下每个实例平均分摊，只消费其中的3条消息。</p>
</li>
<li>
<p><strong>广播消费</strong>：一个Group ID所标识的所有Consumer都会各自消费某条消息一次。例如某个Topic有9条消息，一个Group ID有3个Consumer实例，那么在广播消费模式下每个实例都会各自消费9条消息。</p>
</li>
<li>
<p><strong>定时消息</strong>：Producer将消息发送到消息队列RocketMQ服务端，但并不期望这条消息立马投递，而是推迟到在当前时间点之后的某一个时间投递到Consumer进行消费，该消息即定时消息。</p>
</li>
<li>
<p><strong>延时消息</strong>：Producer将消息发送到消息队列RocketMQ服务端，但并不期望这条消息立马投递，而是延迟一定时间后才投递到Consumer进行消费，该消息即延时消息。</p>
</li>
<li>
<p><strong>事务消息</strong>：RocketMQ提供类似X/Open XA的分布事务功能，通过消息队列RocketMQ的事务消息能达到分布式事务的最终一致。</p>
</li>
<li>
<p><strong>顺序消息</strong>：RocketMQ提供的一种按照顺序进行发布和消费的消息类型，分为全局顺序消息和分区顺序消息。</p>
</li>
<li>
<p><strong>全局顺序消息</strong>：对于指定的一个Topic，所有消息按照严格的先入先出（FIFO）的顺序进行发布和消费。</p>
</li>
<li>
<p><strong>分区顺序消息</strong>：对于指定的一个Topic，所有消息根据Sharding Key进行区块分区。同一个分区内的消息按照严格的FIFO顺序进行发布和消费。Sharding Key是顺序消息中用来区分不同分区的关键字段，和普通消息的Message Key是完全不同的概念。</p>
</li>
<li>
<p><strong>消息堆积</strong>：Producer已经将消息发送到消息队列RocketMQ的服务端，但由于Consumer消费能力有限，未能在短时间内将所有消息正确消费掉，此时在消息队列RocketMQ的服务端保存着未被消费的消息，该状态即消息堆积。</p>
</li>
<li>
<p><strong>消息过滤</strong>：Consumer可以根据消息标签（Tag）对消息进行过滤，确保Consumer最终只接收被过滤后的消息类型。消息过滤在消息队列RocketMQ的服务端完成。</p>
</li>
<li>
<p><strong>消息轨迹</strong>：在一条消息从Producer发出到Consumer消费处理过程中，由各个相关节点的时间、地点等数据汇聚而成的完整链路信息。通过消息轨迹，您能清晰定位消息从Producer发出，经由消息队列RocketMQ服务端，投递给Consumer的完整链路，方便定位排查问题。</p>
</li>
<li>
<p><strong>重置消费位点</strong>：以时间轴为坐标，在消息持久化存储的时间范围内（默认3天），重新设置Consumer对已订阅的Topic的消费进度，设置完成后Consumer将接收设定时间点之后由Producer发送到消息队列RocketMQ服务端的消息。</p>
</li>
<li>
<p><strong>死信队列</strong>：死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败，消息队列RocketMQ会自动进行消息重试；达到最大重试次数后，若消费依然失败，则表明Consumer在正常情况下无法正确地消费该消息。此时，消息队列RocketMQ不会立刻将消息丢弃，而是将这条消息发送到该Consumer对应的特殊队列中。 &nbsp;消息队列RocketMQ将这种正常情况下无法被消费的消息称为死信消息（Dead-Letter Message），将存储死信消息的特殊队列称为死信队列（Dead-Letter Queue）。</p>
</li>
</ul>
<h2>消息收发模型</h2>
<p>消息队列RocketMQ支持发布和订阅模型，消息生产者应用创建Topic并将消息发送到Topic。消费者应用创建对Topic的订阅以便从其接收消息。通信可以是一对多（扇出）、多对一（扇入）和多对多。具体通信如下图所示。<br>
</p>
<ul>
<li>
<p><strong>生产者集群</strong>：用来表示发送消息应用，一个生产者集群下包含多个生产者实例，可以是多台机器，也可以是一台机器的多个进程，或者一个进程的多个生产者对象。 &nbsp;一个生产者集群可以发送多个Topic消息。发送分布式事务消息时，如果生产者中途意外宕机，消息队列RocketMQ服务端会主动回调生产者集群的任意一台机器来确认事务状态。</p>
</li>
<li>
<p><strong>消费者集群</strong>：用来表示消费消息应用，一个消费者集群下包含多个消费者实例，可以是多台机器，也可以是多个进程，或者是一个进程的多个消费者对象。一个消费者集群下的多个消费者以均摊方式消费消息。如果设置的是广播方式，那么这个消费者集群下的每个实例都消费全量数据。 &nbsp;一个消费者集群对应一个Group ID，一个Group ID可以订阅多个Topic，如上图中的Group 2所示。Group和Topic的订阅关系可以通过直接在程序中设置即可。</p>
</li>
</ul>
<h2>应用场景</h2>
<ul>
<li>
<p><strong>削峰填谷</strong>：诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲，或因没做相应的保护而导致系统超负荷甚至崩溃，或因限制太过导致请求大量失败而影响用户体验，消息队列RocketMQ可提供削峰填谷的服务来解决该问题。</p>
</li>
<li>
<p><strong>异步解耦</strong>：交易系统作为淘宝和天猫主站最核心的系统，每笔交易订单数据的产生会引起几百个下游业务系统的关注，包括物流、购物车、积分、流计算分析等等，整体业务系统庞大而且复杂，消息队列RocketMQ可实现异步通信和应用解耦，确保主站业务的连续性。</p>
</li>
<li>
<p><strong>顺序收发</strong>：细数日常中需要保证顺序的应用场景非常多，例如证券交易过程时间优先原则，交易系统中的订单创建、支付、退款等流程，航班中的旅客登机消息处理等等。与先进先出FIFO（First In First Out）原理类似，消息队列RocketMQ提供的顺序消息即保证消息FIFO。</p>
</li>
<li>
<p><strong>分布式事务一致性</strong>：交易系统、支付红包等场景需要确保数据的最终一致性，大量引入消息队列RocketMQ的分布式事务，既可以实现系统之间的解耦，又可以保证最终的数据一致性。</p>
</li>
<li>
<p><strong>大数据分析</strong>：数据在“流动”中产生价值，传统数据分析大多是基于批量计算模型，而无法做到实时的数据分析，利用阿里云消息队列RocketMQ与流式计算引擎相结合，可以很方便的实现业务数据的实时分析。</p>
</li>
<li>
<p><strong>分布式缓存同步</strong>：天猫双11大促，各个分会场琳琅满目的商品需要实时感知价格变化，大量并发访问数据库导致会场页面响应时间长，集中式缓存因带宽瓶颈，限制了商品变更的访问流量，通过消息队列RocketMQ构建分布式缓存，实时通知商品数据的变化。</p>
</li>
</ul>
<p>下文先以用户注册为场景说明消息队列RocketMQ如何实现以下功能：</p>
<ul>
<li>
<p>异步解耦</p>
</li>
<li>
<p>分布式事务的数据一致性</p>
</li>
<li>
<p>消息的顺序收发</p>
</li>
</ul>
<p>最后，再以电商的秒杀场景和价格同步场景分别说明消息队列RocketMQ所实现的削峰填谷和大规模机器的缓存同步。</p>
<h3>异步解耦</h3>
<h4>传统处理</h4>
<p>最常见的一个场景是用户注册后，需要发送注册邮件和短信通知，以告知用户注册成功。传统的做法有以下两种：</p>
<p><strong>串行方式</strong><br>
</p>
<p>数据流动如下所述：</p>
<ol>
<li>
<p>您在注册页面填写账号和密码并提交注册信息，这些注册信息首先会被写入注册系统。</p>
</li>
<li>
<p>注册信息写入注册系统成功后，再发送请求至邮件通知系统。邮件通知系统收到请求后向用户发送邮件通知。</p>
</li>
<li>
<p>邮件通知系统接收注册系统请求后再向下游的短信通知系统发送请求。短信通知系统收到请求后向用户发送短信通知。</p>
</li>
</ol>
<p>以上三个任务全部完成后，才返回注册结果到客户端，用户才能使用账号登录。<br>
假设每个任务耗时分别为50 ms，则用户需要在注册页面等待总共150 ms才能登录。</p>
<p><strong>并行方式</strong><br>
</p>
<p>数据流动如下所述：</p>
<ol>
<li>
<p>用户在注册页面填写账号和密码并提交注册信息，这些注册信息首先会被写入注册系统。</p>
</li>
<li>
<p>注册信息写入注册系统成功后，再同时发送请求至邮件和短信通知系统。邮件和短信通知系统收到请求后分别向用户发送邮件和短信通知。</p>
</li>
</ol>
<p>以上两个任务全部完成后，才返回注册结果到客户端，用户才能使用账号登录。 &nbsp;假设每个任务耗时分别为50 ms，其中，邮件和短信通知并行完成，则用户需要在注册页面等待总共100 ms才能登录。</p>
<h4>异步解耦</h4>
<p>对于用户来说，注册功能实际只需要注册系统存储用户的账户信息后，该用户便可以登录，后续的注册短信和邮件不是即时需要关注的步骤。</p>
<p>对于注册系统而言，发送注册成功的短信和邮件通知并不一定要绑定在一起同步完成，所以实际当数据写入注册系统后，注册系统就可以把其他的操作放入对应的消息队列RocketMQ中然后马上返回用户结果，由消息队列RocketMQ异步地进行这些操作。<br>
</p>
<p>数据流动如下所述：</p>
<ol>
<li>
<p>用户在注册页面填写账号和密码并提交注册信息，这些注册信息首先会被写入注册系统。</p>
</li>
<li>
<p>注册信息写入注册系统成功后，再发送消息至消息队列RocketMQ。消息队列RocketMQ会马上返回响应给注册系统，注册完成。用户可立即登录。</p>
</li>
<li>
<p>下游的邮件和短信通知系统订阅消息队列RocketMQ的此类注册请求消息，即可向用户发送邮件和短信通知，完成所有的注册流程。</p>
</li>
</ol>
<p>用户只需在注册页面等待注册数据写入注册系统和消息队列RocketMQ的时间，即等待55 ms即可登录。</p>
<p>异步解耦是消息队列RocketMQ的主要特点，主要目的是减少请求响应时间和解耦。主要的适用场景就是将比较耗时而且不需要即时（同步）返回结果的操作作为消息放入消息队列。同时，由于使用了消息队列RocketMQ，只要保证消息格式不变，消息的发送方和接收方并不需要彼此联系，也不需要受对方的影响，即解耦。</p>
<h3>分布式事务的数据一致性</h3>
<p>注册系统注册的流程中，用户入口在网页注册系统，通知系统在邮件系统，两个系统之间的数据需要保持最终一致。</p>
<h4>普通消息处理</h4>
<p>如上所述，注册系统和邮件通知系统之间通过消息队列进行异步处理。注册系统将注册信息写入注册系统之后，发送一条注册成功的消息到消息队列RocketMQ，邮件通知系统订阅消息队列RocketMQ的注册消息，做相应的业务处理，发送注册成功或者失败的邮件。<br>
</p>
<p>流程说明如下：</p>
<ol>
<li>
<p>注册系统发起注册。</p>
</li>
<li>
<p>注册系统向消息队列RocketMQ发送注册消息成功与否的消息。</p>
</li>
</ol>
<p>2.1. 消息发送成功，进入3。</p>
<p>2.2. 消息发送失败，导致邮件通知系统未收到消息队列RocketMQ发送的注册成功与否的消 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 息，而无法发送邮件，最终邮件通知系统和注册系统之间的状态数据不一致。</p>
<ol start="3">
<li>
<p>邮件通知系统收到消息队列RocketMQ的注册成功消息。</p>
</li>
<li>
<p>邮件通知系统发送注册成功邮件给用户。</p>
</li>
</ol>
<p>在这样的情况下，虽然实现了系统间的解耦，上游系统不需要关心下游系统的业务处理结果；但是数据一致性不好处理，如何保证邮件通知系统状态与注册系统状态的最终一致。</p>
<h4>事务消息处理</h4>
<p>此时，需要利用消息队列RocketMQ所提供的事务消息来实现系统间的状态数据一致性。<br>
</p>
<p>流程说明如下：</p>
<ol>
<li>注册系统向消息队列RocketMQ发送半事务消息。</li>
</ol>
<p>1.1. 半事务消息发送成功，进入2。</p>
<p>1.2. 半事务消息发送失败，注册系统不进行注册，流程结束。（最终注册系统与邮件通知系统数据一致）</p>
<ol start="2">
<li>注册系统开始注册。</li>
</ol>
<p>2.1. 注册成功，进入3.1。</p>
<p>2.2. 注册失败，进入3.2。</p>
<ol start="3">
<li>注册系统向消息队列RocketMQ发送半消息状态。</li>
</ol>
<p>3.1. 提交半事务消息，产生注册成功消息，进入4。</p>
<p>3.2. 回滚半事务消息，未产生注册成功消息，流程结束。 &nbsp;说明 最终注册系统与邮件通知系 &nbsp; &nbsp;统数据一致。</p>
<ol start="4">
<li>
<p>邮件通知系统接收消息队列RocketMQ的注册成功消息。</p>
</li>
<li>
<p>邮件通知系统发送注册成功邮件。（最终注册系统与邮件通知系统数据一致）关于分布式事务消息的更多详细内容，请参见事务消息。</p>
</li>
</ol>
<h3>消息的顺序收发</h3>
<p>消息队列RocketMQ顺序消息分为两种情况：</p>
<ul>
<li>
<p>全局顺序：对于指定的一个Topic，所有消息将按照严格的先入先出（FIFO）的顺序，进行顺序发布和顺序消费。</p>
</li>
<li>
<p>分区顺序：对于指定的一个Topic，所有消息根据Sharding Key进行区块分区，同一个分区内的消息将按照严格的FIFO的顺序，进行顺序发布和顺序消费，可以保证一个消息被一个进程消费。在注册场景中，可使用用户ID作为Sharding Key来进行分区，同一个分区下的新建、更新或删除注册信息的消息必须按照FIFO的顺序发布和消费。</p>
</li>
</ul>
<h3>削峰填谷</h3>
<p>流量削峰也是消息队列RocketMQ的常用场景，一般在秒杀或团队抢购活动中使用广泛。</p>
<p>在秒杀或团队抢购活动中，由于用户请求量较大，导致流量暴增，秒杀的应用在处理如此大量的访问流量后，下游的通知系统无法承载海量的调用量，甚至会导致系统崩溃等问题而发生漏通知的情况。为解决这些问题，可在应用和下游通知系统之间加入消息队列RocketMQ。<br>
</p>
<p>秒杀处理流程如下所述：</p>
<ol>
<li>
<p>用户发起海量秒杀请求到秒杀业务处理系统。</p>
</li>
<li>
<p>秒杀处理系统按照秒杀处理逻辑将满足秒杀条件的请求发送至消息队列RocketMQ。</p>
</li>
<li>
<p>下游的通知系统订阅消息队列RocketMQ的秒杀相关消息，再将秒杀成功的消息发送到相应用户。</p>
</li>
<li>
<p>用户收到秒杀成功的通知。</p>
</li>
</ol>
<h3>大规模机器的缓存同步</h3>
<p>双十一大促时，各个分会场会有玲琅满目的商品，每件商品的价格都会实时变化。使用缓存技术也无法满足对商品价格的访问需求，缓存服务器网卡满载。访问较多次商品价格查询影响会场页面的打开速度。</p>
<p>此时需要提供一种广播机制，一条消息本来只可以被集群的一台机器消费，如果使用消息队列RocketMQ的广播消费模式，那么这条消息会被所有节点消费一次，相当于把价格信息同步到需要的每台机器上，取代缓存的作用。</p>
<h2>系统部署架构</h2>
<p>系统部署架构如下图所示。<br>
</p>
<p>图中所涉及到的概念如下所述：</p>
<ul>
<li>
<p><strong>Name Server</strong>：是一个几乎无状态节点，可集群部署，在消息队列RocketMQ版中提供命名服务，更新和发现Broker服务。</p>
</li>
<li>
<p><strong>Broker</strong>：消息中转角色，负责存储消息，转发消息。分为Master Broker和Slave Broker，一个Master Broker可以对应多个Slave Broker，但是一个Slave Broker只能对应一个Master Broker。Broker启动后需要完成一次将自己注册至Name Server的操作；随后每隔30s定期向Name Server上报Topic路由信息。</p>
</li>
<li>
<p><strong>生产者</strong>：与Name Server集群中的其中一个节点（随机）建立长链接（Keep-alive），定期从Name Server读取Topic路由信息，并向提供Topic服务的Master Broker建立长链接，且定时向Master Broker发送心跳。</p>
</li>
<li>
<p><strong>消费者</strong>：与Name Server集群中的其中一个节点（随机）建立长连接，定期从Name Server拉取Topic路由信息，并向提供Topic服务的Master Broker、Slave Broker建立长连接，且定时向Master Broker、Slave Broker发送心跳。Consumer既可以从Master Broker订阅消息，也可以从Slave Broker订阅消息，订阅规则由Broker配置决定。</p>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>组件SpringBoot</title>
      <link>https://ujava.cn/assembly/springboot.html</link>
      <guid>https://ujava.cn/assembly/springboot.html</guid>
      <source url="https://ujava.cn/rss.xml">组件SpringBoot</source>
      <description>1、SpringBoot简介 Spring Boot(英文中是“引导”的意思)，是用来简化Spring应用的搭建到开发的过程。应用开箱即用，只要通过 “just run”（可能是 java -jar 或 tomcat 或 maven插件run 或 shell脚本），就可以启动项目。 简化了j2ee开发 整合了spring技术栈(springmvc sp...</description>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
      <content:encoded><![CDATA[<h2>1、SpringBoot简介</h2>
<p>Spring Boot(英文中是“引导”的意思)，是用来简化Spring应用的搭建到开发的过程。应用开箱即用，只要通过 “just run”（可能是 java -jar 或 tomcat 或 maven插件run 或 shell脚本），就可以启动项目。</p>
<ul>
<li>
<p>简化了j2ee开发</p>
</li>
<li>
<p>整合了spring技术栈(springmvc springweb)</p>
</li>
<li>
<p>整合了 mybatis等</p>
<p>Spring Boot将各个第三方框架 设置成一个个场景 Starter，会将场景所依赖的所有依赖自动加载注入。例如：选择Web，会把tomcat\json\web-mvc\web 自动注入</p>
</li>
</ul>
<p>父项目中导入SpringBoot-starter，其中包括2.5版本对应的所有相关依赖包及版本号</p>
<h3>1.1 依赖管理</h3>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">parent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-parent&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;2.5.0&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">relativePath</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/&gt; </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">parent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>1、引入依赖默认都可以不写版本<br>
2、引入非版本仲裁的jar，要写版本号<br>
可以通过porm.xml中增加配置自定义版本号<br>
1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。<br>
2、在当前项目里面重写配置</p>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">properties</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">mybatis-plus.version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;3.4.1&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">mybatis-plus.version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">properties</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>1.2 自动配置</h3>
<ul>
<li>自动配置好SpringMVC
<ul>
<li>自动引入SpringMC所有组件</li>
<li>自动配置好SpringMVC常用组件</li>
</ul>
</li>
<li>自动配置好Web常用组件
<ul>
<li>配置好了常用组件(例如：字符集等)</li>
</ul>
</li>
<li>默认的包结构
<ul>
<li>主程序所在包及其结构下方所有自包都会默认扫描加载</li>
<li>想要改变扫描包可以通过以下两种注解方式变更</li>
</ul>
</li>
</ul>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">) </span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">SpringBootApplication</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">scanBasePackages</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "com.capinfo"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">)</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">) </span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">ComponentScan</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">basePackages</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "com.capinfo"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">)</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>各种默认配置值
<ul>
<li>默认配置最终都映射到对应的配置类中，例如：ServerProperties,MutiPartProperties</li>
<li>配置文件的值最终会绑定到配置类上，这个类在容器中创建对象</li>
</ul>
</li>
<li>按需加载所有配置项
<ul>
<li>所有的配置都在<strong>spring-boot-autoconfigure中</strong>##**</li>
<li>引入了哪个场景才会加载相关配置项(Prom中引入Starter例如Starter-WEB)</li>
<li>按照条件装配规则，符合的才会装备，@ConditionalOnClass(Advice.class)</li>
</ul>
</li>
</ul>
<h3>1.3 自动配置原理</h3>
<p>Springboot主配置类,实际会加载一套配置，三个配置项:</p>
<ul>
<li>
<p><strong>1）@SpringBootConfiguration：</strong><br>
包含@Configuration:加了此注解的类为配置配置类，会自动纳入Spring容器(注解@Component、@Service等)</p>
</li>
<li>
<p><strong>2）@EnableAutoConfiguration</strong>：**<br>
实现自动配置，主要为其中的以下两个注解</p>
<ul>
<li><strong>@AutoConfigurationPackage</strong></li>
</ul>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">Import</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">AutoConfigurationPackages</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">Registrar</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">class</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">)</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//给容器中导入Registrar组件</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">   </span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    //Registrar中给容器中导入一系列组件</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">    //将Main中配置的包中所有组件导入</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> registerBeanDefinitions</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">AnnotationMetadata</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> metadata</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> BeanDefinitionRegistry</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> registry) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">		register</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(registry</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> PackageImports</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(metadata)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">getPackageNames</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">toArray</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">new</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">	}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>@Import(AutoConfigurationImportSelector.class)</strong></li>
</ul>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> String</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">[] </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">selectImports</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">AnnotationMetadata</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> annotationMetadata) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	if</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> (</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">isEnabled</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(annotationMetadata)) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">		return</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> NO_IMPORTS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">	}</span></span>
<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">	AutoConfigurationEntry</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> autoConfigurationEntry </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> getAutoConfigurationEntry</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">(annotationMetadata)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-dark:#7F848E;--shiki-light-font-style:italic;--shiki-dark-font-style:italic">//加载所有组件入口</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">	return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> StringUtils</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">toStringArray</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">autoConfigurationEntry</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">getConfigurations</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>具体内部实现顺序</p>
<p>1、getAutoConfigurationEntry(annotationMetadata);给容器中加载组件<br>
2、List&nbsp;configurations = getCandidateConfigurations(annotationMetadata, attributes);获取所有需要导入的包<br>
3、Map&lt;String, List&gt; loadSpringFactories(ClassLoader classLoader) {<br>
getBeanClassLoader());//工厂加载<br>
4、可以查询到最终是从中META-INF/spring.factories中加载</p>
<ul>
<li>默认扫描当前系统中所有依赖包中META-INF/spring.factories文件</li>
<li>org.springframework.boot.autoconfigure:2.5.0中EnableAutoConfiguration为spring所有配置包</li>
</ul>
</li>
<li>
<p><strong>3）@ComponentScan:</strong>&nbsp;指定要扫描哪些包</p>
</li>
</ul>
<h2>SpringBoot实践</h2>
<h3>1、引入依赖</h3>
<p>引入场景依赖org.springframework.boot<br>
[官方文档](<a href="https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using" target="_blank" rel="noopener noreferrer">https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using</a>.</p>
<h3>2、查看自动配置</h3>
<p>自己分析，引入场景对应的自动配置一般都生效了<br>
配置文件debug=true,可看到开启配置报告Negative（未生效）、Positive（生效）<br>
xxxxProperties绑定了配置文件的哪些。<br>
自定义加入或者替换组件<br>
@Bean、@Component…<br>
自定义器 XXXXXCustomizer；</p>
<h3>3、是否需要修改</h3>
<p>参照官方文档配置&nbsp;<a href="https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#common-application-properties" target="_blank" rel="noopener noreferrer">配置官方文档</a>build-systems.starters)<br>
自定义加入或者替换组件</p>
<h3>4、自定义组件</h3>
<h4>1）Lombok</h4>
<p>Lombok用标签方式代替构造器、getter/setter、toString()等鸡肋代码。简化javabean开发，会在编译时生成相关代码，保持代码整洁。<br>
1)引入依赖</p>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">		&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;org.projectlombok&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">		&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;lombok&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>2)安装lombok插件</p>
<ul>
<li>IDEA中File-&gt;Settings-&gt;Plugins，搜索安装Lombok插件。</li>
</ul>
<p>3)注解</p>
<ul>
<li>@AllArgsConstructor //生成有参构造函数</li>
<li>@NoArgsConstructor //生成无参构造函数</li>
<li>@Data //生成get，set方法</li>
<li>@ToString //生成ToString方法</li>
<li>@Slf4j //注入日志 log.info直接使用</li>
</ul>
<h4>2) dev-tools 自动加载功能</h4>
<p>1)引入依赖</p>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;spring-boot-devtools&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">	&lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">optional</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;true&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">optional</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>2)代码变更后只需要Build就可以看到结果，相当于重新启动项目，静态页面开发时不重启就能看到效果了</p>
<h4>3) 配置提示</h4>
<p>自定义的类和配置文件绑定一般没有提示。添加此依赖增加提示</p>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">//依赖关系配置</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;spring-boot-configuration-processor&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">optional</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;true&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">optional</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>4) 打包配置</h4>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">build</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">plugins</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">plugin</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;spring-boot-maven-plugin&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">configuration</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                    &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">excludes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                        &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">exclude</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                            &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                            &lt;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;spring-boot-configuration-processor&lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                        &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">exclude</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                    &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">excludes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">configuration</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">plugin</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">plugins</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">build</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>组件SpringMVC</title>
      <link>https://ujava.cn/assembly/springmvc.html</link>
      <guid>https://ujava.cn/assembly/springmvc.html</guid>
      <source url="https://ujava.cn/rss.xml">组件SpringMVC</source>
      <description>spring mvc是一种基于java的web应用程序开发框架，它是spring框架的一部分，提供了一种模型、视图、控制器的架构模式，用于构建灵活、可扩展和高效的web应用程序。spring mvc的核心组件包括dispatcherservlet、handlermapping、handler、viewresolver和view等。 img_192.pn...</description>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
      <content:encoded><![CDATA[<blockquote>
<p>spring mvc是一种基于java的web应用程序开发框架，它是spring框架的一部分，提供了一种模型、视图、控制器的架构模式，用于构建灵活、可扩展和高效的web应用程序。spring mvc的核心组件包括dispatcherservlet、handlermapping、handler、viewresolver和view等。</p>
</blockquote>
<figure><figcaption>img_192.png</figcaption></figure>
<p>Spring MVC是一种基于Java的Web应用程序开发框架，它是Spring框架的一部分。Spring MVC提供了一种模型-视图-控制器（Model-View-Controller，MVC）的架构模式，用于构建灵活、可扩展和高效的Web应用程序。</p>
<p>在Spring MVC中，模型（Model）代表应用程序的数据和业务逻辑。视图（View）负责展示数据给用户，并接受用户的输入。控制器（Controller）处理用户的请求，协调模型和视图之间的交互。这种分离的架构模式使得代码的组织和维护更加清晰和可控。</p>
<p>Spring MVC的核心组件包括：</p>
<ol>
<li>
<p>DispatcherServlet：DispatcherServlet是Spring MVC的前端控制器，它接收所有的HTTP请求，并将请求分发给相应的处理器（Handler）进行处理。DispatcherServlet还负责协调处理器、模型和视图之间的交互。</p>
</li>
<li>
<p>HandlerMapping：HandlerMapping负责将请求映射到相应的处理器。它根据请求的URL和其他条件确定要执行的处理器，并返回给DispatcherServlet。</p>
</li>
<li>
<p>Handler：Handler是实际处理请求的组件。它可以是一个Controller类，也可以是一个处理请求的方法。Handler执行所需的业务逻辑，并返回一个ModelAndView对象，该对象包含要在视图中展示的数据和视图的名称。</p>
</li>
<li>
<p>ViewResolver：ViewResolver负责将逻辑视图名称解析为实际的视图对象。它根据视图名称查找并返回一个具体的视图实现，如JSP、Thymeleaf或FreeMarker等。</p>
</li>
<li>
<p>View：View负责将模型中的数据渲染到具体的输出格式，如HTML、JSON或XML。它负责将模型的数据呈现给用户，并生成最终的响应。</p>
</li>
</ol>
<p>除了以上核心组件，Spring MVC还提供了许多其他功能和特性，如数据绑定、表单处理、文件上传、拦截器、国际化等。它还支持RESTful风格的Web服务开发，并与其他Spring框架模块（如Spring Boot、Spring Security和Spring Data等）无缝集成。</p>
<p>使用Spring MVC可以带来许多好处。首先，它提供了一种清晰的架构模式，使得代码的组织和维护更加简单和可控。其次，Spring MVC具有高度可扩展性和灵活性，可以根据应用程序的需求进行定制和扩展。此外，它还提供了丰富的功能和特性，使得开发Web应用程序更加高效和便捷。</p>
<p>总结而言，Spring MVC是一种基于Java的Web应用程序开发框架，它采用了模型-视图-控制器（MVC）的架构模式。它提供了一种清晰、可扩展和高效的方式来构建Web应用程序。Spring MVC的核心组件包括DispatcherServlet、HandlerMapping、Handler、ViewResolver和View等。使用Spring MVC可以使开发Web应用程序更加简单、高效和可控。</p>
]]></content:encoded>
    </item>
    <item>
      <title>组件XXL-JOB</title>
      <link>https://ujava.cn/assembly/xxljob.html</link>
      <guid>https://ujava.cn/assembly/xxljob.html</guid>
      <source url="https://ujava.cn/rss.xml">组件XXL-JOB</source>
      <description>基础概念 概述 首先我们要知道什么是XXL-JOB？ 官方简介：XXL-JOB是一个分布式任务调度平台，其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线，开箱即用 XXL-JOB的有点特性： … 是目前主流的分布式任务调度平台，许多公司的产品业务都有XXL-JOB的接入 使用 首先从GitHub上面将项目clo...</description>
      <category>设计组件</category>
      <pubDate>Sun, 29 Sep 2024 14:43:20 GMT</pubDate>
      <content:encoded><![CDATA[<h2>基础概念</h2>
<p>概述  首先我们要知道什么是XXL-JOB？</p>
<p>官方简介：XXL-JOB是一个分布式任务调度平台，其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线，开箱即用</p>
<p>XXL-JOB的有点特性：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span> 1、简单：支持通过Web页面对任务进行CRUD操作，操作简单，一分钟上手；</span></span>
<span class="line"><span> 2、动态：支持动态修改任务状态、启动/停止任务，以及终止运行中任务，即时生效；</span></span>
<span class="line"><span> 3、调度中心HA（中心式）：调度采用中心式设计，“调度中心”自研调度组件并支持集群部署，可保证调度中心HA；</span></span>
<span class="line"><span> 4、执行器HA（分布式）：任务分布式执行，任务"执行器"支持集群部署，可保证任务执行HA；</span></span>
<span class="line"><span> 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时，也支持手动录入执行器地址；</span></span>
<span class="line"><span> 6、弹性扩容缩容：一旦有新执行器机器上线或者下线，下次调度时将会重新分配任务；</span></span>
<span class="line"><span> 7、路由策略：执行器集群部署时提供丰富的路由策略，包括：第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等；</span></span>
<span class="line"><span> 8、故障转移：任务路由策略选择"故障转移"情况下，如果执行器集群中某一台机器故障，将会自动Failover切换到一台正常的执行器发送调度请求。</span></span>
<span class="line"><span> 9、阻塞处理策略：调度过于密集执行器来不及处理时的处理策略，策略包括：单机串行（默认）、丢弃后续调度、覆盖之前调度；</span></span>
<span class="line"><span> 10、任务超时控制：支持自定义任务超时时间，任务运行超时将会主动中断任务；</span></span>
<span class="line"><span> 11、任务失败重试：支持自定义任务失败重试次数，当任务失败时将会按照预设的失败重试次数主动进行重试；其中分片任务支持分片粒度的失败重试；</span></span>
<span class="line"><span> 12、任务失败告警；默认提供邮件方式失败告警，同时预留扩展接口，可方便的扩展短信、钉钉等告警方式；</span></span>
<span class="line"><span> 13、分片广播任务：执行器集群部署时，任务路由策略选择"分片广播"情况下，一次任务调度将会广播触发集群中所有执行器执行一次任务，可根据分片参数开发分片任务；</span></span>
<span class="line"><span> 14、动态分片：分片广播任务以执行器为维度进行分片，支持动态扩容执行器集群从而动态增加分片数量，协同进行业务处理；在进行大数据量业务操作时可显著提升任务处理能力和速度。</span></span>
<span class="line"><span> 15、事件触发：除了"Cron方式"和"任务依赖方式"触发任务执行之外，支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务，可根据业务事件灵活触发</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>…</p>
<p>是目前主流的分布式任务调度平台，许多公司的产品业务都有XXL-JOB的接入</p>
<p>使用 首先从GitHub上面将项目clone下来，如果网络问题导致速度慢也可以从Gitee上面拉取</p>
<ul>
<li>
<p>GitHub地址：<a href="https://github.com/xuxueli/xxl-job" target="_blank" rel="noopener noreferrer">https://github.com/xuxueli/xxl-job</a></p>
</li>
<li>
<p>Gitee地址：<a href="https://gitee.com/xuxueli0323/xxl-job" target="_blank" rel="noopener noreferrer">https://gitee.com/xuxueli0323/xxl-job</a></p>
</li>
</ul>
<p>我从GitHub上面进行克隆<br>
</p>
<p>下载好之后将压缩包解压，然后通过IDEA打开，将Maven编译好后项目结构如下<br>
</p>
<p>然后运行自带的tables_xxl_job.sql文件，在Navcation中去运行，生成需要的表<br>
</p>
<p>得到需要的基础表<br>
<br>
打开xxl-job-admin模块，在application.properties中进行后台的配置<br>
</p>
<figure><figcaption>img_184.png</figcaption></figure>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>注意在数据库地址哪里加上时区属性，否则乱码</span></span>
<span class="line"><span></span></span>
<span class="line"><span>spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>然后我们启动XxlJobAdminApplication类，访问<a href="http://localhost:8080/xxl-job-admin" target="_blank" rel="noopener noreferrer">http://localhost:8080/xxl-job-admin</a></li>
<li>默认账户admn，密码123456</li>
</ul>
<figure><figcaption>img_185.png</figcaption></figure>
<p>进来就可以看到主界面了<br>
</p>
<p>定位到springboot模块下的jobhandler层下面<br>
</p>
<p>然后我们编写一个自己的定时任务来测试</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>package com.xxl.job.executor.service.jobhandler;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>import com.xxl.job.core.biz.model.ReturnT;</span></span>
<span class="line"><span>import com.xxl.job.core.handler.IJobHandler;</span></span>
<span class="line"><span>import com.xxl.job.core.handler.annotation.JobHandler;</span></span>
<span class="line"><span>import org.springframework.stereotype.Component;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>/**</span></span>
<span class="line"><span> * @author fueen</span></span>
<span class="line"><span> * 编写自己的定时任务Handler</span></span>
<span class="line"><span> * 继承IJobHandler</span></span>
<span class="line"><span> *</span></span>
<span class="line"><span> */</span></span>
<span class="line"><span>@JobHandler(value = "MyJobHandler")</span></span>
<span class="line"><span>@Component</span></span>
<span class="line"><span>public class MyJobHandler extends IJobHandler {</span></span>
<span class="line"><span>    /**</span></span>
<span class="line"><span>     * 重写execute方法，里面执行相应的功能</span></span>
<span class="line"><span>     * @param param</span></span>
<span class="line"><span>     * @return</span></span>
<span class="line"><span>     * @throws Exception</span></span>
<span class="line"><span>     */</span></span>
<span class="line"><span>    @Override</span></span>
<span class="line"><span>    public ReturnT&lt;String&gt; execute(String param) throws Exception {</span></span>
<span class="line"><span>        System.out.println("我们不能失去信仰");</span></span>
<span class="line"><span>        return SUCCESS;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在任务管理里面新增任务<br>
</p>
<figure><figcaption>img_189.png</figcaption></figure>
<p>然后在找到刚刚添加的任务，点击操作里面的启动<br>
</p>
<p>可以看到结果，刚刚编写的代码已经被执行了<br>
</p>
<p>关于XXL-JOB的基本使用就到这里了，如果在项目中去集成也很简单</p>
<p>在项目中引入依赖</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>&lt;dependency&gt;</span></span>
<span class="line"><span>  &lt;groupId&gt;com.xuxueli&lt;/groupId&gt;</span></span>
<span class="line"><span>  &lt;artifactId&gt;xxl-job-core&lt;/artifactId&gt;</span></span>
<span class="line"><span>  &lt;version&gt;2.0.1&lt;/version&gt;</span></span>
<span class="line"><span>&lt;/dependency&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>将xxl-job-executor-sample-springboot这个模块下的XxlJobConfig复制一份到项目中，然后将相关配置设置好即可</p>
]]></content:encoded>
    </item>
  </channel>
</rss>