<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>bububan的小空间₍^&gt;ᴗo^₎⟆</title>
  
  <subtitle>他乡遇故知，一步一句是相思</subtitle>
  <link href="http://www.ububan.github.io/atom.xml" rel="self"/>
  
  <link href="http://www.ububan.github.io/"/>
  <updated>2026-04-01T07:14:44.222Z</updated>
  <id>http://www.ububan.github.io/</id>
  
  <author>
    <name>bububan₍^˵- ᴗ -˵^₎⟆</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>test</title>
    <link href="http://www.ububan.github.io/posts/12345.html"/>
    <id>http://www.ububan.github.io/posts/12345.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-01T07:14:44.222Z</updated>
    
    <content type="html"><![CDATA[<p>##这是我的第一篇文章</p><div class="note default simple"><p>内容+++</p></div><div class="timeline blue"><div class='timeline-item headline'>        <div class='timeline-item-title'>          <div class='item-circle'><p>时间轴样式</p></div>        </div>      </div><div class='timeline-item'>        <div class='timeline-item-title'>          <div class='item-circle'><p>2020-07-24 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases">2.6.6 -&gt; 3.0</a></p></div>        </div>        <div class='timeline-item-content'><ol><li>如果有 <code>hexo-lazyload-image</code> 插件，需要删除并重新安装最新版本，设置 <code>lazyload.isSPA: true</code>。</li><li>2.x 版本的 css 和 js 不适用于 3.x 版本，如果使用了 <code>use_cdn: true</code> 则需要删除。</li><li>2.x 版本的 fancybox 标签在 3.x 版本中被重命名为 gallery 。</li><li>2.x 版本的置顶 <code>top: true</code> 改为了 <code>pin: true</code>，并且同样适用于 <code>layout: page</code> 的页面。</li><li>如果使用了 <code>hexo-offline</code> 插件，建议卸载，3.0 版本默认开启了 pjax 服务。</li></ol></div>      </div><div class='timeline-item'>        <div class='timeline-item-title'>          <div class='item-circle'><p>2020-05-15 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.6">2.6.3 -&gt; 2.6.6</a></p></div>        </div>        <div class='timeline-item-content'><p>不需要额外处理。</p></div>      </div></div><div class="">你的一些代码...</div><script>你的一些代码...</script>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;##这是我的第一篇文章&lt;/p&gt;
&lt;div class=&quot;note default simple&quot;&gt;&lt;p&gt;内容+++&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;timeline blue&quot;&gt;&lt;div class=&#39;timeline-item headline&#39;&gt;
    </summary>
      
    
    
    
    <category term="-个人日记" scheme="http://www.ububan.github.io/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>linux脚本编程</title>
    <link href="http://www.ububan.github.io/posts/12334.html"/>
    <id>http://www.ububan.github.io/posts/12334.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T01:41:51.666Z</updated>
    
    <content type="html"><![CDATA[<p>##这是我的第二篇文章</p><h1>bash 脚本的优点</h1><p><font style="color:rgb(10, 10, 35);">Bash 脚本是一种强大且灵活的工具，可以用于自动化系统管理任务、管理系统资源以及在 Unix/Linux 系统中执行其他例行任务。Shell 脚本的一些优点包括：</font></p><ul><li><strong><font style="color:rgb(27, 27, 50);">自动化</font></strong><font style="color:rgb(10, 10, 35);">：Shell 脚本允许你自动化重复性任务和过程，节省时间并减少手动执行时可能出现的错误。</font></li><li><strong><font style="color:rgb(27, 27, 50);">可移植性</font></strong><font style="color:rgb(10, 10, 35);">：Shell 脚本可以在各种平台和操作系统上运行，包括 Unix、Linux、macOS，甚至通过使用模拟器或虚拟机在 Windows 上运行。</font></li><li><strong><font style="color:rgb(27, 27, 50);">灵活性</font></strong><font style="color:rgb(10, 10, 35);">：Shell 脚本高度可定制，可以轻松修改以满足特定需求。它们还可以与其他编程语言或实用程序结合，创建更强大的脚本。</font></li><li><strong><font style="color:rgb(27, 27, 50);">易访问性</font></strong><font style="color:rgb(10, 10, 35);">：Shell 脚本易于编写，不需要任何特殊工具或软件。它们可以使用任何文本编辑器进行编辑，并且大多数操作系统都有内置的 shell 解释器。</font></li><li><strong><font style="color:rgb(27, 27, 50);">集成</font></strong><font style="color:rgb(10, 10, 35);">：Shell 脚本可以与其他工具和应用程序集成，如数据库、Web 服务器和云服务，从而实现更复杂的自动化和系统管理任务。</font></li><li><strong><font style="color:rgb(27, 27, 50);">调试</font></strong><font style="color:rgb(10, 10, 35);">：Shell 脚本易于调试，大多数 shell 都内置调试和错误报告工具，可以帮助快速识别和修复问题。</font></li></ul><h1>运行 shell 脚本的方法有两种：</h1><p>1， 作为可执行程序运行</p><p>2，作为解释器参数运行</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#！/bin/bash</span><br><span class="line">echo <span class="string">&quot;hello World&quot;</span></span><br></pre></td></tr></table></figure><h2 id="当作为可执行程序运行时">当作为可执行程序运行时</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">chmod +x test.sh</span><br><span class="line">#赋予可执行权限</span><br><span class="line">./test.sh </span><br><span class="line">#执行程序</span><br></pre></td></tr></table></figure><h2 id="当作为解释器运行时">当作为解释器运行时</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">/bin/sh test.sh </span><br><span class="line">#执行命令</span><br><span class="line">/bin/php test.php</span><br><span class="line">#执行命令</span><br></pre></td></tr></table></figure><h1>创建 bash 脚本</h1><p>使用 vi 命令创建一个名为 run_all.sh 的文件</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi run_all.sh</span><br></pre></td></tr></table></figure><p>在文件中添加以下命令并保存</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line">echo <span class="string">&quot;今天是 &quot;</span> `date`</span><br><span class="line"></span><br><span class="line">echo -e <span class="string">&quot;\n请输入目录路径&quot;</span></span><br><span class="line">read the_path</span><br><span class="line"></span><br><span class="line">echo -e <span class="string">&quot;\n 你的路径包含以下文件和文件夹：&quot;</span></span><br><span class="line">ls $the_path</span><br></pre></td></tr></table></figure><p>打印用户提供的目录内容的脚本</p><ul><li><font style="color:rgb(10, 10, 35);">第 1 行：Shebang (</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;#!/bin/bash&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">) 指向 bash shell 路径。</font></li><li><font style="color:rgb(10, 10, 35);">第 2 行：</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;echo&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">命令在终端显示当前日期和时间。注意</font><font style="color:rgb(10, 10, 35);"> </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;date&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">在反引号中。</font></li><li><font style="color:rgb(10, 10, 35);">第 4 行：我们希望用户输入一个有效的路径。</font></li><li><font style="color:rgb(10, 10, 35);">第 5 行：</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;read&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">命令读取输入并将其存储在变量</font><font style="color:rgb(10, 10, 35);"> </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;the_path&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">中。</font></li><li><font style="color:rgb(10, 10, 35);">第 8 行：</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;ls&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> 命令使用存储路径的变量并显示当前的文件和文件夹。</font></li></ul><h1>执行 bash 脚本</h1><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod u+x run_all.sh</span><br></pre></td></tr></table></figure><ul><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;chmod&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">修改文件的所有权以供当前用户使用：</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;u&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;+x&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">将执行权限添加到当前用户。这意味着作为所有者的用户现在可以运行该脚本。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;run_all.sh&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> 是我们希望运行的文件。</font></li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sh run_all.sh</span><br><span class="line">bash run_all.sh</span><br><span class="line">./run_all.sh</span><br></pre></td></tr></table></figure><h1>变量命令规范</h1><p><font style="color:rgb(10, 10, 35);">在 Bash 脚本中，以下是变量命名规范：</font></p><ol><li><font style="color:rgb(10, 10, 35);">变量名称应以字母或下划线 (</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;_&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">) 开头。</font></li><li><font style="color:rgb(10, 10, 35);">变量名称可以包含字母、数字和下划线 (</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;_&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">)。</font></li><li><font style="color:rgb(10, 10, 35);">变量名称区分大小写。</font></li><li><font style="color:rgb(10, 10, 35);">变量名称不应包含空格或特殊字符。</font></li><li><font style="color:rgb(10, 10, 35);">使用能反映变量用途的描述性名称。</font></li><li><font style="color:rgb(10, 10, 35);">避免使用保留关键字（如 </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;if&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">, </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;then&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">, </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;else&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">, </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;fi&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> 等）作为变量名称</font></li></ol><h1>收集输入</h1><p>1，读取用户输入并将其存储在变量中，可以使用 read 命令读取用户输入</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash </span><br><span class="line"></span><br><span class="line">echo <span class="string">&quot;What&#x27;s your name?&quot;</span> </span><br><span class="line"></span><br><span class="line">read entered_name </span><br><span class="line"></span><br><span class="line">echo -e <span class="string">&quot;\nWelcome to bash tutorial&quot;</span> $entered_name</span><br></pre></td></tr></table></figure><p>2，从文件读取</p><p><font style="color:rgb(10, 10, 35);">此代码从名为 </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;input.txt&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> 的文件中读取每一行并将其打印到终端。我们将在本文稍后学习 while 循环。</font></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> read line</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">  echo $line</span><br><span class="line">done &lt; input.txt</span><br></pre></td></tr></table></figure><p>3，命令行参数</p><p><font style="color:rgb(10, 10, 35);">在 bash 脚本或函数中，</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;$1&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">表示传递的初始参数，</font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;$2&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> </font><font style="color:rgb(10, 10, 35);">表示传递的第二个参数，以此类推。</font></p><p><font style="color:rgb(10, 10, 35);">此脚本将名字作为命令行参数并打印个性化问候语。</font></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo <span class="string">&quot;Hello, $1!&quot;</span></span><br></pre></td></tr></table></figure><p><font style="color:rgb(10, 10, 35);">我们将 </font><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;Zaira&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);"> 作为参数提供给脚本。</font></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line">echo <span class="string">&quot;Hello, $1!&quot;</span></span><br></pre></td></tr></table></figure><p>脚本代码：<font style="color:rgb(10, 10, 35);background-color:rgb(208, 208, 213);">greeting.sh</font></p><p>输出</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1758801473981-17d9ee2c-32cb-4495-82fb-367c6b184f1f.png" width="600" title="" crop="0,0,1,1" id="u1f54e128" class="ne-image"><p>显示输出</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#打印到终端</span><br><span class="line">echo <span class="string">&quot;Hello, World!&quot;</span></span><br><span class="line">#写入文件</span><br><span class="line">echo <span class="string">&quot;This is some text.&quot;</span> &gt; output.txt</span><br><span class="line">#追加到文件</span><br><span class="line">echo <span class="string">&quot;More text.&quot;</span> &gt;&gt; output.txt</span><br><span class="line">#重定向输出</span><br><span class="line">ls &gt; files.txt</span><br></pre></td></tr></table></figure><h1>基本 bash 命令</h1><ol><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;cd&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 切换到不同目录。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;ls&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 列出当前目录的内容。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;mkdir&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 创建新目录。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;touch&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 创建新文件。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;rm&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 删除文件或目录。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;cp&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 复制文件或目录。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;mv&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 移动或重命名文件或目录。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;echo&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 将文本打印到终端。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;cat&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 连接并打印文件内容。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;grep&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 在文件中搜索模式。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;chmod&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 更改文件或目录的权限。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;sudo&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 以管理权限运行命令。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;df&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 显示可用磁盘空间。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;history&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 显示先前执行的命令列表。</font></li><li><code>&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;ps&lt;/font&gt;</code><font style="color:rgb(10, 10, 35);">: 显示有关正在运行的进程的信息。</font></li></ol><h1>脚本安全和 set</h1><p>set 命令：可以用来定制 shell 环境</p><p>h：hashall，打开选项后，Shell 会将命令所在的路径hash下来，避免每</p><p>次都要查询。通过set +h将h选项关闭</p><p>i：interactive-comments，包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell, 在脚本中，i选项是关闭的</p><p>m：monitor，打开监控模式，就可以通过Job control来控制进程的停</p><p>止、继续，后台或者前台执行等</p><p>B：braceexpand，大括号扩展</p><p>H：history，H选项打开，可以展开历史列表中的命令，可以通过!感叹号来完成，例如“!!”返回上最近的一个历史命令，“!n”返回第 n 个历史命令</p><p>set 命令实现脚本安全</p><p>-u 在扩展一个没有设置的变量时，显示错误信息， 等同set -o</p><p>nounset</p><p>-e 如果一个命令返回一个非0退出状态值(失败)就退出， 等同set -o</p><p>errexit</p><p>-o option 显示，打开或者关闭选项</p><p>显示选项：set -o</p><p>打开选项：set -o 选项 关闭选项：set +o 选项</p><p>-x 当执行命令时，打印命令及其参数,类似 bash -x</p><h1>bc 命令</h1><p>bash 计算器实际上是一种编程语言，允许在命令行中输入浮点数表达式，然后解释并计算该 表达式，最后返回结果。bash 计算器能够识别以下内容。</p><p>数字（整数和浮点数）</p><p>变量（简单变量和数组）</p><p>注释（以#或 C 语言中的/* */开始的行）</p><p>表达式</p><p>编程语句（比如 if-then 语句）</p><p>函数</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">-h --help</span><br><span class="line">print this usage and <span class="built_in">exit</span></span><br><span class="line">-i --interactive force interactive mode</span><br><span class="line">-l --mathlib use the predefined math routines</span><br><span class="line">-q --quiet</span><br><span class="line">don<span class="string">&#x27;t print initial banner</span></span><br><span class="line"><span class="string">-s --standard non-standard bc constructs are errors</span></span><br><span class="line"><span class="string">-w --warn</span></span><br><span class="line"><span class="string">warn about non-standard bc constructs</span></span><br><span class="line"><span class="string">-v --version print version information and exit</span></span><br></pre></td></tr></table></figure><p>浮点数运算是由内建变量 scale 控制的。必须将该变量的值设置为希望在计算结果中保留的小数位数，否则将无法得到期望的结果</p><p>scale 变量的默认值是 0。在 scale 值被设置前，bash 计算器的计算结果不包含小数位。 在将其设置成 4 后，bash 计算器显示的结果包含4 位小数。-q 选项可以不显示 bash 计算器冗长 的欢迎信息。</p><h1>read 命令接受输入</h1><p>尽管命令行选项和参数是从脚本用户处获取输入的一种重要方式，但有时候脚本还需要更多的交互性。你可能想要在脚本运行时询问用户并等待用户回答。为此，bash shell 提供了read 命令。</p><p>使用 read 能把输入值分配给一个或多个 shell 变量，read 从标准输入中读取值，给每个单词分配一个变量，所有剩余单词都被分配给最后一个变量，如果变量名没有指定，默认标准输入的值赋值给系统内置变量REPLY</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">-p 指定要显示的提示</span><br><span class="line">-s 静默输入，一般用于密码</span><br><span class="line">-n N 指定输入的字符长度N</span><br><span class="line">-d <span class="string">&#x27;字符&#x27;</span> 输入结束符</span><br><span class="line">-t N TIMEOUT为N秒</span><br></pre></td></tr></table></figure><p>read 命令从标准输入（键盘）或另一个文件描述符中接受输入。获取输入后，read 命令会将数据存入变量。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;##这是我的第二篇文章&lt;/p&gt;
&lt;h1&gt;bash 脚本的优点&lt;/h1&gt;
&lt;p&gt;&lt;font style=&quot;color:rgb(10, 10, 35);&quot;&gt;Bash 脚本是一种强大且灵活的工具，可以用于自动化系统管理任务、管理系统资源以及在 Unix/Linux 系统中执行其他</summary>
      
    
    
    
    <category term="-linux笔记" scheme="http://www.ububan.github.io/categories/linux%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>python基础</title>
    <link href="http://www.ububan.github.io/posts/43215.html"/>
    <id>http://www.ububan.github.io/posts/43215.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T06:39:40.541Z</updated>
    
    <content type="html"><![CDATA[<h2 id="标识符命名规则">标识符命名规则</h2><table><thead><tr><th>类型</th><th>规则</th><th>例子</th></tr></thead><tbody><tr><td>模块和包名</td><td>全小写字母，尽量简单，若多个单词之间用下划线</td><td>math,OS ,sys</td></tr><tr><td>函数名</td><td>全小写字母，多个单词之间用下划线隔开</td><td>phone.my_name</td></tr><tr><td>类名</td><td>首字母大写，采用驼峰原则，多个字母时，每个单词第一个字母大写，其余部分小写</td><td>MyPhone,MyClass,Phone</td></tr><tr><td>常量名</td><td>全大写字母</td><td>SPEED,MAX_SPEED</td></tr></tbody></table><h2 id="变量的声明和赋值">变量的声明和赋值</h2><p>用于将一个变量绑定到一个对象上。格式：变量=表达式<img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763347587175-087149ba-4786-4be5-a234-9fa193c6baf6.png" width="754" title="" crop="0,0,1,1" id="u254aa25b" class="ne-image"></p><p>最简单的表达式就是字面量，比如：a = 123.运行过程中，解释器先运行右边的表达式，生成一个代表表达式运算结果的对象；然后将这个对象地址赋值给左边的变量</p><h2 id="删除变量和垃圾回收机制">删除变量和垃圾回收机制</h2><p>1，可以通过 del 语句删除不再使用的变量</p><p>2，如果对象没有变量引用，就会被垃圾回收器回收，清空内存空间</p><h2 id="常量">常量</h2><p>Python 不支持常量，即没有语法规则改变一个常量的值，我们只能约定常量的命名规则以及在程序的逻辑上不对常量的值作出修改</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763348286355-a17773e7-6762-4bab-ae37-db67dacd422b.png" width="747" title="" crop="0,0,1,1" id="u51c423d4" class="ne-image"><h2 id="链式赋值">链式赋值</h2><p>用于同一个对象赋值给多个变量</p><p><strong>x = y = 123</strong></p><h2 id="系列解包赋值">系列解包赋值</h2><p>给对应相同个数的变量（个数必须保持一致）</p><p>a,b,c = 3,4,5 相当于：a=3;b=4,c=5</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763348488468-e0ab8c26-2521-4685-845b-7ecd61b161b8.png" width="460" title="" crop="0,0,1,1" id="u2ea882cb" class="ne-image"><h2 id="最基本内置数据类型">最基本内置数据类型</h2><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763349038620-93c610a7-057c-4b02-8aa7-1b4985460bac.png" width="750" title="" crop="0,0,1,1" id="u1ab632da" class="ne-image"><p>1，整型：int</p><p>整数，2345，10，30</p><p>2，浮点型：float</p><p>小数，3.14 或者科学计数法 314e-2</p><p>3，布尔型：bool</p><p>表示真假，仅包含：True，False</p><p>4，字符串型：str</p><p>由字符组成的序列“abc”“sxt”，“尚学堂”（用单引号或者双引号都可以）</p><h2 id="数字和基本运算符">数字和基本运算符</h2><p>python 支持整数（如：50，520）和浮点数（如：3.14，10.0，1.23e2），我们可以对数字做如下运算</p><table><thead><tr><th>运算符</th><th>说明</th><th>示例</th><th>结果</th></tr></thead><tbody><tr><td>+</td><td>加法</td><td>3+2</td><td>5</td></tr><tr><td>-</td><td>减法</td><td>30-5</td><td>25</td></tr><tr><td>*</td><td>乘法</td><td>3*6</td><td>18</td></tr><tr><td>/</td><td>浮点数除法</td><td>8/2</td><td>4.0</td></tr><tr><td>//</td><td>整数除法</td><td>7//2</td><td>3</td></tr><tr><td>%</td><td>模（取余）</td><td>7%4</td><td>3</td></tr><tr><td>**</td><td>幂</td><td>2**3</td><td>8</td></tr></tbody></table><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763349734988-e819c2ba-e9b0-4e49-8b64-354f06125f21.png" width="975" title="" crop="0,0,1,1" id="ud30246ca" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763349788879-16303e5d-33a8-4a19-8db2-4a3cf876d6b2.png" width="1079" title="" crop="0,0,1,1" id="u0da8dff7" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763349803790-f4232043-aea8-4c1f-b796-8ef7b43a8b63.png" width="1030" title="" crop="0,0,1,1" id="ub85ef04f" class="ne-image"><h2 id="三种进制">三种进制</h2><p>python 中除了十进制，还有其他三种进制：</p><p>0b 或 0B，二进制 0 1</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763350190401-07649346-0adb-4481-af30-e624be7ca4f1.png" width="846" title="" crop="0,0,1,1" id="u946d7317" class="ne-image"><h2 id="使用-int（）实现类型转换">使用 int（）实现类型转换</h2><p>1，浮点数直接舍去小数部分。如：int（9.9）结果是 9</p><p>2，布尔值 True 转为 1，False 转为 0.如：int（True）结果是 1</p><p>3，字符串符合整数格式（浮点数格式不行）则直接转成对应整数，否则报错</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763350458613-ff20932c-93c7-4864-897b-758f943ced91.png" width="1120" title="" crop="0,0,1,1" id="u130e8155" class="ne-image"><h2 id="浮点数">浮点数</h2><p>1，浮点数用科学计数法表示。比如：3.14，表示成：314E-2 或者 314e-2</p><p>2，这些数字在内存中也是按照科学计数法存储</p><h2 id="类型转换和四舍五入">类型转换和四舍五入</h2><p>1，类似于 int（），我们也可以使用 float（）将其他类型转化成浮点数</p><p>2，整数和浮点数混合运算时，表达式结果自动转型成浮点数。比如：2+8.0 的结果是 10.0</p><p>3，round（value）可以返回四舍五入的值。但不会改变原有值，而是产生新的值</p><h2 id="增强型赋值运算符">增强型赋值运算符</h2><p>运算符+、-、*、/、//、**和%和赋值符=结合可以构成“增强型赋值运算符”</p><table><thead><tr><th>运算符</th><th>例子</th><th>等价</th></tr></thead><tbody><tr><td>+=</td><td>a+ =2</td><td>a =a+2</td></tr><tr><td>-=</td><td>a-=2</td><td>a =a-2</td></tr><tr><td>*=</td><td>a*=2</td><td>a =a*2</td></tr><tr><td>/=</td><td>a/=2</td><td>a =a/2</td></tr><tr><td>// =</td><td>a//=2</td><td>a =a//2</td></tr><tr><td>**=</td><td>a**=2</td><td>a =a**2</td></tr><tr><td>%=</td><td>a%=2</td><td>a =a%2</td></tr></tbody></table><p><strong>注意！：“+=”中间不能加空格</strong></p><p>复合赋值可以让程序更加精炼，提高效率</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763362968424-86978fb4-740e-47ee-956a-3a7d16019e99.png" width="1070" title="" crop="0,0,1,1" id="uc64a0b9f" class="ne-image"><p><font style="background-color:#FBDE28;">定义为 False 的对象：None 和 False</font></p><p><font style="background-color:#FBDE28;">值为 0 的数字类型：0，0.0，0j，Decimal（0），Fraction（0，1）</font></p><p><font style="background-color:#FBDE28;">空的序列和集合：“，（），{}，[]，set（），range（0）</font></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;标识符命名规则&quot;&gt;标识符命名规则&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;规则&lt;/th&gt;
&lt;th&gt;例子&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模块和包名&lt;/td&gt;
&lt;td&gt;全小写字母，</summary>
      
    
    
    
    <category term="-python笔记" scheme="http://www.ububan.github.io/categories/python%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>序列</title>
    <link href="http://www.ububan.github.io/posts/23246.html"/>
    <id>http://www.ububan.github.io/posts/23246.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T06:43:13.844Z</updated>
    
    <content type="html"><![CDATA[<img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763384554145-0af66bda-5ca1-4ae2-9eb9-b36074ea0fd2.png" width="500" title="" crop="0,0,1,1" id="u0b825547" class="ne-image"><h1>+运算符操作</h1><p>并不是真正的尾部添加元素，而是创建新的列表对象；将原列表的元素和新列表的元素依次复制到新的列表对象中，这样，会涉及大量的复制操作，对于操作大量元素不建议使用</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763384675292-25441657-f255-46b2-aae8-233f30cfa88f.png" width="599" title="" crop="0,0,1,1" id="u9106c610" class="ne-image"><h2 id="extend（）方法">extend（）方法</h2><p>将目标列表的所有元素添加到本列表的尾部，属于原地操作，不创建新的列表对象</p><h1><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763384769421-bd813046-de55-40da-b9b4-359d4e18b3e0.png" width="410" title="" crop="0,0,1,1" id="u11becb56" class="ne-image"></h1><h1>insert（）插入元素</h1><p>使用 insert（）方法可以将指定的元素插入到列表对象的任意指定制定位置，这样会让插入位置后面所有的元素进行移动，会影响处理速度，涉及大量元素时，尽量避免使用。类似发生这种移动的函数还有：remove（），pop（），del（）。它们在删除非尾部元素时也会发生操作位置后面元素的移动</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763384977643-52979805-435b-4a53-97af-40ed1ea29c46.png" width="525" title="" crop="0,0,1,1" id="uc7d55b1f" class="ne-image"><h1>通过索引直接访问元素</h1><p>索引的区间在【0，列表长度-1】这个范围，超过这个范围则会报错</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763428001974-c8d0deb6-64a0-4f92-8ac4-797798edad97.png" width="910" title="" crop="0,0,1,1" id="uf0451a64" class="ne-image"><h1>index（）获得指定元素在列表中首次出现的索引</h1><p>语法是：index(value,[start.[end]])</p><p>其中 start 和 end 指定了搜索的范围</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763428078883-0858a2f8-66b6-4bbc-aca6-4a997bd4f897.png" width="1033" title="" crop="0,0,1,1" id="uaf8720a3" class="ne-image"><h1>count（）获得指定元素在列表中出现的次数</h1><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763428127873-210d8ddd-b41b-4e18-b8fe-14a0e36014ad.png" width="628" title="" crop="0,0,1,1" id="u2c19b295" class="ne-image"><h1>字符串</h1><p>字符串的创建</p><p>可以使用引号（单引号’，双引号’‘或三引号’‘’）来创建字符串</p><p>可以使用 str 类的构造函数 str（）</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766021158834-f02dc26a-9a13-4e90-8fd7-5d6d05f6e43a.png" width="285" title="" crop="0,0,1,1" id="uc123826b" class="ne-image"><h2 id="python-的三引号">python 的三引号</h2><p>python 的三引号（三个单引号或三个双引号均可）用于字符串跨多行，字符串中可以包含换行符，制表符以及其他特殊字符</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766021231244-c5644474-927e-4ebc-87fd-ab197c164bee.png" width="536" title="" crop="0,0,1,1" id="u519b81d9" class="ne-image"><h2 id="字符串中值的访问（切片：SLICE）">字符串中值的访问（切片：SLICE）</h2><p>python 不支持字符类型，即使是单个字符，python 也将其视为一个字符串来使用，访问子串，实际上就是用方括号来截取字符串，有的文献称之为“切片运算”</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766021349283-7cc2de9a-7b9b-45b8-9a31-32f58df6617a.png" width="816" title="" crop="0,0,1,1" id="u584d1ee1" class="ne-image"><h2 id="tuple">tuple</h2><p>将一个可迭代对象转换成元组</p><img src="https://cdn.nlark.com/yuque/0/2026/png/50252276/1768809364308-ba3655fe-8ddd-458d-a9c1-1ed9fe6305c4.png" width="965" title="" crop="0,0,1,1" id="u4ab01106" class="ne-image"><p>返回最小值和最大值</p><h2 id="列表，元组和字符串的共同点">列表，元组和字符串的共同点</h2><p>1，都可以通过索引获取每一个元素</p><p>2，第一个元素的索引值都是 0</p><p>3，都可以通过切片的方法获取一个范围</p><p>4，都有很多共同的运算符</p><p><font style="color:#DF2A3F;background-color:#FBDE28;">列表是可变序列。</font></p><p><font style="color:#DF2A3F;background-color:#FBDE28;">元组和字符串是不可变序列</font></p><h2 id="">+    *</h2><p>序列的加法表示两个序列进行拼接</p><p>乘法表示将序列进行重复（即拷贝）</p><h2 id="sorted（）函数">sorted（）函数</h2><p>返回的是一个全新的列表，而原来的列表并不会受影响</p><h3 id="案例">案例</h3><img src="https://cdn.nlark.com/yuque/0/2026/png/50252276/1768873097343-806f9ff4-16e2-4529-a31e-6b0df8c5f431.png" width="464" title="" crop="0,0,1,1" id="u234b9058" class="ne-image"><p>当我们单独传入这个 t 列表的时候，它对比的是列表中的每一个元素，这里的每一个元素又是字符串，所以它对比的是字符串的每一个字符的编码值</p><p>key 函数指定的是一个干预排序算法的函数</p><h2 id="all（）-any（）">all（）&amp;any（）</h2><p>all（）是判断可迭代对象中是否所有元素的值都为真</p><p>any（）是判断可迭代对象中是否存在某个元素的值为真</p><h2 id="enumerate（）">enumerate（）</h2><p>enumerate（）函数用于返回一个枚举对象，它的功能就是将可迭代对象中的每个元素及从 0 开始的序号共同构成一个二元组的列表</p><h2 id="zip（）">zip（）</h2><p>zip （）函数用于创建一个聚会多个可迭代对象的迭代器。</p><p>它会将作为参数传入的每个可迭代对象的每个元素依次组合成元组，即第 i 个元组包含每个参数的第 i 个元素</p><h2 id="map（）">map（）</h2><p>map（）函数会根据提供的函数对指定的可迭代对象的每个元素进行运算，并将返回运算结果的迭代器</p><h2 id="filter（）">filter（）</h2><p>filter（）函数会根据提供的函数对指定的可迭代对象的每个元素进行运算，并将运算结果为真的元素，以迭代器的形式返回</p><h1><font style="color:#DF2A3F;">一个迭代器肯定是一个可迭代对象</font></h1><p><font style="background-color:#FBDE28;">可迭代对象可以重复使用而迭代器则是一次性的</font></p><img src="https://cdn.nlark.com/yuque/0/2026/png/50252276/1768890647293-365e5022-ea6e-412b-9726-cd6547ad2c7b.png" width="584" title="" crop="0,0,1,1" id="u3100288b" class="ne-image"><p>iter（）把 x （可迭代对象）传过去，得到的结果给到 y，y 就是一个迭代器，通过 type（）函数观察到这个区别</p><p>next（）逐个将迭代器中的元素提取出来</p><h1>元组 tuple</h1><p>列表属于可变序列，可任意修改列表中的元素</p><p>元组属于不可变序列，<strong><font style="color:#DF2A3F;">不能修改元组中的元素</font></strong></p><p>因此，元组没有增加元素，修改元素，删除元素相关的方法</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763430128436-077b494f-47c5-46e8-af10-f13c1b5e81ec.png" width="792" title="" crop="0,0,1,1" id="u6254d762" class="ne-image"><p>只需掌握元组的创建和删除，元素的访问和计数即可</p><p>1，索引访问</p><p>2，切片操作</p><p>3，连接操作</p><p>4，成员关系操作</p><p>5，比较运算操作</p><p>6，计数：元组长度 len（），最大值 max（），最小值 min（），求和 sun（）等</p><h2 id="元组的创建">元组的创建</h2><h3 id="通过（）创建元组，小括号可省略">通过（）创建元组，小括号可省略</h3><p>如果元组只有一个元素，则必须后面加逗号，这是因为解释器会把（1）解释为整数 1，（1，）解释为元组</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763430683088-86de8389-7b89-4d58-8ce0-a0b10b92f216.png" width="524" title="" crop="0,0,1,1" id="udf31d34f" class="ne-image"><h3 id="通过-tuple（）创建元组">通过 tuple（）创建元组</h3> <img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763430711835-5a054f46-f405-4883-8c97-d67acc153589.png" width="564" title="" crop="0,0,1,1" id="u8a9a9341" class="ne-image"><h2 id="总结">总结</h2><p>tuple（）可以接收列表，字符串，其他序列类型，迭代器等生成元组</p><p>list（）可以接收元组，字符串，其他序列类型，迭代器等生成列表</p><h2 id="元组的元素访问和计数">元组的元素访问和计数</h2><p>1， 元组的元素不能修改</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763430933712-9b581ca0-745d-4068-9037-83075a12c188.png" width="954" title="" crop="0,0,1,1" id="u1b8a603e" class="ne-image"><p>2， 元组的元素访问，index（），count（），切片等操作，和列表一样</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763430970384-4503113a-9376-491b-849b-328e1b0ae647.png" width="429" title="" crop="0,0,1,1" id="u4e137fbb" class="ne-image"><p>3， 列表关于排序的方法 list.sorted()是修改原列表对象，元组没有该方法，如果要对元组排序，只能使用内置函数 sorted（tupleObj），并生成新的列表对象</p><h1>zip</h1><p>zip（列表 1，列表 2,…）将多个列表对应位置的元素组合成为元组，并返回这个 zip 对象</p><p>如果各个迭代器的元素个数不一致，则返回列表长度与最短的对象相同</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763431289644-30c14666-b91a-48de-9348-4ce6e541757f.png" width="1018" title="" crop="0,0,1,1" id="u5706f334" class="ne-image"><h1>生成器推导式创建元组</h1><p>1 ，从形式上看，生成器推导式与列表推导式类似，只是生成器推导式使用小括号</p><p>2，列表推导式直接生成列表对象，生成器推导式生成的不是列表也不是元组，而是一个生成器对象</p><p>3，我们可以通过生成器对象，转化成列表或元组，也可以使用生成器对象的 <em>next</em>()方法进行遍历，或者直接作为迭代器对象来使用，不管什么方式使用，元素访问结束后，如果需要重新访问其中的元素，必须重新创建该生成器对象</p> <img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763431867802-5129ad36-0a15-46b5-882a-9971a7095834.png" width="831" title="" crop="0,0,1,1" id="u1f067430" class="ne-image"><h1>元组总结</h1><p>1，元组的核心特点是：不可变序列</p><p>2，元组的访问和处理速度比列表快</p><p>3，与整数和字符串一样，元组可以作为字典的键，列表则永远不能作为字典的键使用</p><p>字典是“键值对”的无序可变序列，字典中的每个元素都是一个”键值对“，包含”键对象“和”值对象“，可以通过”键对象“实现快速获取，删除，更新对应的”值对象“</p><p>字典是 Python 中唯一实现映射关系的内置类型</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763432107093-e7159089-84d6-4feb-b321-16094f7ecfdd.png" width="711" title="" crop="0,0,1,1" id="u1a60a059" class="ne-image"><p>列表中通过”下标数字”找到对应的对象，字典中通过”键对象“找到对应的”值对象“</p><p>1，”键“的任意的不可变数据，比如:整数，浮点数，字符串，元组</p><p>2，但是：列表，字典，集合这些可变对象，不能作为“键”</p><p>3，并且“键”不可重复</p><p>4，“值”可以是任意的数据，并且可以重复</p><h1>字典的创建</h1><p>1， 通过{},dict()来创建字典对象</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763432381704-69664de9-288b-4852-96eb-36785bf7421c.png" width="916" title="" crop="0,0,1,1" id="uc0248abb" class="ne-image"><p>2，通过 zip（）创建字典对象</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763432406142-b9e6b095-080b-4b7f-8a57-edb4237acc42.png" width="1060" title="" crop="0,0,1,1" id="u2ca8b0bd" class="ne-image"><p>3，通过 fromkeys 创建值为空的字典</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763432431845-445ab408-39cf-4558-822a-1d619ee006d8.png" width="1066" title="" crop="0,0,1,1" id="uaee6a43e" class="ne-image"><h1>集合创建和删除</h1><p>1.使用{}创建集合对象，并使用 add（）方法添加元素</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763452471442-20006c07-06f0-46d7-9421-dfb94f5cb936.png" width="526" title="" crop="0,0,1,1" id="u41298f16" class="ne-image"><p>2，使用 set（），将列表，元组等可迭代对象转成集合。如果原来数据存在重复数据，则只保留一个</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763452523877-67224417-463f-4139-9995-c9ea3cec5dde.png" width="574" title="" crop="0,0,1,1" id="ucaab0bd1" class="ne-image"><p>集合是 python 的基本数据类型，把不同的元素组合在一起便形成了集合，组成一个集合的成员称作该集合的元素（element）</p><p>集合分为两类：可变集合（set），不可变集合（frozenset）</p><p>可变集合可添加和删除元素，是非可哈希的，不能用作字典的键，也不能做其他集合的元素。</p><p>不可变集合与之相反</p><h2 id="可变集合的创建">可变集合的创建</h2><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766022355832-68f26faa-595a-422d-9fb7-952256aebd45.png" width="591" title="" crop="0,0,1,1" id="uf22f1063" class="ne-image"><p><strong><font style="color:#DF2A3F;">在一个集合中不能有相同的元素。相同的元素被自动删除</font></strong></p><h2 id="不可变集合创建">不可变集合创建</h2><p>创建不可变集合应使用 frozenset（）函数，不能使用大括号</p><p>不可变集合不能被修改</p><h1>集合的遍历</h1><p>因集合是无序的，不能使用索引来访问集合中的元素。可使用 for 循环可以遍历一个集合</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766022535556-bf06f4b0-de5c-4266-9287-11909e7a7be4.png" width="402" title="" crop="0,0,1,1" id="ufba3351d" class="ne-image"><p>元素访问的顺序依赖于它们在内部是如何存储的，输出中元素的顺序与创建集合时的顺序是不同的</p><p>无序使得可以实现高效的集合操作</p><p><strong>增加和删除集合元素</strong></p><p>如果要增加的元素没包含在集合中，它会被增加到集合中并且集合的大小加 1；</p><p>如果要增加的元素包含在集合中，则添加操作不会有效果，集合没有被修改。</p><p>如果元素存在，discard 方法会删除它，但是如果元素不是集合成员时，则不会有效果。</p><p>clear 方法删除集合中的所有元素，留下一个空集合</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766022701462-55233c47-b8ee-4069-a466-849fa6e3c353.png" width="397" title="" crop="0,0,1,1" id="uac8402b4" class="ne-image"><p>集合和列表都可以存储多个元素，两者不同：</p><ul><li>集合不能存储重复的元素</li><li>集合中的元素是无序的，不能通过下标运算符来访问元素</li><li>集合还支持如何判断集合关系以及四种集合运算</li><li>列表的存储方式为顺序存储，而集合采用的存储方式更加负责。这使得在执行查找元素和删除元素的操作时，使用集合比使用列表的效率高</li></ul><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766023343855-e51eabe7-9b39-41ca-999c-89c806f68cf1.png" width="1050" title="" crop="0,0,1,1" id="u6a0720fa" class="ne-image"><ul><li>list 用来存储任意大小的数据集合</li><li>一个列表中可以包含任意个数据，每个数据称为元素</li><li>列表是 Python 中使用最频繁的数据类型，它是放在方括号（[ ]）内，用逗号分隔的一系列元素</li><li>列表中元素的类型可以不同，它支持数字，字符串甚至可以包含列表。换言之，列表允许嵌套</li></ul><h2 id="列表的创建">列表的创建</h2><p>1，变量名 = [ value1,value2,…]</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1765961758285-db5222a4-58a6-4585-8012-18be5c0a9694.png" width="576" title="" crop="0,0,1,1" id="u0787898e" class="ne-image"><p>2，通过 python 内置的 list 类的构造函数来创建列表</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1765961853975-b932199f-e38d-4189-83f9-9a3406ff84e3.png" width="603" title="" crop="0,0,1,1" id="u70b29c37" class="ne-image"><p>使用 list（）可以将任何可迭代的数据转换成列表</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1765961882439-b5e24d53-a60f-45fe-84c4-d29aef5a6993.png" width="577" title="" crop="0,0,1,1" id="u87fa52bb" class="ne-image"><h2 id="列表元素的访问">列表元素的访问</h2><p>通过下标运算符来访问元素。下标从 0 开始</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1765961969186-3568e6cf-187a-4a44-a8a6-cd3c7d526340.png" width="490" title="" crop="0,0,1,1" id="u922dcdcf" class="ne-image"><p>python 可以使用负数下标访问列表元素。负数下标提供了按相反顺序访问元素的方法</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1765962021627-f5f5a6ce-4ad8-4254-8e3f-3d528a377583.png" width="502" title="" crop="0,0,1,1" id="u66ad652d" class="ne-image"><p>一般地，负数下标的有效范围介于-1 和-len（列表变量）之间</p><p>列表的切片（list slicing）</p><p>列表的切片操作使用 list[start: end] 来返回列表 list 的一个片段，这个片段是原列表从下标 start 到 end-1 的元素所构成的一个新列表</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1765962202845-42607b9e-e037-4e44-a1e6-60adfebcda72.png" width="244" title="" crop="0,0,1,1" id="u2212949b" class="ne-image"><p>起始下标和结束下标可以省略</p><p>如果省略起始下标，则起始下标默认为 0；</p><p>如果省略结束下标，则结束下标默认为列表长度，即截取到列表的最好一个元素</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1765962211605-4c6e871d-853e-4baf-9497-59deb9324dd1.png" width="711" title="" crop="0,0,1,1" id="ud298459a" class="ne-image"><h3 id="list-start-end-step">list[start: end: step]</h3><p>step：正负数均可，其绝对值大小决定了切取数据时的“步长”，而正负号决定了“切取方向”，正表示“从左往右”取值，负表示“从右往左”取值。当 step 省略时，默认为 1，即从左往右以增量 1 取值</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766018130761-73c127b5-0686-48d5-8818-34d0c73a4d1b.png" width="743" title="" crop="0,0,1,1" id="u2fad1b8c" class="ne-image"><p>列表的内置函数与其他方法</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766018344987-242d4d91-3c48-4c13-ba27-1ed18a19ebdf.png" width="516" title="" crop="0,0,1,1" id="u634fb39f" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766018355397-4b391986-3396-41e3-a3ee-fa9e0794a368.png" width="547" title="" crop="0,0,1,1" id="u7cff749d" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766018415520-e7b0c3ed-8281-4839-8019-c81d8cc8362a.png" width="1102" title="" crop="0,0,1,1" id="u42eb0587" class="ne-image"><h2 id="增">增</h2><p><font style="background-color:#FBDE28;">append（）添加元素</font></p><p><font style="background-color:#FBDE28;">在列表的末尾来添加一个指定的元素</font></p><p><font style="background-color:#FBDE28;">缺点：每次只能添加一个元素</font></p><p><font style="color:#DF2A3F;">extend（）允许直接添加一个可迭代对象</font></p><p><font style="background-color:#C1E77E;">insert（）在列表的任意位置来添加数据</font></p><p><font style="background-color:#C1E77E;">有两个参数：1，指定待插入的位置</font></p><p><font style="background-color:#C1E77E;">2，指定待插入的元素</font></p><h2 id="删">删</h2><p>remove（）将指定的元素删除</p><ul><li>如果列表中存在多个匹配的元素，那么它只会删除第一个</li><li>如果指定的元素不存在，那么程序就会报错</li></ul><p>pop（）删除某个位置上的元素</p><p>参数是元素的下标索引值</p><p>sort（）直接实现排序</p><p>reverse（）从大到小排序，原地反转列表中的元素</p><p>s.sort(key=None,reverse=False)----&gt;对列表中的元素进行原地排序（key参数用于指定一个用于比较的函数；reverse参数用于指定排序结果是否反转</p><h2 id="查">查</h2><p>count（）查找某个元素出现的次数</p><p>index（） 查找某个元素的索引值</p><p>index（x，start，end）指定查找的开始和结束位置</p><p>copy（）拷贝一个列表</p>]]></content>
    
    
      
      
    <summary type="html">&lt;img src=&quot;https://cdn.nlark.com/yuque/0/2025/png/50252276/1763384554145-0af66bda-5ca1-4ae2-9eb9-b36074ea0fd2.png&quot; width=&quot;500&quot; title=&quot;&quot; crop=</summary>
      
    
    
    
    <category term="-python笔记" scheme="http://www.ububan.github.io/categories/python%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>脚本条件判断</title>
    <link href="http://www.ububan.github.io/posts/63534.html"/>
    <id>http://www.ububan.github.io/posts/63534.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T02:51:26.178Z</updated>
    
    <content type="html"><![CDATA[<img src="https://cdn.nlark.com/yuque/0/2025/jpeg/50252276/1758871350319-98a4fce3-715b-47d5-a0d2-3d35b68f82e9.jpeg" width="3341" title="" crop="0,0,1,1" id="u9e6c4953" class="ne-image"><h1>条件测试命令</h1><h4 id="按照文件类型判断">按照文件类型判断</h4><p>在选项后加文件名，可以判断文件（若存在）类型是否符合条件，若文件不存在直接返回假，符合条件返回真，具体文件类型判断符与 ls 命令结果中文件属性第一位相似</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[选项 文件名]</span><br><span class="line">echo #?</span><br></pre></td></tr></table></figure><table><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td>-b</td><td>判断文件（若存在（下同））是否为块设备文件（是为真（下同））</td></tr><tr><td>-c</td><td>判断文件是否为字符设备文件</td></tr><tr><td>-d</td><td>判断文件是否为目录文件</td></tr><tr><td>-e</td><td>exist 仅判断文件是否存在</td></tr><tr><td>-f</td><td>file 判断文件是否为普通文件</td></tr><tr><td>-L</td><td>判断文件是否为符号链接文件</td></tr><tr><td>-p</td><td>判断文件是否为管道文件</td></tr><tr><td>-s</td><td>判断文件是否为非空（非空为真）</td></tr><tr><td>-S</td><td>判断文件是否为套接字文件</td></tr></tbody></table><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">-a FILE</span><br><span class="line">如果文件存在，则为 True。</span><br><span class="line">-b FILE</span><br><span class="line">如果文件是特殊块，则为 True。</span><br><span class="line">-c FILE</span><br><span class="line">如果文件是特殊字符，则为 True。</span><br><span class="line">-d FILE</span><br><span class="line">如果文件是目录，则为 True。</span><br><span class="line">-e FILE</span><br><span class="line">如果文件存在，则为 True。</span><br><span class="line">-f FILE</span><br><span class="line">如果文件存在且是普通文件，则为 True。</span><br><span class="line">-g FILE</span><br><span class="line">如果文件是 <span class="built_in">set</span>-group-id 则为 True。</span><br><span class="line">-h FILE</span><br><span class="line">如果文件是符号链接，则为 True。</span><br><span class="line">-L FILE</span><br><span class="line">如果文件是符号链接，则为 True。</span><br><span class="line">-k FILE</span><br><span class="line">如果文件的 <span class="string">&quot;粘性 &quot;</span>位已设置，则为 True。</span><br><span class="line">-p FILE</span><br><span class="line">如果文件是已命名的管道，则为 True。</span><br><span class="line">-r FILE</span><br><span class="line">如果您可以读取文件，则为 True。</span><br><span class="line">-s FILE</span><br><span class="line">如果文件存在且不为空，则为 True。</span><br><span class="line">-S FILE</span><br><span class="line">如果文件是套接字，则为 True。</span><br><span class="line">-t FD</span><br><span class="line">如果 FD 在终端上打开，则为 True。</span><br><span class="line">-u FILE</span><br><span class="line">如果文件是 <span class="built_in">set</span>-user-id 则为 True。</span><br><span class="line">-w FILE</span><br><span class="line">如果文件可由您写入，则为 True。</span><br><span class="line">-x FILE</span><br><span class="line">如果文件有执行权限，则为 <span class="string">&quot;true&quot;</span>。</span><br><span class="line">-O FILE</span><br><span class="line">如果文件所属者是你，则为 True。</span><br><span class="line">-G FILE</span><br><span class="line">如果文件所属组是你，则为 True。</span><br><span class="line">-N FILE</span><br><span class="line">如果文件自上次读取后已被修改，则为 True。</span><br><span class="line">FILE1 -nt FILE2 如果文件 <span class="number">1</span> 比文件 <span class="number">2</span> 新（根据修改日期），则为True。</span><br><span class="line">FILE1 -ot FILE2 如果文件 <span class="number">1</span> 比文件 <span class="number">2</span> 早，则为 True。</span><br><span class="line">FILE1 -ef FILE2 如果文件 <span class="number">1</span> 是文件 <span class="number">2</span> 的硬链接，则为 True。</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">-z STRING</span><br><span class="line">#如果字符串为空，则为 True。</span><br><span class="line">-n STRING</span><br><span class="line">#如果字符串不为空，则为 True。</span><br><span class="line">STRING1 = STRING2 如果字符串相等，则为 True。</span><br><span class="line">STRING1 != STRING2 如果字符串不相等，则为 True。</span><br><span class="line">STRING1 &lt; STRING2 如果 STRING1 按顺序排列在 STRING2 之前，则为 True。</span><br><span class="line">STRING1 &gt; STRING2 如果 STRING1 按顺序排列在 STRING2 之后，则为 True。</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">-o OPTION </span><br><span class="line">#如果 shell 选项 OPTION 已启用，则为 True。</span><br><span class="line">-v VAR</span><br><span class="line">#如果 shell 变量 VAR 已设置，则为 True。</span><br><span class="line">-R VAR</span><br><span class="line">#如果 shell 变量 VAR 已设置且是名称引用，则为True。</span><br><span class="line">! EXPR</span><br><span class="line">#如果 expr 为假，则为 True。</span><br><span class="line">EXPR1 -a EXPR2 如果 expr1 和 expr2 均为真，则为真。</span><br><span class="line">EXPR1 -o EXPR2 如果 expr1 或 expr2 为真，则为 True。</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">-eq 是否等于</span><br><span class="line">-ne 是否不等于</span><br><span class="line">-gt 是否大于</span><br><span class="line">-ge 是否大于等于</span><br><span class="line">-lt 是否小于</span><br><span class="line">-le 是否小于等于</span><br></pre></td></tr></table></figure><h2 id="字符串测试">字符串测试</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">test和 [ ]用法</span><br><span class="line">-z STRING 字符串是否为空，没定义或空为真，不空为假，</span><br><span class="line">-n STRING 字符串是否不空，不空为真，空为假</span><br><span class="line">STRING1 = STRING2 是否等于，注意 = 前后有空格</span><br><span class="line">STRING1 != STRING2 是否不等于</span><br><span class="line">&gt; ascii码是否大于ascii码</span><br><span class="line">&lt; 是否小于</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[[ expression ]] 用法</span><br><span class="line">== 左侧字符串是否和右侧的PATTERN相同</span><br><span class="line">注意:此表达式用于[[ ]]中，PATTERN为通配符</span><br><span class="line">=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配</span><br><span class="line">注意: 此表达式用于[[ ]]中；扩展的正则表达式</span><br></pre></td></tr></table></figure><p>建议：当使用正则表达式或通配符使用[[ ]]，其它情况一般使用 [ ]</p><h2 id="文件测试">文件测试</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">-a FILE：同 -e</span><br><span class="line">-e FILE: 文件存在性测试，存在为真，否则为假</span><br><span class="line">-b FILE：是否存在且为块设备文件</span><br><span class="line">-c FILE：是否存在且为字符设备文件</span><br><span class="line">-d FILE：是否存在且为目录文件</span><br><span class="line">-f FILE：是否存在且为普通文件</span><br><span class="line">-h FILE 或 -L FILE：存在且为符号链接文件</span><br><span class="line">-p FILE：是否存在且为命名管道文件-S FILE：是否存在且为套接字文件</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">-r FILE：是否存在且可读</span><br><span class="line">-w FILE: 是否存在且可写</span><br><span class="line">-x FILE: 是否存在且可执行</span><br><span class="line">-u FILE：是否存在且拥有suid权限</span><br><span class="line">-g FILE：是否存在且拥有sgid权限</span><br><span class="line">-k FILE：是否存在且拥有sticky权限</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">-s FILE #是否存在且非空</span><br><span class="line">-t fd <span class="meta">#fd 文件描述符是否在某终端已经打开</span></span><br><span class="line">-N FILE #文件自从上一次被读取之后是否被修改过</span><br><span class="line">-O FILE #当前有效用户是否为文件属主-G FILE #当前有效用户是否为文件属组</span><br><span class="line">FILE1 -ef FILE2 #FILE1是否是FILE2的硬链接</span><br><span class="line">FILE1 -nt FILE2 #FILE1是否新于FILE2（mtime）</span><br><span class="line">FILE1 -ot FILE2 #FILE1是否旧于FILE2</span><br></pre></td></tr></table></figure><h4 id="按照文件权限判断">按照文件权限判断</h4><p>同样要在选项后加文件名，有权限为真，无权限或文件不存在为假。（判断的是当前用户对这个文件的权限）</p><table><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td>-r</td><td>判断对该文件是否有读权限</td></tr><tr><td>-w</td><td>判断对该文件是否有写权限</td></tr><tr><td>-x</td><td>判断对该文件是否有执行权限</td></tr><tr><td>-u</td><td>判断对该文件是否有 SUID 权限</td></tr><tr><td>-g</td><td>判断对该文件/目录是否有 SGID 权限</td></tr><tr><td>-k</td><td>判断对该目录是否有 SBIT 权限</td></tr></tbody></table><h3 id="比较两个文件的信息">比较两个文件的信息</h3><p>格式：文件 1 [ 选项 ] 文件 2</p><table><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td>-nt</td><td>newer than 判断文件 1 的最后修改时间是否比文件 2 晚，晚为真（0）</td></tr><tr><td>-ot</td><td>older than 判断文件 1 的最后修改时间是否比文件 2 早，早为真（0）</td></tr><tr><td>-ef</td><td>判断两个文件的 inode 号是否一致，近似为两个文件是否相同</td></tr></tbody></table><p>其中，Inode 号是标识文件的序号，两个不同的文件可以名称相同，但 inode 号不能相同，若两个文件为硬链接（保存为副本，同步更新）关系，则两个文件的 inode 号才会相同，其余不同</p><p>两个硬链接的文件，除了 inode 号相同外没有任何标志，可以使用这个判断方式判断硬链接</p><h3 id="比较两个整数">比较两个整数</h3><p>若为两个变量，不需要声明为整型格式，语法：整数 1 [ 选项 ] 整数 2</p><table><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td>-eq</td><td>equal 判断两个整数是否相等</td></tr><tr><td>-ne</td><td>not equal 判断两个整数是否不相等</td></tr><tr><td>-gt</td><td>greater than 判断整数 1 是否大于整数 2</td></tr><tr><td>-lt</td><td>less than 判断整数 1 是否小于整数 2</td></tr><tr><td>-ge</td><td>greater/equal 判断整数 1 是否大于等于整数 2</td></tr><tr><td>-le</td><td>less/equal 判断整数 1 是否小于等于整数 2</td></tr></tbody></table><h3 id="判断字符串相关">判断字符串相关</h3><p>语法包含在选项中，注意：两个字符串比较相关的判断符两边都要加空格，否则无论如何，返回值均为真</p><table><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td>-z 字符串</td><td>判断字符串是否为空</td></tr><tr><td>-n 字符串</td><td>判断字符串是否非空</td></tr><tr><td>字符串 1==字符串 2</td><td>判断字符串是否</td></tr></tbody></table><p>当字符串是变量时，如果变量没有定义，则同样视作空字符串</p><h3 id="两个判断条件的逻辑关系">两个判断条件的逻辑关系</h3><p>同时使用两个判断条件时，要注意它们之间的逻辑关系，两个判断关系的格式：条件 1【选项】条件 2</p><table><thead><tr><th>选项</th><th>作用</th></tr></thead><tbody><tr><td>-a</td><td>逻辑与，两个条件都成立才成立</td></tr><tr><td>-o</td><td>逻辑或，两个条件有一个成立就成立</td></tr><tr><td>！[ 条件 ]</td><td>逻辑非，使判断结果取反（注意，！与条件之间有空格）</td></tr></tbody></table><h1>条件判断语句基础</h1><p><font style="color:rgb(51, 51, 51);">条件判断语句是编程语言中的基本构造之一，它允许程序在满足特定条件时执行不同的代码块。在 Linux shell 脚本中，常见的条件判断语句包括 </font><code>&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(246, 246, 246);&quot;&gt;if&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(246, 246, 246);&quot;&gt;then&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(246, 246, 246);&quot;&gt;else if&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">、</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(246, 246, 246);&quot;&gt;else&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);"> 以及 </font><code>&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(246, 246, 246);&quot;&gt;fi&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);">（</font><code>&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(246, 246, 246);&quot;&gt;if&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);"> 的倒置）。这些语句能够根据表达式的真假来决定执行哪些命令。</font></p><h2 id="if-语句">if 语句</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ 条件 ]; then</span><br><span class="line">  # 条件为真时执行的命令</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="使用-else">使用 else</h2><p>当你需要根据条件的真假来选择两个不同的动作时，可以使用 else 语句：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ 条件 ]; then</span><br><span class="line">  # 条件为真时执行的命令</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  # 条件为假时执行的命令</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="使用-elif">使用 elif</h2><p>如果你有多个条件需要判断，可以使用 elif（else if 的简写）来扩展 if 语句：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ 条件<span class="number">1</span> ]; then</span><br><span class="line">  # 条件<span class="number">1</span>为真时执行的命令</span><br><span class="line">elif [ 条件<span class="number">2</span> ]; then</span><br><span class="line">  # 条件<span class="number">1</span>为假且条件<span class="number">2</span>为真时执行的命令</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  # 上述条件都不为真时执行的命令</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="检查文件属性">检查文件属性</h2><p>检查文件是否存在，是否为空，是否可读等属性是常见的操作</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"># 检查文件是否存在</span><br><span class="line"><span class="keyword">if</span> [ -f <span class="string">&quot;/path/to/file&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;文件存在&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;文件不存在&quot;</span></span><br><span class="line">fi</span><br><span class="line"></span><br><span class="line"># 检查文件是否为空</span><br><span class="line"><span class="keyword">if</span> [ ! -s <span class="string">&quot;/path/to/file&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;文件为空&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;文件不为空&quot;</span></span><br><span class="line">fi</span><br><span class="line"></span><br><span class="line"># 检查文件是否可读</span><br><span class="line"><span class="keyword">if</span> [ -r <span class="string">&quot;/path/to/file&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;文件可读&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;文件不可读&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="比较字符串">比较字符串</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"># 比较两个字符串是否相等</span><br><span class="line">str1=<span class="string">&quot;Hello&quot;</span></span><br><span class="line">str2=<span class="string">&quot;World&quot;</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="string">&quot;$str1&quot;</span> == <span class="string">&quot;$str2&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;字符串相等&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;字符串不相等&quot;</span></span><br><span class="line">fi</span><br><span class="line"></span><br><span class="line"># 检查字符串是否为空</span><br><span class="line">str3=<span class="string">&quot;&quot;</span></span><br><span class="line"><span class="keyword">if</span> [ -z <span class="string">&quot;$str3&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;字符串为空&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;字符串不为空&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="比较数值">比较数值</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># 比较两个数值大小</span><br><span class="line">num1=<span class="number">10</span></span><br><span class="line">num2=<span class="number">20</span></span><br><span class="line"><span class="keyword">if</span> [ $num1 -eq $num2 ]; then</span><br><span class="line">  echo <span class="string">&quot;数值相等&quot;</span></span><br><span class="line">elif [ $num1 -lt $num2 ]; then</span><br><span class="line">  echo <span class="string">&quot;num1 小于 num2&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;num1 大于 num2&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="处理用户输入">处理用户输入</h2><p>编写一个脚本时，需要根据用户的输入来决定执行哪些操作</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line"></span><br><span class="line"># 获取用户输入的参数</span><br><span class="line">user_input=$<span class="number">1</span></span><br><span class="line"></span><br><span class="line"># 使用条件判断来处理不同的输入</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">&quot;$user_input&quot;</span> == <span class="string">&quot;hello&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;Hello, world!&quot;</span></span><br><span class="line">elif [ <span class="string">&quot;$user_input&quot;</span> == <span class="string">&quot;bye&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;Goodbye!&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;Unknown command&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="自动化任务中的条件判断">自动化任务中的条件判断</h2><p>在自动化任务中，条件判断语句可以用来检查任务是否按照预期执行</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line"></span><br><span class="line">backup_dir=<span class="string">&quot;/path/to/backup&quot;</span></span><br><span class="line"></span><br><span class="line"># 检查备份目录是否存在</span><br><span class="line"><span class="keyword">if</span> [ ! -d <span class="string">&quot;$backup_dir&quot;</span> ]; then</span><br><span class="line">  echo <span class="string">&quot;备份目录不存在，正在创建...&quot;</span></span><br><span class="line">  mkdir -p <span class="string">&quot;$backup_dir&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;备份目录已存在.&quot;</span></span><br><span class="line">fi</span><br><span class="line"></span><br><span class="line"># 执行备份操作</span><br><span class="line"># ...</span><br></pre></td></tr></table></figure><h2 id="监控系统资源">监控系统资源</h2><p>条件判断语句也常用于监控系统资源，如 CPU 使用率，磁盘空间等</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line"></span><br><span class="line"># 获取CPU使用率</span><br><span class="line">cpu_usage=$(top -bn1 | grep <span class="string">&quot;Cpu(s)&quot;</span> | sed <span class="string">&quot;s/.*, *\([0-9.]*\)%* id.*/\1/&quot;</span> | awk <span class="string">&#x27;&#123;print 100 - $1&#125;&#x27;</span>)</span><br><span class="line"></span><br><span class="line"># 判断CPU使用率是否超过预设阈值</span><br><span class="line">threshold=<span class="number">80</span></span><br><span class="line"><span class="keyword">if</span> (( $(echo <span class="string">&quot;$cpu_usage &gt; $threshold&quot;</span> | bc -l) )); then</span><br><span class="line">  echo <span class="string">&quot;警告: CPU使用率超过$&#123;threshold&#125;%!&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;CPU使用率正常.&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="网络连接测试">网络连接测试</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line"></span><br><span class="line"># 定义要检查的网络地址</span><br><span class="line">network_address=<span class="string">&quot;google.com&quot;</span></span><br><span class="line"></span><br><span class="line"># 使用ping命令测试网络连接</span><br><span class="line"><span class="keyword">if</span> ping -c <span class="number">4</span> <span class="string">&quot;$network_address&quot;</span> &amp;&gt; /dev/null; then</span><br><span class="line">  echo <span class="string">&quot;网络连接正常，$network_address 可达。&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;网络连接异常，$network_address 不可达。&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="服务状态检查">服务状态检查</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line"></span><br><span class="line"># 定义要检查的服务名称</span><br><span class="line">service_name=<span class="string">&quot;sshd&quot;</span></span><br><span class="line"></span><br><span class="line"># 检查服务是否正在运行</span><br><span class="line"><span class="keyword">if</span> systemctl is-active --quiet <span class="string">&quot;$service_name&quot;</span>; then</span><br><span class="line">  echo <span class="string">&quot;$service_name 服务正在运行。&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;$service_name 服务未运行，正在尝试重启...&quot;</span></span><br><span class="line">  systemctl restart <span class="string">&quot;$service_name&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="文件内容处理">文件内容处理</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line"></span><br><span class="line"># 定义日志文件路径</span><br><span class="line">log_file=<span class="string">&quot;/var/log/syslog&quot;</span></span><br><span class="line"></span><br><span class="line"># 检查日志文件中是否包含特定错误信息</span><br><span class="line">error_message=<span class="string">&quot;Error: Out of Memory&quot;</span></span><br><span class="line"><span class="keyword">if</span> grep -q <span class="string">&quot;$error_message&quot;</span> <span class="string">&quot;$log_file&quot;</span>; then</span><br><span class="line">  echo <span class="string">&quot;检测到错误信息，发送通知。&quot;</span></span><br><span class="line">  # 在这里添加发送通知的代码</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;日志文件中没有检测到错误信息。&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h2 id="系统更新检查">系统更新检查</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line"></span><br><span class="line"># 检查是否有可用的系统更新</span><br><span class="line"><span class="keyword">if</span> apt-get update &amp;&amp; apt-get upgrade -s | grep -q <span class="string">&quot;upgradable&quot;</span>; then</span><br><span class="line">  echo <span class="string">&quot;有可用的系统更新，正在应用更新...&quot;</span></span><br><span class="line">  apt-get upgrade -y</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  echo <span class="string">&quot;当前没有可用的系统更新。&quot;</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;img src=&quot;https://cdn.nlark.com/yuque/0/2025/jpeg/50252276/1758871350319-98a4fce3-715b-47d5-a0d2-3d35b68f82e9.jpeg&quot; width=&quot;3341&quot; title=&quot;&quot; cr</summary>
      
    
    
    
    <category term="-linux笔记" scheme="http://www.ububan.github.io/categories/linux%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>GUI图形用户界面编程</title>
    <link href="http://www.ububan.github.io/posts/12234.html"/>
    <id>http://www.ububan.github.io/posts/12234.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T03:35:36.904Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-Tkinter">1. Tkinter</h2><p>tkinter (Tk interface)是python 的标准 GUI 库，支持跨平台的GUI 程序开发</p><p>Tkinter适合小型的GUI程序编写，也特别适合初学者学习GUI 编程。本书以 Tkinter为核心进行讲解。</p><h2 id="2-wxpython">2.wxpython</h2><p>wxpython是比较流行的GUI 库，适合大型应用程序开发，功能强于 Tkinter</p><p>整体设计框架类似于MFC(Microsoft Foundation  Classes 微软基础类库</p><h2 id="3-PyQT是QT的工具包，QT是开源的GUI">3,PyQT是QT的工具包，QT是开源的GUI</h2><p>基于 tkinter 模块创建 GUI 程序包含如下 4 个核心步骤：</p><p><strong>1，创建应用程序主窗口对象（也称：根窗口）</strong></p><p>（1）通过类 Tk 的无参构造函数</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">from tkinter import*</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">root = Tk()</span><br></pre></td></tr></table></figure><p><strong>2,在主窗口中，添加各种可视化组件，比如：按钮（Button），文本框（Label）等</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">btn01 = Button(root)</span><br><span class="line"></span><br><span class="line">btn01[<span class="string">&quot;text&quot;</span>] =<span class="string">&quot;点我就送花&quot;</span></span><br></pre></td></tr></table></figure><p><strong>3,通过几何布局管理器，管理组件的大小和位置</strong></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">btn01.pack()</span><br></pre></td></tr></table></figure><p>4**，事件处理**</p><p>（1）通过绑定事件处理程序，响应用户操作所触发的事件（比如：单击，双击等）</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">def <span class="title function_">songhua</span><span class="params">(e)</span>:</span><br><span class="line"></span><br><span class="line">    messagebox.<span class="title function_">showinfo</span><span class="params">(<span class="string">&quot;Message&quot;</span>,<span class="string">&quot;送你一朵玫瑰花&quot;</span>)</span></span><br><span class="line">    <span class="title function_">print</span><span class="params">(<span class="string">&quot;送你99朵玫瑰花&quot;</span>)</span></span><br><span class="line"></span><br><span class="line">btn01.<span class="title function_">bind</span><span class="params">(<span class="string">&quot;&lt;Button-1&gt;&quot;</span>,songhua)</span></span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">from tkinter import *</span><br><span class="line">from tkinter import messagebox</span><br><span class="line">root = Tk()</span><br><span class="line"></span><br><span class="line">btn01 = Button(root)</span><br><span class="line">btn01[<span class="string">&quot;text&quot;</span>] = <span class="string">&quot;点我就送花&quot;</span></span><br><span class="line"></span><br><span class="line">btn01.pack()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def songhua(e):    <span class="meta"># e就是事件对象</span></span><br><span class="line">    messagebox.showinfo(<span class="string">&quot;Message&quot;</span>, <span class="string">&quot;送你一朵玫瑰花&quot;</span>)</span><br><span class="line">    print(<span class="string">&quot;送你99朵玫瑰花&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">btn01.bind(<span class="string">&quot;&lt;Button-1&gt;&quot;</span>, songhua)</span><br><span class="line"></span><br><span class="line">root.mainloop()    #调用组件的mainloop()方法，进入事件循环</span><br></pre></td></tr></table></figure><h2 id="可变参数">可变参数</h2><p>指的是”可变数量的参数“，分两种情况</p><p>1，*param（一个星号），将多个参数收集到一个”元组“对象中</p><p>2，**param（两个星号），将多个参数收集到一个”字典“对象中</p><h2 id="特殊方法和运算符重载">特殊方法和运算符重载</h2><p>python 的 运算符实际上是通过调用对象的特殊方法实现的，比如：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">a = <span class="number">20</span></span><br><span class="line">b = <span class="number">30</span></span><br><span class="line">c = a+b</span><br><span class="line">d = a.__add__(b)</span><br><span class="line">print(<span class="string">&quot;c=&quot;</span>,c)</span><br><span class="line">print(<span class="string">&quot;d=&quot;</span>,d)</span><br></pre></td></tr></table></figure><h2 id="Entry-单行文本框">Entry 单行文本框</h2><p>Entry 用来接收一行字符串的控件。如果用户输入的文字长度长于 Entry 控件的宽度时，文字会自动向后滚动。如果想输入多行文本，需要使用 Text 控件</p><img src="https://54325432.s3.bitiful.net/image%20%2820%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T032700Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=50d87611452a5e4e337478e6d18301e33668f521ae4d99499e6e1969988235ed" width="411" title="" crop="0,0,1,1" id="u66b47be9" class="ne-image"><h1>Text 多行文本框</h1><p>主要用于显示多行文本，还可以显示网页链接，图片，HTML 页面，甚至 CSS 样式表，添加组件等。因此，也常 被当做简单的文本处理器，文本编辑器或者网页浏览器来使用。比如 IDLE 就是 Text 组件构成的.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">from tkinter import *</span><br><span class="line">import webbrowser</span><br><span class="line"></span><br><span class="line">class <span class="title function_">Application</span><span class="params">(Frame)</span>:</span><br><span class="line"></span><br><span class="line">    def __<span class="title function_">init__</span><span class="params">(self, master=None)</span>:</span><br><span class="line">        <span class="title function_">super</span><span class="params">()</span>.__<span class="title function_">init__</span><span class="params">(master)</span>    <span class="meta">#super()代表的是父类的定义，而不是父类对象</span></span><br><span class="line">        self.master = master</span><br><span class="line">        self.pack()</span><br><span class="line">        self.createWidget()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    def <span class="title function_">createWidget</span><span class="params">(self)</span>:</span><br><span class="line">        self.w1 = Text(root, width=<span class="number">40</span>, height=<span class="number">12</span>, bg=<span class="string">&quot;gray&quot;</span>)</span><br><span class="line">        self.w1.pack()</span><br><span class="line"></span><br><span class="line">        self.w1.insert(<span class="number">1.0</span>, <span class="string">&quot;0123456789\nabcdefg&quot;</span>)</span><br><span class="line">        self.w1.insert(<span class="number">2.3</span>, <span class="string">&quot;锄禾日当午，汗滴禾下土。谁知盘中餐，粒粒皆辛苦\n&quot;</span>)</span><br><span class="line"></span><br><span class="line">        Button(self, text=<span class="string">&quot;重复插入文本&quot;</span>,command=self.insertText).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        Button(self, text=<span class="string">&quot;返回文本&quot;</span>, command=self.returnText).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        Button(self, text=<span class="string">&quot;添加组件&quot;</span>, command=self.addWidget).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        Button(self, text=<span class="string">&quot;通过tag精确控制文本&quot;</span>, command=self.testTag).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">insertText</span><span class="params">(self)</span>:</span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(INSERT, <span class="string">&#x27;Gaoqi&#x27;</span>)</span></span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(END, <span class="string">&#x27;[sxt]&#x27;</span>)</span></span><br><span class="line"></span><br><span class="line">    def <span class="title function_">returnText</span><span class="params">(self)</span>:</span><br><span class="line">        <span class="title function_">print</span><span class="params">(self.w1.get(<span class="number">1.2</span>, <span class="number">1.6</span>))</span></span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(<span class="number">1.8</span>, <span class="string">&quot;gaoqi&quot;</span>)</span></span><br><span class="line">        <span class="title function_">print</span><span class="params">(<span class="string">&quot;所有文本内容: \n&quot;</span>+self.w1.get(<span class="number">1.0</span>, END))</span></span><br><span class="line"></span><br><span class="line">    def <span class="title function_">addWidget</span><span class="params">(self)</span>:</span><br><span class="line">        b1 = Button(self.w1, text=<span class="string">&#x27;爱尚学堂&#x27;</span>)</span><br><span class="line">        self.w1.window_create(INSERT, window=b1)</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">testTag</span><span class="params">(self)</span>:</span><br><span class="line">        self.w1.<span class="title function_">delete</span><span class="params">(<span class="number">1.0</span>,END)</span></span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(INSERT,<span class="string">&quot;good good study,day day up!\n北京尚学堂\n百战程序员\n百度，搜一下就知道了&quot;</span>)</span></span><br><span class="line">        self.w1.<span class="title function_">tag_add</span><span class="params">(<span class="string">&quot;good&quot;</span>,<span class="number">1.0</span>, <span class="number">1.9</span>)</span></span><br><span class="line">        self.w1.<span class="title function_">tag_config</span><span class="params">(<span class="string">&quot;good&quot;</span>, background=<span class="string">&quot;yellow&quot;</span>, foreground=<span class="string">&quot;red&quot;</span>)</span></span><br><span class="line"></span><br><span class="line">        self.w1.<span class="title function_">tag_add</span><span class="params">(<span class="string">&quot;baidu&quot;</span>, <span class="number">4.0</span>, <span class="number">4.2</span>)</span></span><br><span class="line">        self.w1.<span class="title function_">tag_config</span><span class="params">(<span class="string">&quot;baidu&quot;</span>, underline=True)</span></span><br><span class="line">        self.w1.<span class="title function_">tag_bind</span><span class="params">(<span class="string">&quot;baidu&quot;</span>, <span class="string">&quot;&lt;Button-1&gt;&quot;</span>, self.webshow)</span></span><br><span class="line"></span><br><span class="line">    def <span class="title function_">webshow</span><span class="params">(self,event)</span>:</span><br><span class="line">        webbrowser.<span class="title function_">open</span><span class="params">(<span class="string">&quot;http://www.baidu.com&quot;</span>)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.geometry(<span class="string">&quot;450x300+200+300&quot;</span>)</span><br><span class="line">    app = Application(master=root)</span><br><span class="line">    root.mainloop()</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;background-color:#FBDE28;">以上代码存在问题：</font></p><img src="https://54325432.s3.bitiful.net/image%20%2831%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T032834Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=ffd2e05a54584c6eaf6d98c2183af3f53b97ab4734956c4d465de3472e2d704d" width="448" title="" crop="0,0,1,1" id="u5fcab292" class="ne-image"><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line">from tkinter import *</span><br><span class="line">import webbrowser</span><br><span class="line"></span><br><span class="line">class <span class="title function_">Application</span><span class="params">(Frame)</span>:</span><br><span class="line"></span><br><span class="line">    def __<span class="title function_">init__</span><span class="params">(self, master=None)</span>:</span><br><span class="line">        <span class="title function_">super</span><span class="params">()</span>.__<span class="title function_">init__</span><span class="params">(master)</span>    <span class="meta"># super()代表的是父类的定义，而不是父类对象</span></span><br><span class="line">        self.master = master</span><br><span class="line">        self.pack()</span><br><span class="line">        self.createWidget()</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">createWidget</span><span class="params">(self)</span>:</span><br><span class="line">        # 修改这里：将父容器从 root 改为 self</span><br><span class="line">        self.w1 = Text(self, width=<span class="number">40</span>, height=<span class="number">12</span>, bg=<span class="string">&quot;gray&quot;</span>)  # 改为 self</span><br><span class="line">        self.w1.pack()</span><br><span class="line"></span><br><span class="line">        self.w1.insert(<span class="number">1.0</span>, <span class="string">&quot;0123456789\nabcdefg&quot;</span>)</span><br><span class="line">        self.w1.insert(<span class="number">2.3</span>, <span class="string">&quot;锄禾日当午，汗滴禾下土。谁知盘中餐，粒粒皆辛苦\n&quot;</span>)</span><br><span class="line"></span><br><span class="line">        Button(self, text=<span class="string">&quot;重复插入文本&quot;</span>, command=self.insertText).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        Button(self, text=<span class="string">&quot;返回文本&quot;</span>, command=self.returnText).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        Button(self, text=<span class="string">&quot;添加组件&quot;</span>, command=self.addWidget).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        Button(self, text=<span class="string">&quot;通过tag精确控制文本&quot;</span>, command=self.testTag).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">insertText</span><span class="params">(self)</span>:</span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(INSERT, <span class="string">&#x27;Gaoqi&#x27;</span>)</span></span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(END, <span class="string">&#x27;[sxt]&#x27;</span>)</span></span><br><span class="line"></span><br><span class="line">    def <span class="title function_">returnText</span><span class="params">(self)</span>:</span><br><span class="line">        <span class="title function_">print</span><span class="params">(self.w1.get(<span class="number">1.2</span>, <span class="number">1.6</span>))</span></span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(<span class="number">1.8</span>, <span class="string">&quot;gaoqi&quot;</span>)</span></span><br><span class="line">        <span class="title function_">print</span><span class="params">(<span class="string">&quot;所有文本内容: \n&quot;</span>+self.w1.get(<span class="number">1.0</span>, END))</span></span><br><span class="line"></span><br><span class="line">    def <span class="title function_">addWidget</span><span class="params">(self)</span>:</span><br><span class="line">        b1 = Button(self.w1, text=<span class="string">&#x27;爱尚学堂&#x27;</span>)</span><br><span class="line">        self.w1.window_create(INSERT, window=b1)</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">testTag</span><span class="params">(self)</span>:</span><br><span class="line">        self.w1.<span class="title function_">delete</span><span class="params">(<span class="number">1.0</span>, END)</span></span><br><span class="line">        self.w1.<span class="title function_">insert</span><span class="params">(INSERT, <span class="string">&quot;good good study,day day up!\n北京尚学堂\n百战程序员\n百度，搜一下就知道了&quot;</span>)</span></span><br><span class="line">        </span><br><span class="line">        # 添加 good tag</span><br><span class="line">        self.w1.<span class="title function_">tag_add</span><span class="params">(<span class="string">&quot;good&quot;</span>, <span class="number">1.0</span>, <span class="number">1.9</span>)</span></span><br><span class="line">        self.w1.<span class="title function_">tag_config</span><span class="params">(<span class="string">&quot;good&quot;</span>, background=<span class="string">&quot;yellow&quot;</span>, foreground=<span class="string">&quot;red&quot;</span>)</span></span><br><span class="line">        </span><br><span class="line">        # 添加 baidu tag - 这里索引要正确</span><br><span class="line">        self.w1.<span class="title function_">tag_add</span><span class="params">(<span class="string">&quot;baidu&quot;</span>, <span class="number">4.0</span>, <span class="number">4.2</span>)</span>  # &quot;百度&quot;两个字</span><br><span class="line">        self.w1.<span class="title function_">tag_config</span><span class="params">(<span class="string">&quot;baidu&quot;</span>, underline=True, foreground=<span class="string">&quot;blue&quot;</span>)</span></span><br><span class="line">        self.w1.<span class="title function_">tag_bind</span><span class="params">(<span class="string">&quot;baidu&quot;</span>, <span class="string">&quot;&lt;Button-1&gt;&quot;</span>, self.webshow)</span></span><br><span class="line"></span><br><span class="line">    def <span class="title function_">webshow</span><span class="params">(self, event)</span>:</span><br><span class="line">        webbrowser.<span class="title function_">open</span><span class="params">(<span class="string">&quot;http://www.baidu.com&quot;</span>)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.geometry(<span class="string">&quot;450x300+200+300&quot;</span>)</span><br><span class="line">    app = Application(master=root)</span><br><span class="line">    root.mainloop()</span><br></pre></td></tr></table></figure><h2 id="Radiobutton-单选按钮">Radiobutton 单选按钮</h2><p>Radiobutton 控件用于选择同一组单选按钮中的一个。</p><p>Radiobutton 可以显示文本，也可以显示图像</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;测试Radiobutton组件的基本用法，使用面向对象的方式&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">from tkinter import *</span><br><span class="line">from tkinter import messagebox</span><br><span class="line"></span><br><span class="line">class <span class="title function_">Application</span><span class="params">(Frame)</span>:</span><br><span class="line">    </span><br><span class="line">    def __<span class="title function_">init__</span><span class="params">(self, master=None)</span>:</span><br><span class="line">        <span class="title function_">super</span><span class="params">()</span>.__<span class="title function_">init__</span><span class="params">(master)</span></span><br><span class="line"></span><br><span class="line">        self.master = master</span><br><span class="line">        self.pack()</span><br><span class="line">        self.creareWidget()</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">createWidget</span><span class="params">(self)</span>:</span><br><span class="line">        self.v = StringVar();</span><br><span class="line">        self.v.<span class="built_in">set</span>(<span class="string">&quot;F&quot;</span>)</span><br><span class="line"></span><br><span class="line">        self.r1 = Radiobutton(root, text=<span class="string">&quot;男性&quot;</span>, value=<span class="string">&quot;M&quot;</span>, variable=self.v)</span><br><span class="line">        self.r2 = Radiobutton(root, text=<span class="string">&quot;女性&quot;</span>, value=<span class="string">&quot;F&quot;</span>, variable=self.v)</span><br><span class="line"></span><br><span class="line">        self.r1.pack(side=<span class="string">&quot;left&quot;</span>);self.r2.pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">        Button(root,text=<span class="string">&quot;确定&quot;</span>, command=self.confirm).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">confirm</span><span class="params">(self)</span>:</span><br><span class="line">        messagebox.<span class="title function_">showinfo</span><span class="params">(<span class="string">&quot;测试&quot;</span>, <span class="string">&quot;选择的性别:&quot;</span>+self.v.get())</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.geometry(<span class="string">&quot;400x50+200+300&quot;</span>)</span><br><span class="line">    app = Application(master=root)</span><br><span class="line">    root.mainloop()</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;background-color:#FBDE28;">以上代码也存在一点问题，不能执行</font></p><p>父容器选择：</p><p>使用 self 作为父容器</p><p>因为 Application 是继承自 Frame 的，所有在类内部创建的组件应该放在这个 Frame 内部，而不是直接放在根窗口 root 上。</p><h3 id="代码结构说明：">代码结构说明：</h3><ul><li><font style="color:rgb(15, 17, 21);">使用</font><font style="color:rgb(15, 17, 21);"> </font><code>&lt;font style=&quot;color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);&quot;&gt;self&lt;/font&gt;</code><font style="color:rgb(15, 17, 21);"> </font><font style="color:rgb(15, 17, 21);">作为父容器可以让所有组件都在</font><font style="color:rgb(15, 17, 21);"> </font><code>&lt;font style=&quot;color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);&quot;&gt;Application&lt;/font&gt;</code><font style="color:rgb(15, 17, 21);"> </font><font style="color:rgb(15, 17, 21);">的 Frame 内部，这样布局更清晰，也更符合面向对象的设计。</font></li><li><code>&lt;font style=&quot;color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);&quot;&gt;self.v = StringVar()&lt;/font&gt;</code><font style="color:rgb(15, 17, 21);"> </font><font style="color:rgb(15, 17, 21);">创建了一个 StringVar 变量，用于绑定到 RadioButton 组件。当选择不同的 RadioButton 时，</font><code>&lt;font style=&quot;color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);&quot;&gt;self.v&lt;/font&gt;</code><font style="color:rgb(15, 17, 21);"> </font><font style="color:rgb(15, 17, 21);">的值会自动更新。</font></li><li><code>&lt;font style=&quot;color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);&quot;&gt;self.v.set(&quot;F&quot;)&lt;/font&gt;</code><font style="color:rgb(15, 17, 21);"> 设置了默认选中&quot;女性&quot;选项</font></li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;测试Radiobutton组件的基本用法，使用面向对象的方式&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">from tkinter import *</span><br><span class="line">from tkinter import messagebox</span><br><span class="line"></span><br><span class="line">class <span class="title function_">Application</span><span class="params">(Frame)</span>:</span><br><span class="line"></span><br><span class="line">    def __<span class="title function_">init__</span><span class="params">(self, master=None)</span>:</span><br><span class="line">        <span class="title function_">super</span><span class="params">()</span>.__<span class="title function_">init__</span><span class="params">(master)</span></span><br><span class="line">        self.master = master</span><br><span class="line">        self.pack()</span><br><span class="line">        self.createWidget()  # 这里拼写错误：creareWidget -&gt; createWidget</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">createWidget</span><span class="params">(self)</span>:</span><br><span class="line">        self.v = StringVar()</span><br><span class="line">        self.v.<span class="built_in">set</span>(<span class="string">&quot;F&quot;</span>)</span><br><span class="line"></span><br><span class="line">        # 修改这里：将父容器从 root 改为 self</span><br><span class="line">        self.r1 = Radiobutton(self, text=<span class="string">&quot;男性&quot;</span>, value=<span class="string">&quot;M&quot;</span>, variable=self.v)</span><br><span class="line">        self.r2 = Radiobutton(self, text=<span class="string">&quot;女性&quot;</span>, value=<span class="string">&quot;F&quot;</span>, variable=self.v)</span><br><span class="line"></span><br><span class="line">        self.r1.pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        self.r2.pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">        Button(self, text=<span class="string">&quot;确定&quot;</span>, command=self.confirm).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">    def confirm(self):</span><br><span class="line">        messagebox.showinfo(<span class="string">&quot;测试&quot;</span>, <span class="string">&quot;选择的性别:&quot;</span> + self.v.get())</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.geometry(<span class="string">&quot;400x50+200+300&quot;</span>)</span><br><span class="line">    app = Application(master=root)</span><br><span class="line">    root.mainloop()</span><br></pre></td></tr></table></figure><h2 id="Checkbutton-复选按钮">Checkbutton 复选按钮</h2><p>Checkbutton 控件用于选择多个按钮的情况，Checkbutton 可以显示文本，也可以显示图像</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;测试Radiobutton组件的基本用法，使用面向对象的方式&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">from tkinter import *</span><br><span class="line">from tkinter import messagebox</span><br><span class="line"></span><br><span class="line">class <span class="title function_">Application</span><span class="params">(Frame)</span>:</span><br><span class="line"></span><br><span class="line">    def __<span class="title function_">init__</span><span class="params">(self, master=None)</span>:</span><br><span class="line">        <span class="title function_">super</span><span class="params">()</span>.__<span class="title function_">init__</span><span class="params">(master)</span></span><br><span class="line">        self.master = master</span><br><span class="line">        self.pack()</span><br><span class="line">        self.createWidget()</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">createWidget</span><span class="params">(self)</span>:</span><br><span class="line">        self.codeHobby = IntVar();</span><br><span class="line">        self.videHobby = IntVar()</span><br><span class="line"></span><br><span class="line">        print(self.codeHobby.get())</span><br><span class="line">        self.c1 = Checkbutton(self, text=<span class="string">&quot;敲代码&quot;</span>,</span><br><span class="line">                              variable=self.codeHobby, onvalue=<span class="number">1</span>, offvalue=<span class="number">0</span>)</span><br><span class="line">        self.c2 = Checkbutton(self, text=<span class="string">&quot;看视频&quot;</span>,</span><br><span class="line">                              variable=self.videHobby, onvalue=<span class="number">1</span>, offvalue=<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">        self.c1.pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line">        self.c2.pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">        Button(self, text=<span class="string">&quot;确定&quot;</span>, command=self.confirm).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">    def confirm(self):</span><br><span class="line">        <span class="keyword">if</span> self.videHobby.get() == <span class="number">1</span>:</span><br><span class="line">            messagebox.showinfo(<span class="string">&quot;测试&quot;</span>, <span class="string">&quot;看视频，都是正常人有的爱好！你喜欢看什么类型？&quot;</span> )</span><br><span class="line">        <span class="keyword">if</span> self.codeHobby.get() == <span class="number">1</span>:</span><br><span class="line">            messagebox.showinfo(<span class="string">&quot;测试&quot;</span>, <span class="string">&quot;抓获野生程序猿一只，赶紧送给他尚学堂的视频充饥&quot;</span> )</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.geometry(<span class="string">&quot;400x50+200+300&quot;</span>)</span><br><span class="line">    app = Application(master=root)</span><br><span class="line">    root.mainloop()</span><br><span class="line">    </span><br></pre></td></tr></table></figure><h1>canvas 画布</h1><p>canvas 是一个矩形区域，可以放置图形，图像，组件等</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;测试canvas组件的基本用法，使用面向对象的方式&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">from tkinter import *</span><br><span class="line">import random</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class <span class="title function_">Application</span><span class="params">(Frame)</span>:</span><br><span class="line"></span><br><span class="line">    def __<span class="title function_">init__</span><span class="params">(self, master=None)</span>:</span><br><span class="line">        <span class="title function_">super</span><span class="params">()</span>.__<span class="title function_">init__</span><span class="params">(master)</span></span><br><span class="line">        self.master = master</span><br><span class="line">        self.pack()</span><br><span class="line">        self.createWidget()</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">createWidget</span><span class="params">(self)</span>:</span><br><span class="line">        # 创建画布</span><br><span class="line">        self.canvas = Canvas(self, width=<span class="number">300</span>, height=<span class="number">200</span>, bg=<span class="string">&quot;lightgreen&quot;</span>)</span><br><span class="line">        self.canvas.pack()</span><br><span class="line">        </span><br><span class="line">        # 画线</span><br><span class="line">        line = self.canvas.create_line(<span class="number">10</span>, <span class="number">10</span>, <span class="number">30</span>, <span class="number">20</span>, <span class="number">40</span>, <span class="number">50</span>)</span><br><span class="line">        </span><br><span class="line">        # 画矩形</span><br><span class="line">        rect = self.canvas.create_rectangle(<span class="number">50</span>, <span class="number">50</span>, <span class="number">100</span>, <span class="number">100</span>, fill=<span class="string">&quot;red&quot;</span>)</span><br><span class="line">        </span><br><span class="line">        # 画椭圆</span><br><span class="line">        oval = self.canvas.create_oval(<span class="number">150</span>, <span class="number">50</span>, <span class="number">200</span>, <span class="number">100</span>, fill=<span class="string">&quot;blue&quot;</span>)</span><br><span class="line"></span><br><span class="line">        # 尝试加载图片（如果存在）</span><br><span class="line">        try:</span><br><span class="line">            self.photo = PhotoImage(file=<span class="string">&quot;imgs/logo.gif&quot;</span>)</span><br><span class="line">            self.canvas.create_image(<span class="number">150</span>, <span class="number">170</span>, image=self.photo)</span><br><span class="line">        except Exception as e:</span><br><span class="line">            print(f<span class="string">&quot;无法加载图片: &#123;e&#125;&quot;</span>)</span><br><span class="line">            # 如果没有图片，画一个替代图形</span><br><span class="line">            self.canvas.create_rectangle(<span class="number">130</span>, <span class="number">150</span>, <span class="number">170</span>, <span class="number">190</span>, fill=<span class="string">&quot;yellow&quot;</span>)</span><br><span class="line">            self.canvas.create_text(<span class="number">150</span>, <span class="number">170</span>, text=<span class="string">&quot;图片&quot;</span>)</span><br><span class="line"></span><br><span class="line">        # 按钮</span><br><span class="line">        Button(self, text=<span class="string">&quot;画10个矩形&quot;</span>, command=self.draw50Recg).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">    def draw50Recg(self):</span><br><span class="line">        colors = [<span class="string">&quot;red&quot;</span>, <span class="string">&quot;blue&quot;</span>, <span class="string">&quot;green&quot;</span>, <span class="string">&quot;yellow&quot;</span>, <span class="string">&quot;orange&quot;</span>, <span class="string">&quot;purple&quot;</span>, <span class="string">&quot;pink&quot;</span>]</span><br><span class="line">        <span class="keyword">for</span> i in range(<span class="number">0</span>, <span class="number">10</span>):</span><br><span class="line">            x1 = random.randrange(<span class="type">int</span>(self.canvas[<span class="string">&quot;width&quot;</span>]))</span><br><span class="line">            y1 = random.randrange(<span class="type">int</span>(self.canvas[<span class="string">&quot;height&quot;</span>]))</span><br><span class="line">            x2 = x1 + random.randrange(<span class="number">20</span>, <span class="number">50</span>)</span><br><span class="line">            y2 = y1 + random.randrange(<span class="number">20</span>, <span class="number">50</span>)</span><br><span class="line">            color = random.choice(colors)</span><br><span class="line">            self.canvas.create_rectangle(x1, y1, x2, y2, </span><br><span class="line">                                         fill=color, </span><br><span class="line">                                         outline=<span class="string">&quot;black&quot;</span>, </span><br><span class="line">                                         width=<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.title(<span class="string">&quot;Canvas测试&quot;</span>)</span><br><span class="line">    root.geometry(<span class="string">&quot;400x300+200+300&quot;</span>)  # 修正窗口大小</span><br><span class="line">    app = Application(master=root)</span><br><span class="line">    root.mainloop()</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2821%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T032905Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=79df5b20f690d6b953d1c440d2432905a71fe2d7921da70e1b9265335e5a50b7" width="402" title="" crop="0,0,1,1" id="u843686af" class="ne-image"><h1>布局管理器</h1><p>一个 GUI 应用程序必然有大量的组件，需要使用 tkinter 提供的布局管理器帮助我们组织，管理在父组件中子组件的布局方式，tkinter 提供了三种管理器：pack，grid，place</p><h2 id="grid-布局-管理器">grid 布局 管理器</h2><p>grid 表格布局，采用表格结构组织组件，子组件的位置由行和列的单元格来确定，<strong><font style="color:#DF2A3F;background-color:#FBDE28;">并且可以跨行和跨列</font></strong>，从而实现复杂的布局</p><img src="https://54325432.s3.bitiful.net/image%20%2822%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T032917Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=55712ce67bcd52909e7b45857be2c3faf7e5719223502e0bcaeb9716c2f2942d" width="1370" title="" crop="0,0,1,1" id="u4ce6d129" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%2823%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T032927Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=c702be5022f1991961d8cb2f53fe7374312a33cc194d431dcaa339763129aa5e" width="1135" title="" crop="0,0,1,1" id="u6fb36ee8" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%2824%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T032939Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=a0a65cff26f70272f21f54dc16fb4e93e4934055f63beb781b0e4966eb294eb1" width="727" title="" crop="0,0,1,1" id="ue1ac5d62" class="ne-image"><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;计算器软件界面的设计&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">from tkinter import *</span><br><span class="line">import random</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class <span class="title function_">Application</span><span class="params">(Frame)</span>:</span><br><span class="line"></span><br><span class="line">    def __<span class="title function_">init__</span><span class="params">(self, master=None)</span>:</span><br><span class="line">        <span class="title function_">super</span><span class="params">()</span>.__<span class="title function_">init__</span><span class="params">(master)</span></span><br><span class="line">        self.master = master</span><br><span class="line">        self.pack()</span><br><span class="line">        self.createWidget()</span><br><span class="line"></span><br><span class="line">    def <span class="title function_">createWidget</span><span class="params">(self)</span>:</span><br><span class="line">        &quot;&quot;&quot;通过grid布局实现计算器的界面&quot;&quot;&quot;</span><br><span class="line">        btnText = ((<span class="string">&quot;MC&quot;</span>, <span class="string">&quot;M+&quot;</span>, <span class="string">&quot;M-&quot;</span>, <span class="string">&quot;MR&quot;</span>),</span><br><span class="line">                   (<span class="string">&quot;C&quot;</span>, <span class="string">&quot;±&quot;</span>, <span class="string">&quot;/&quot;</span>, <span class="string">&quot;×&quot;</span>),</span><br><span class="line">                   (<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span>,<span class="string">&quot;-&quot;</span>),</span><br><span class="line">                   (<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="string">&quot;+&quot;</span>),</span><br><span class="line">                   (<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="string">&quot;=&quot;</span>),</span><br><span class="line">                   (<span class="number">0</span>,<span class="string">&quot;.&quot;</span>))</span><br><span class="line"></span><br><span class="line">        Entry(self).grid(row=<span class="number">0</span>, column=<span class="number">0</span>, columnspan=<span class="number">4</span>,pady=<span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> rindex,r in <span class="title function_">enumerate</span><span class="params">(btnText)</span>:</span><br><span class="line">            <span class="keyword">for</span> cindex,c in <span class="title function_">enumerate</span><span class="params">(r)</span>:</span><br><span class="line">                <span class="title function_">Button</span><span class="params">(self, text=c,width=<span class="number">2</span>)</span>.<span class="title function_">grid</span><span class="params">(row=rindex+<span class="number">1</span>,column=cindex,sticky=NSEW)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.geometry(<span class="string">&quot;200x200+200+300&quot;</span>)</span><br><span class="line">    app = Application(master=root)</span><br><span class="line">    root.mainloop()</span><br><span class="line"></span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2825%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T032949Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=2cfafd00f2cfa1a050b7ad6def817265852a120bcfa87318760f3b1d7b91b559" width="286" title="" crop="0,0,1,1" id="ue4c8248f" class="ne-image"><h2 id="pack-布局管理器">pack 布局管理器</h2><p>pack 按照组件的创建顺序将子组件添加到父组件中，按照垂直或者水平的方向自然排布，如果不指定任何选项，默认在父组件中自顶向下垂直添加组件</p><p>pack 是代码量最少，最简单的一种，可以用于快速生成界面</p><img src="https://54325432.s3.bitiful.net/image%20%2826%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T033001Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=4adc2f3448eac6d47254cd1906d7ce358e7c4aa572d33b99da364893f76f4b86" width="1261" title="" crop="0,0,1,1" id="u66f050de" class="ne-image"><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#coding=utf-8</span></span><br><span class="line">#测试pack布局管理</span><br><span class="line"></span><br><span class="line">from tkinter import *</span><br><span class="line"></span><br><span class="line">root = Tk()</span><br><span class="line">root.geometry(<span class="string">&quot;700x200&quot;</span>)</span><br><span class="line"></span><br><span class="line">f1 = Frame(root)</span><br><span class="line">f1.pack()</span><br><span class="line">f2 = Frame(root);f2.pack()</span><br><span class="line"></span><br><span class="line">btnText = (<span class="string">&quot;流行风&quot;</span>, <span class="string">&quot;中国风&quot;</span>,<span class="string">&quot;日本风&quot;</span>,<span class="string">&quot;重金属&quot;</span>,<span class="string">&quot;轻音乐&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> txt in btnText:</span><br><span class="line">    Button(f1,text=txt).pack(side=<span class="string">&quot;left&quot;</span>,padx=<span class="string">&quot;10&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i in range(<span class="number">1</span>,<span class="number">20</span>):</span><br><span class="line">    Label(f2,width=<span class="number">5</span>,height=<span class="number">10</span>,borderwidth=<span class="number">1</span>,relief=<span class="string">&quot;solid&quot;</span>,</span><br><span class="line">          bg=<span class="string">&quot;black&quot;</span> <span class="keyword">if</span> i%<span class="number">2</span>==<span class="number">0</span> <span class="keyword">else</span> <span class="string">&quot;white&quot;</span>).pack(side=<span class="string">&quot;left&quot;</span>,padx=<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">root.mainloop()</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2827%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T033011Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=d1c55af1d9074df4c5023a3647894242c6fd138b55d256bb36eb03766ff8f56f" width="702" title="" crop="0,0,1,1" id="u002513aa" class="ne-image"><h2 id="place-布局管理器">place 布局管理器</h2><p>place 布局管理器可以通过坐标精确控制组件的位置，适用于一些布局更加灵活的场景</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># coding=utf-8</span></span><br><span class="line">from tkinter import *</span><br><span class="line"></span><br><span class="line">root = Tk()</span><br><span class="line">root.geometry(<span class="string">&quot;500x300&quot;</span>)</span><br><span class="line"></span><br><span class="line">f1 = Frame(root,width=<span class="number">200</span>,height=<span class="number">200</span>,bg=<span class="string">&quot;green&quot;</span>)</span><br><span class="line">f1.place(x=<span class="number">30</span>,y=<span class="number">30</span>)</span><br><span class="line"></span><br><span class="line">Button(root,text=<span class="string">&quot;尚学堂&quot;</span>).place(relx=<span class="number">0.2</span>, x=<span class="number">100</span>,y=<span class="number">20</span>,relheight=<span class="number">0.5</span>,relwidth=<span class="number">0.2</span>)</span><br><span class="line">Button(f1,text=<span class="string">&quot;百战程序员&quot;</span>).place(relx=<span class="number">0.6</span>,rely=<span class="number">0.7</span>)</span><br><span class="line">Button(f1,text=<span class="string">&quot;高琦老师&quot;</span>).place(relx=<span class="number">0.5</span>,rely=<span class="number">0.2</span>)</span><br><span class="line">root.mainloop()</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2828%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T033020Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=e924298a8f501c99134f39055de1741e0cf0482d17beb6d9889974d98ba004ca" width="502" title="" crop="0,0,1,1" id="u1a27e1ca" class="ne-image"><h1>lambda 表达式–事件传参应用</h1><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># coding=utf-8</span></span><br><span class="line"># 测试command属性绑定事件，测试lambda表达式帮助传参</span><br><span class="line">from tkinter import *</span><br><span class="line"></span><br><span class="line">root = Tk()</span><br><span class="line">root.geometry(<span class="string">&quot;270x50&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def mouseTest1():</span><br><span class="line">    print(<span class="string">&quot;command方式，简单情况：不涉及获取event对象，可以使用&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def mouseTest2(a, b):</span><br><span class="line">    print(<span class="string">&quot;a=&#123;0&#125;,b=&#123;1&#125;&quot;</span>.format(a, b))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Button(root, text=<span class="string">&quot;测试command1&quot;</span>,</span><br><span class="line">       command=mouseTest1).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">Button(root, text=<span class="string">&quot;测试command2&quot;</span>,</span><br><span class="line">       command=lambda:mouseTest2(<span class="string">&quot;gaoqi&quot;</span>, <span class="string">&quot;xixi&quot;</span>)).pack(side=<span class="string">&quot;left&quot;</span>)</span><br><span class="line"></span><br><span class="line">root.mainloop()</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2829%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T033028Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=f03ee5cc5852d7c700554c47833c6b70323cf202db2260f53482d6a088739401" width="272" title="" crop="0,0,1,1" id="u98367ce9" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%2830%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T033041Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=986406c9a19386cc8d3d78d172bef7a4175eaa60d03b60221098154f883c8302" width="774" title="" crop="0,0,1,1" id="u10263727" class="ne-image">]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;1-Tkinter&quot;&gt;1. Tkinter&lt;/h2&gt;
&lt;p&gt;tkinter (Tk interface)是python 的标准 GUI 库，支持跨平台的GUI 程序开发&lt;/p&gt;
&lt;p&gt;Tkinter适合小型的GUI程序编写，也特别适合初学者学习GUI 编程。本书以</summary>
      
    
    
    
    <category term="-linux笔记" scheme="http://www.ububan.github.io/categories/linux%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>linux进程内存空间</title>
    <link href="http://www.ububan.github.io/posts/12344.html"/>
    <id>http://www.ububan.github.io/posts/12344.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T03:19:34.319Z</updated>
    
    <content type="html"><![CDATA[<img src="https://54325432.s3.bitiful.net/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T025949Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=25066b0058f6fc97baca2eefa435df77278c18ffc823c042d2d738550f7856f2" class="ne-image"><p><font style="color:rgb(51,51,51);">在</font><font style="color:rgb(51,51,51);">free</font><font style="color:rgb(51,51,51);">命令中显示的</font><font style="color:rgb(51,51,51);">buffer</font><font style="color:rgb(51,51,51);">和</font><font style="color:rgb(51,51,51);">cache</font><font style="color:rgb(51,51,51);">，它们都是占用内存： </font></p><p><font style="color:rgb(51,51,51);">buffer : 作为buffer cache的内存，是块设备的读写缓冲区，更靠近存储设备，或者直接就是disk的缓冲区。 </font></p><p><font style="color:rgb(51,51,51);">cache: 作为page cache的内存, 文件系统的cache，是memory的缓冲区。</font></p><p><font style="color:rgb(51,51,51);">如果cache 的值很大，说明cache住的文件数很多。如果频繁访问到的文件都能被cache住，那么磁盘的读IO 必会非常小。</font></p><h1>page cache（页面缓存）</h1><p><font style="color:rgb(51,51,51);">Page cache 也叫页缓冲或文件缓冲，</font><font style="color:#DF2A3F;">是由好几个磁盘块构成，大小通常为4k</font><font style="color:rgb(51,51,51);">，在64位系统上为8k，构成的几个磁盘块在物理磁盘上不一定连续，文件的组织单位为一页， 也就是一个page cache大小，文件读取是由外存上不连续的几个磁盘块，到buffer cache，然后组成page cache，然后供给应用程序。 </font></p><p><font style="color:rgb(51,51,51);">Page cache在linux读写文件时，它用于缓存文件的逻辑内容，从而加快对磁盘上映像和数据的访问。具体说是加速对文件内容的访问，</font><font style="color:#DF2A3F;">buffer cache缓存文件</font><font style="color:rgb(51,51,51);">的具体内容——</font><font style="color:#DF2A3F;">物理磁盘上的磁盘块，这是加速对磁盘的访问</font></p><h1>Buffer cache（块缓存）</h1><p><font style="color:rgb(51,51,51);">Buffer cache 也叫块缓冲，是内存对物理磁盘上的一个磁盘块进行的缓冲，其大小为通常为1k，磁盘块也是磁盘的组织单位。设立buffer cache的目的是为在程序多次访问同一磁盘块时，减少访问时间。系统将磁盘块首先读入buffer cache，如果cache空间不够时，会通过一定的策略将一些过时或多次未被访问的buffer cache清空。程序在下一次访问磁盘时首先查看是否在buffer cache找到所需块，命中可减少访问磁盘时间。不命中时需重新读入buffer cache。对buffer cache的写分为两种，一是直接写，这是程序在写buffer cache后也写磁盘，要读时从buffer cache上读，二是后台写，程序在写完buffer cache后并不立即写磁盘，因为有可能程序在很短时间内又需要写文件，如果直接写，就需多次写磁盘了。这样效率很低，而是过一段时间后由后台写，减少了多次访磁盘的时间。 </font></p><p><font style="color:rgb(51,51,51);background-color:#FBDE28;">Buffer cache是由物理内存分配</font><font style="color:rgb(51,51,51);">，Linux系统为提高内存使用率，会将空闲内存全分给buffer cache ，当其他程序需要更多内存时，系统会减少cache大小。</font></p><h1><font style="color:rgb(51,51,51);">Swap space</font><font style="color:rgb(0,0,0);">（交换空间） </font></h1><p><font style="color:rgb(51,51,51);">Swap space交换空间，是虚拟内存的表现形式。系统为了应付一些需要大量内存的应用，而将磁盘上的空间做内存使用，当物理内存不够用时，将其中一些暂时不需的数据交换到交换空间，也叫交换文件或页面文件中。做虚拟内存的好处是让进程以为好像可以访问整个系统物理内存。因为在一个进程访问数据时，其他进程的数据会被交换到交换空间中。</font></p><h1><font style="color:rgb(51,51,51);">Swap cache</font><font style="color:rgb(0,0,0);">（交换缓存） </font></h1><p><font style="color:rgb(51,51,51);">swap cache，它表示交换缓存的大小。Page cache是磁盘数据在内存中的缓存，而swap cache则是交换分区在内存中的临时缓存。</font></p><h1><font style="color:rgb(51,51,51);">Page cache</font><font style="color:rgb(0,0,0);">和</font><font style="color:rgb(51,51,51);">Buffer cache</font><font style="color:rgb(0,0,0);">的区别 </font></h1><p><font style="color:rgb(51,51,51);">磁盘的操作有逻辑级（文件系统）和物理级（磁盘块），这两种Cache就是分别缓存逻辑和物理级数据的。 </font></p><p><font style="color:rgb(51,51,51);">假设通过文件系统操作文件，那么文件将被缓存到Page Cache，如果需要刷新文件的时候，Page Cache将交给Buffer Cache去完成，因为Buffer Cache就是缓存磁盘块的。 </font></p><p><font style="color:rgb(51,51,51);">也就是说，直接去操作文件，那就是Page Cache区缓存，用dd等命令直接操作磁盘块，就是Buffer Cache缓存的东西。</font></p><p><font style="color:#DF2A3F;">Page cache实际上是针对文件系统的，是文件的缓存</font><font style="color:rgb(51,51,51);">，在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘，这种映射关系由文件系统来完成。当page cache的数据需要刷新时，page cache中的数据交给buffer cache，但是这种处理在2.6版本的内核之后就变的很简单了，没有真正意义上的cache操作。 </font></p><p><font style="color:#DF2A3F;">Buffer cache是针对磁盘块的缓存</font><font style="color:rgb(51,51,51);">，也就是在没有文件系统的情况下，直接对磁盘进行操作的数据会缓存到buffer cache中，例如，文件系统的元数据都会缓存到buffer cache中。简单说来，page cache用来缓存文件数据，buffer cache用来缓存磁盘数据。在有文件系统的情况下，对文件操作，那么数据会缓存到page cache，如果直接采用dd等工具对磁盘进行读写，那么数据会缓存到buffer cache。 </font></p><p><font style="color:rgb(51,51,51);">Buffer(Buffer Cache)以块形式缓冲了块设备的操作，定时或手动的同步到硬盘，它是为了缓冲写操作然后一次性将很多改动写入硬盘，避免频繁写硬盘，提高写入效率。 </font></p><p><font style="color:rgb(51,51,51);">Cache(Page Cache)以页面形式缓存了文件系统的文件，给需要使用的程序读取，它是为了给读操作提供缓冲，避免频繁读硬盘，提高读取效率。</font></p><h1>综合监控工具 glances</h1><p>实时监控 CPU，内存，磁盘，网络等指标</p><p>支持彩色显示和动态刷新</p><p>可通过 Web 界面远程访问</p><p>低资源占用，适合长期运行</p><p>支持插件扩展功能</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt install glances</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo yum install epel-release</span><br><span class="line">sudo yum install glances</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install glances</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%281%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T030124Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=bcc2850d3041d5b710db497dd20e80008c9292ee96d13be6ba3f88771f8ececa" width="484" title="" crop="0,0,1,1" id="u93c8c520" class="ne-image"><p><font style="color:rgb(0,0,204);">-b</font><font style="color:rgb(51,51,51);">: 以Byte为单位显示网卡数据速率 </font></p><p><font style="color:rgb(0,0,204);">-d</font><font style="color:rgb(51,51,51);">: 关闭磁盘I/O模块 </font></p><p><font style="color:rgb(0,0,204);">-f </font><font style="color:rgb(51,51,51);">/path/to/somefile: 设定输入文件位置 </font></p><p><font style="color:rgb(0,0,204);">-o </font><font style="color:rgb(51,51,51);">{HTML|CSV}：输出格式 </font></p><p><font style="color:rgb(0,0,204);">-m</font><font style="color:rgb(51,51,51);">: 禁用mount模块 </font></p><p><font style="color:rgb(0,0,204);">-n</font><font style="color:rgb(51,51,51);">: 禁用网络模块 </font></p><p><font style="color:rgb(0,0,204);">-t </font><font style="color:rgb(170,85,0);">#: 延迟时间间隔 </font></p><p><font style="color:rgb(0,0,204);">-1</font><font style="color:rgb(51,51,51);">：每个CPU的相关数据单独显示</font></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">glances -t <span class="number">2</span>          # 设置刷新间隔为<span class="number">2</span>秒（默认<span class="number">1</span>秒）</span><br><span class="line">glances --disable-plugins fs,ip  # 禁用文件系统和IP插件</span><br><span class="line">glances --percpu      # 显示每个CPU核心的使用情况</span><br><span class="line">glances --csv         # CSV格式输出</span><br><span class="line">glances --json        # JSON格式输出</span><br><span class="line">glances --export influxdb  # 输出到InfluxDB数据库</span><br><span class="line">glances -s            # 启动glances服务器模式</span><br><span class="line">glances -c @<span class="number">192.168</span>.<span class="number">1.100</span>  # 连接到远程glances服务器</span><br><span class="line">glances -w            # 启用Web服务器模式（默认端口<span class="number">61208</span>）</span><br></pre></td></tr></table></figure><p>实例：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">#监控特定进程</span><br><span class="line">glances --process-name nginx  # 只监控nginx相关进程</span><br><span class="line">#生成系统快照</span><br><span class="line">glances --export csv --export-csv-file /tmp/system_stats.csv</span><br><span class="line">#设置告警阈值</span><br><span class="line">glances --alert cpu:<span class="number">80</span>,mem:<span class="number">90</span>  # CPU超过<span class="number">80</span>%或内存超过<span class="number">90</span>%时告警</span><br><span class="line">#远程Web监控</span><br><span class="line">glances -w &amp;amp;                   # 启动Web服务</span><br><span class="line">firefox http:<span class="comment">//localhost:61208 # 在浏览器中查看</span></span><br></pre></td></tr></table></figure><h2 id="glances-配置文件">glances 配置文件</h2><p><font style="color:rgb(51, 51, 51);background-color:rgb(250, 252, 253);">glances 的配置文件通常位于 </font><code>&lt;font style=&quot;color:rgb(51, 51, 51);background-color:rgb(250, 252, 253);&quot;&gt;~/.config/glances/glances.conf&lt;/font&gt;</code><font style="color:rgb(51, 51, 51);background-color:rgb(250, 252, 253);">，你可以通过编辑这个文件来永久修改默认设置。</font></p><img src="https://54325432.s3.bitiful.net/image%20%283%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031146Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=c5b57e1fda6aca987ee8374a504ffebeb6c0025086add29f64e8c0c4132e7ec4" width="468" title="" crop="0,0,1,1" id="ufe920c40" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%282%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031204Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=7b88c74a8ec2600999cc4493674895c5df29309109642c186e8258b9b8ef5849" width="772" title="" crop="0,0,1,1" id="u5074f1b3" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%284%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031218Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=97f7a55bee00eec4f1913b86efe098ee7e92b20df0efc2e8c20f04fd6d5af197" width="770" title="" crop="0,0,1,1" id="u3802b88f" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%285%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031228Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=f2e02d28ce6f9a3d4d15a085be40b9bb794da344bbb1c9e7a98403d35e8a99f3" width="937" title="" crop="0,0,1,1" id="u332ad334" class="ne-image"><h1>信号发送 kill</h1><p>内部命令，可用来向进程发送控制信号，以实现对进程管理，如果不指定信号，默认会发送 TERM 信号（15），即终止。 <font style="color:rgb(51, 51, 51);background-color:rgb(250, 252, 253);">若仍无法终止该程序，可使用 SIGKILL(9) 信息尝试强制删除程序。</font>每个信号对应一个数字，信号名称以 SIG 开头</p><p>用于终止正在运行的进程，</p><img src="https://54325432.s3.bitiful.net/image%20%286%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031320Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=101638572abd161fdd47a07433a8d1c4f0c144084686c451e5ebbd12317aa53d" width="749" title="" crop="0,0,1,1" id="u20f57549" class="ne-image"><p>kill -l /trap -l：显示当前系统可用信号</p><img src="https://54325432.s3.bitiful.net/image%20%287%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031329Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=ff9da0f31f62305abcc7dff1efe77ed465fa76adbe43a22f24d0ab40cc1c15cf" width="779" title="" crop="0,0,1,1" id="ue024bebb" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%288%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031357Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=814f9eb781c3bc68ca6d49159af3633bd33c9ae65162b92fa3f80c8b15a84c99" width="753" title="" crop="0,0,1,1" id="ud0db469a" class="ne-image"><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">kill                #结束指定PID的进程</span><br><span class="line">killall                #根据进程名杀死进程</span><br><span class="line">pkill                #同样是根据进程名杀死进程</span><br></pre></td></tr></table></figure><h2 id="常用信号">常用信号</h2><p><font style="color:rgb(17,102,68);">1</font><font style="color:rgb(51,51,51);">) SIGHUP 无须关闭进程而让其重读配置文件 </font></p><p><font style="color:rgb(17,102,68);">2</font><font style="color:rgb(51,51,51);">) SIGINT 中止正在运行的进程；相当于Ctrl</font><font style="color:rgb(152,26,26);">+</font><font style="color:rgb(51,51,51);">c </font></p><p><font style="color:rgb(17,102,68);">3</font><font style="color:rgb(51,51,51);">) SIGQUIT 相当于ctrl</font><font style="color:rgb(152,26,26);">+</font><font style="color:rgb(51,51,51);">\ </font></p><p><font style="color:rgb(17,102,68);">9</font><font style="color:rgb(51,51,51);">) SIGKILL 强制杀死正在运行的进程,可能会导致数据丢失,慎用! </font></p><p><font style="color:rgb(17,102,68);">15</font><font style="color:rgb(51,51,51);">) SIGTERM 终止正在运行的进程，默认信号 </font></p><p><font style="color:rgb(17,102,68);">18</font><font style="color:rgb(51,51,51);">) SIGCONT 继续运行 </font></p><p><font style="color:rgb(17,102,68);">19</font><font style="color:rgb(51,51,51);">) SIGSTOP 后台休眠</font></p><img src="https://54325432.s3.bitiful.net/image%20%289%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031518Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=37765f3449773fdf93cb3880c1b2cabe2e4729cd661ad27564c5a55aa422c165" width="796" title="" crop="0,0,1,1" id="u3514d16d" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%2810%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031536Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=490882b5cb50a07f96cee6ba57bbe18b5840849b12d12a17d5f1ca265e18fb8d" width="690" title="" crop="0,0,1,1" id="u8c85c5ad" class="ne-image"><p><font style="color:rgb(51,51,51);">也可以在终端中使用组合键发送信号。例如，Ctrl+C 发送 SIGINT信号，Ctrl+S 发送 SIGSTOP 信号，Ctrl+Q 发送 SIGCONT 信号。</font></p><p><font style="color:rgb(51,51,51);">可以使用trap命令处理Bash中的信号。例如，在脚本中添加trap date SIGINT，脚本会打印收到 SIGINT 的日期。</font></p><h2 id="SIGINT">SIGINT</h2><p><font style="color:rgb(51,51,51);">SIGINT 是按下 Ctrl+C 时发出的信号。默认操作是终止进程。</font></p><img src="https://54325432.s3.bitiful.net/image%20%2811%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031548Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=3e37b2d3dbe341c57b9c1ea598767f2318b4bbd994e3ffc4b9c15eb7c934b01e" width="724" title="" crop="0,0,1,1" id="ue03b9991" class="ne-image"><h2 id="SIGTERM-和-SIGQUIT">SIGTERM 和 SIGQUIT</h2><p><font style="color:rgb(51,51,51);">SIGTERM 和 SIGQUIT 信号旨在</font><font style="color:#DF2A3F;">终止进程</font><font style="color:rgb(51,51,51);">。在这种情况下，特别要求结束进程。当使用 kill 命令时，SIGTERM 是默认信号。</font></p><p><font style="color:rgb(51,51,51);">当发送 SIGTERM 时，进程有时会在退出前执行一个清理例程。还可以处理 SIGTERM，在退出前请求确认。编写一个名为handle_sigterm.sh 的脚本，只有当用户发送两次信号时才终止：</font></p><img src="https://54325432.s3.bitiful.net/image%20%2812%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=d75a1da39b1005893eb975cf31c21784cab28e2c37d9adc7580693f71b6d328c" width="756" title="" crop="0,0,1,1" id="u9bc8cee8" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%2813%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031617Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=2af44e56dc4db267e1d25a408b444804328eca7b41f83e6c2619749d772b72cf" width="429" title="" crop="0,0,1,1" id="u2606bf08" class="ne-image"><h2 id="SIGKILL">SIGKILL</h2><p><font style="color:rgb(51,51,51);">当进程收到 SIGKILL 信号时，它就会被终止。这是一个特殊的信号，因为它不能被忽略，也不能改变它的行为。 </font></p><p><font style="color:rgb(51,51,51);">使用该信号强制终止进程。需要小心，因为进程将无法执行任何清理例程。 </font></p><p><font style="color:rgb(51,51,51);">使用 SIGKILL 的一种常见方法是先发送 SIGTERM。会给进程一些时间来终止，也可能会发送几次 SIGTERM。如果进程没有自行结束，就需要发送SIGKILL 终止它</font></p><p><font style="color:rgb(51,51,51);">重写前面的示例，尝试处理 SIGKILL 并请求确认：</font></p><p><img src="https://54325432.s3.bitiful.net/image%20%2814%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031629Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=d3d833efa5deba337e0af2d400bac18823fa30d83b13bf3906fde6d95c85b477" width="700" title="" crop="0,0,1,1" id="udc4b15f9" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%2815%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031739Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=34c40afc3ca403622eb2e036f9fd4d9c4e16168d9c8adec2208f4054a0eda3ab" width="447" title="" crop="0,0,1,1" id="u88fc5744" class="ne-image"></p><h1><font style="color:rgb(51,51,51);">SIGINT </font><font style="color:rgb(0,0,0);">与</font><font style="color:rgb(51,51,51);"> SIGTERM</font><font style="color:rgb(0,0,0);">、</font><font style="color:rgb(51,51,51);">SIGQUIT </font><font style="color:rgb(0,0,0);">和</font><font style="color:rgb(51,51,51);"> SIGKILL </font><font style="color:rgb(0,0,0);">的关系</font></h1><p><font style="color:rgb(51,51,51);">SIGINT、SIGTERM、SIGQUIT 和 SIGKILL 的默认操作是终止进程。不过，SIGTERM、SIGQUIT 和 SIGKILL 被定义为终止进程的信号，而SIGINT 则被定义为用户请求的中断。 </font></p><p><font style="color:rgb(51,51,51);">特别是，如果发送 SIGINT（或按 Ctrl+C），根据进程和情况的不同，它的行为也会不同。因此，不应该完全依赖 SIGINT 来完成进程。由于 SIGINT 是用户发送的信号，进程之间通常使用其他信号进行通信。 </font></p><p><font style="color:rgb(51,51,51);">例如，父进程通常会向其子进程发送 SIGTERM 以终止它们，即使 SIGINT也有同样的效果。 在 SIGQUIT 的情况下，它会生成核心转储，这对调试非常有用。</font></p><p><font style="color:rgb(51,51,51);">在 SIGKILL 之外，应该选择 SIGTERM 来终止进程。SIGTERM 是首选方式，因为进程有机会优雅地终止。 </font></p><p><font style="color:rgb(51,51,51);">由于进程可以覆盖 SIGINT、SIGTERM 和 SIGQUIT 的默认操作，因此可能出现这三个信号都无法结束进程的情况。此外，如果进程被挂起，它可能不会响应任何这些信号。在这种情况下，只能通过 SIGKILL 来终止进程。</font></p><h1>读取最大线数</h1><p><font style="color:rgb(51,51,51);">内核参数 threads-max 控制着线程的最大数量</font></p><p><font style="color:rgb(51,51,51);">该参数在 /proc/sys/kernel/threads-max 文件中定义。</font></p><img src="https://54325432.s3.bitiful.net/image%20%2816%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031830Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=aaf28670ec3189472d19e9c9bd1103b4a44951111651b60a63932133b4915a8e" width="695" title="" crop="0,0,1,1" id="u65ac2d6e" class="ne-image"><p>sysctl 命令也可以获取线程最大值</p><img src="https://54325432.s3.bitiful.net/image%20%2817%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031845Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=4f72f87d6396c0a988bb315c0ac0767c16f347ed3f4377b767bdd45b43e0e005" width="399" title="" crop="0,0,1,1" id="u576ca890" class="ne-image"><p><font style="color:rgb(51,51,51);">kernel.pid_max 和 vm.max_map_count 还指定了另外两个限制，它们也会在峰值负载时阻止新线程的创建。 </font></p><p><font style="color:rgb(51,51,51);">pid_max 参数指定了 PID 的最大值：</font></p><img src="https://54325432.s3.bitiful.net/image%20%2818%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031858Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=17a2e266d352241dd6b8aca51ab97e2e6915a7721c370297815498d6c429db79" width="424" title="" crop="0,0,1,1" id="u8ced6fb0" class="ne-image"><p><font style="color:rgb(51,51,51);">上面的 kernel.pid_max 值 4194304 意味着内核最多可同时执行 4194304 个进程。 </font></p><p><font style="color:rgb(51,51,51);">max_map_count 参数指定一个进程可拥有的虚拟内存区域（VMA）的最大数量：</font></p><img src="https://54325432.s3.bitiful.net/image%20%2819%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T031926Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=bace74d1468d1f96a5019272883420aa92da6f0e8907095b07f092a46419ea70" width="417" title="" crop="0,0,1,1" id="uc430f0ec" class="ne-image">]]></content>
    
    
      
      
    <summary type="html">&lt;img src=&quot;https://54325432.s3.bitiful.net/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F</summary>
      
    
    
    
    <category term="-linux笔记" scheme="http://www.ububan.github.io/categories/linux%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>函数多返回值</title>
    <link href="http://www.ububan.github.io/posts/21234.html"/>
    <id>http://www.ububan.github.io/posts/21234.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T06:36:45.632Z</updated>
    
    <content type="html"><![CDATA[<p>多个返回值</p><p>如果一个函数要有多个返回值，该如何书写代码？</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">def test_return():</span><br><span class="line"> return 1,2</span><br><span class="line">x,y = test_return()</span><br><span class="line">print(x)  #结果1</span><br><span class="line">print(y)  #结果2</span><br></pre></td></tr></table></figure><p>按照返回值的顺序写对应顺序的多个变量接收即可</p><p>变量之间用逗号隔开</p><p>支持不同类型的数据return</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&quot;&quot;&quot;</span><br><span class="line">演示函数的多返回值示例</span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">#演示使用多个变量，接收多个返回值</span><br><span class="line">def test_return():</span><br><span class="line">    return 1,2,3</span><br><span class="line"></span><br><span class="line">x,y,z = test_return()</span><br><span class="line">print(x)</span><br><span class="line">print(y)</span><br><span class="line">print(z)</span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763622310273-ada01ae0-c705-417d-b5c2-6322ef27c420.png" width="290" title="" crop="0,0,1,1" id="u0b0bf8ff" class="ne-image"><p>其中 1，2，3 的类型不受限，<strong><font style="color:#DF2A3F;">需要注意顺序问题，第一个数值对应第一个类型，依次类推</font></strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&quot;&quot;&quot;</span><br><span class="line">演示函数的多返回值示例</span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">#演示使用多个变量，接收多个返回值</span><br><span class="line">def test_return():</span><br><span class="line">    return 1,&quot;hello&quot;,True</span><br><span class="line"></span><br><span class="line">x,y,z = test_return()</span><br><span class="line">print(x)</span><br><span class="line">print(y)</span><br><span class="line">print(z)</span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763622408957-df2c6137-47ba-42e2-a068-58773f3c4d9a.png" width="265" title="" crop="0,0,1,1" id="u220bfc5c" class="ne-image"><h1>位置参数</h1><p>调用函数时根据函数定义的参数位置来传递参数</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">def user_info(name,age,gender):</span><br><span class="line"> print(f&#x27;您的名字时&#123;name&#125;,年龄是&#123;age&#125;,性别是&#123;gender&#125;&#x27;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">     user_info(&#x27;TOM&#x27;,20,&#x27;男&#x27;)</span><br></pre></td></tr></table></figure><p>注意：</p><p><strong><font style="color:#DF2A3F;">传递的参数和定义的参数的顺序及个数必须一致</font></strong></p><h1>关键字参数</h1><p>函数调用时通过”键=值“形式传递参数</p><p>可让函数更加清晰，容易使用，同时也清除了参数的顺序需求</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">def user_info(name,age,gender):</span><br><span class="line">    print(f&quot;您的名字是：&#123;name&#125;，年龄是：&#123;age&#125;，性别是：&#123;gender&#125;&quot;)</span><br><span class="line">#关键字传参</span><br><span class="line">user_info(name=&quot;小明&quot;,age=20,gender=&quot;男&quot;)</span><br><span class="line">#可以不按照固定顺序</span><br><span class="line">user_info(age=20,gender=&quot;男&quot;,name=&quot;小明&quot;)</span><br><span class="line">#可以和位置参数混用，位置参数必须在前，且匹配参数顺序</span><br><span class="line">user_info(&quot;小明&quot;,age=20,gender=&quot;男&quot;)    </span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763625113443-a11aaa8e-7add-4c46-a5cd-220b22c92308.png" width="498" title="" crop="0,0,1,1" id="ufaa57e6a" class="ne-image"><p>注意：</p><p><strong><font style="color:#DF2A3F;">函数调用时，如果有位置参数时，位置参数必须在关键字参数的前面，但关键字参数之间不存在先后顺序</font></strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">def user_info(name,age,gender):</span><br><span class="line">    print(f&quot;您的名字是：&#123;name&#125;，年龄是：&#123;age&#125;，性别是：&#123;gender&#125;&quot;)</span><br><span class="line">#位置参数 - 默认使用形式</span><br><span class="line">user_info(&#x27;小明&#x27;,20,&#x27;男&#x27;)</span><br><span class="line">#关键字传参</span><br><span class="line">user_info(name=&quot;小王&quot;,age=11,gender=&quot;女&quot;)</span><br><span class="line">#可以不按照固定顺序</span><br><span class="line">user_info(age=10,gender=&quot;女&quot;,name=&quot;小文&quot;)</span><br><span class="line">#可以和位置参数混用，位置参数必须在前，且匹配参数顺序</span><br><span class="line">user_info(&quot;敏婕&quot;,age=9,gender=&quot;女&quot;)</span><br><span class="line"></span><br><span class="line">#缺省参数（默认值）</span><br><span class="line"></span><br><span class="line">#不定长 - 位置不定长，*号</span><br><span class="line"></span><br><span class="line">#不定长 - 关键字不定长，**号</span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763625805193-a7b67566-bb54-4dda-bdfd-990d7fa5c09a.png" width="615" title="" crop="0,0,1,1" id="u9e6511a3" class="ne-image"><h1>缺省参数</h1><p>缺省参数也叫默认参数，用于定义函数，为参数提供默认值，调用函数时可不传该默认参数的值（注意：所有位置参数必须出现在默认参数前，包括函数定义和调用）</p><p>当调用函数时没有传递参数，就会使用默认是用缺省参数对应的值</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">def user_info(name,age,gender=&#x27;男&#x27;):</span><br><span class="line">    print(f&#x27;您的名字是：&#123;name&#125;，年龄是：&#123;age&#125;，性别是：&#123;gender&#125;&#x27;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">user_info(&#x27;TOM&#x27;,20)</span><br><span class="line">user_info(&#x27;Rose&#x27;,18,&#x27;女&#x27;)</span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763626077117-2d771d6f-5e4a-4d14-9908-37e38e92467e.png" width="528" title="" crop="0,0,1,1" id="uef56cb0e" class="ne-image"><p>注意：</p><p><strong><font style="color:#DF2A3F;">函数调用时，如果为缺省参数传值则修改默认参数值，否则使用这个默认值</font></strong></p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763626358170-2d33fd20-97e9-4048-bb5e-6af2d4eb230f.png" width="813" title="" crop="0,0,1,1" id="Yqrjv" class="ne-image"><h1>不定长参数</h1><p>也叫可变参数，用于不确定调用的时候会传递多少个参数（不传参也可以）的场景</p><p>当调用函数时不确定参数个数时，可以使用不定长参数</p><p>类型：</p><h2 id="位置传递">位置传递</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">def user_info(*args):</span><br><span class="line">    print(args)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#(&#x27;TOM&#x27;,)</span><br><span class="line">user_info(&#x27;TOM&#x27;)    </span><br><span class="line">#(&#x27;TOM&#x27;,18)</span><br><span class="line">user_info(&#x27;TOM&#x27;,18)</span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763626622306-bf2a4d16-48e3-4c07-9b3c-785921ad9d14.png" width="312" title="" crop="0,0,1,1" id="lUfEV" class="ne-image"><p>注意：</p><p>传进的<font style="color:#DF2A3F;">所有参数</font>都会被 <font style="color:#DF2A3F;">args 变量收集</font>，它会根据传进参数的位置合并为一个元组（tuple），<font style="color:#DF2A3F;">args 是元组类型</font>，这就是<font style="color:#DF2A3F;">位置传递</font></p><p>位置不定长传递以*号标记一个形式参数，以元组的形式接受参数，形式参数一般命名为 args</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">#不定长 - 位置不定长，*号</span><br><span class="line">#不定长定义的形式参数会作为元组存在，接收不定长数量的参数传入</span><br><span class="line">def <span class="title function_">user_info</span><span class="params">(*args)</span>:</span><br><span class="line"><span class="title function_">print</span><span class="params">(f<span class="string">&quot;args参数的类型是：&#123;type(args)&#125;,内容是:&#123;args&#125;&quot;</span>)</span></span><br><span class="line"></span><br><span class="line">    <span class="title function_">user_info</span><span class="params">(<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="string">&#x27;小明&#x27;</span>,<span class="string">&#x27;男孩&#x27;</span>)</span></span><br><span class="line">    #不定长 - 关键字不定长，**号</span><br></pre></td></tr></table></figure><p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763627683888-77c4addd-6e14-44ca-a2d6-548d1a156859.png" width="699" title="" crop="0,0,1,1" id="u6772a7ab" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763627552566-26200521-5248-47c9-9a0a-4c538aa6f4cf.png" width="500" title="" crop="0,0,1,1" id="u9a361dcd" class="ne-image"></p><h2 id="关键字传递">关键字传递</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">def <span class="title function_">user_info</span><span class="params">(**kwargs)</span>:</span><br><span class="line">    <span class="title function_">print</span><span class="params">(kwargs)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#<span class="params">(<span class="string">&#x27;name&#x27;</span>: <span class="string">&#x27;TOM&#x27;</span>, <span class="string">&#x27;age&#x27;</span>: <span class="number">18</span>, <span class="string">&#x27;id&#x27;</span>: <span class="number">110</span>)</span></span><br><span class="line"><span class="title function_">user_info</span><span class="params">(name=<span class="string">&#x27;TOM&#x27;</span>, age=<span class="number">18</span>, id=<span class="number">110</span>)</span></span><br></pre></td></tr></table></figure><p>注意：</p><p>参数是<font style="color:#DF2A3F;">”键=值“</font>形式的形式的情况下，所有的”键=值“都会被<font style="color:#DF2A3F;"> kwargs 接受</font>，同时会根据”键=值“组成<font style="color:#DF2A3F;">字典</font>。</p><p>关键字不定长传递以**号标记一个形式参数，以字典的形式接受参数，形式参数一般命名为 kwargs</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">#不定长 - 关键字不定长，**号</span><br><span class="line">def <span class="title function_">user_info</span><span class="params">(**kwargs)</span>:</span><br><span class="line">    <span class="title function_">print</span><span class="params">(f<span class="string">&quot;args参数的类型是：&#123;type(kwargs)&#125;,内容是:&#123;kwargs&#125;&quot;</span>)</span></span><br><span class="line"></span><br><span class="line"><span class="title function_">user_info</span><span class="params">(name=<span class="string">&quot;小王&quot;</span>, age=<span class="number">11</span>, gender=<span class="string">&quot;女&quot;</span>)</span></span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763627850586-61c7ca06-6ad7-470a-b5e8-f7b3134d1bd6.png" width="754" title="" crop="0,0,1,1" id="uae0eda4d" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763627920152-bfdf835f-cbe7-469c-997c-2ef071d56bac.png" width="748" title="" crop="0,0,1,1" id="u7506c487" class="ne-image"><h1>匿名函数</h1><h2 id="函数作为参数传递">函数作为参数传递</h2><p>如下代码：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">def <span class="title function_">test_func</span><span class="params">(compute)</span>:</span><br><span class="line">    result = compute(<span class="number">1</span>,<span class="number">2</span>)</span><br><span class="line">    print(result)</span><br><span class="line"></span><br><span class="line">def <span class="title function_">compute</span><span class="params">(x,y)</span>:</span><br><span class="line">  <span class="keyword">return</span> x + y</span><br><span class="line"></span><br><span class="line"><span class="title function_">test_func</span><span class="params">(compute)</span>     #结果：3</span><br></pre></td></tr></table></figure><p>函数 compute 作为参数，传入了 test_func 函数中使用</p><ul><li>test_func 需要一个函数作为参数传入，这个函数需要接收 2 个数字进行计算，计算逻辑由这个被传入函数决定</li><li>compute 函数接收 2 个数字对其进行计算，compute 函数作为参数，传递了 test_func 函数使用</li><li>最终，在 test_func 函数内部，由传入的 compute 函数，完成了对数字的计算操作</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">演示函数作为参数传递</span></span><br><span class="line"><span class="string">&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">#定义一个函数，接收另一个函数作为传入参数</span><br><span class="line">def <span class="title function_">test_func</span><span class="params">(compute)</span>:</span><br><span class="line">    result = compute(<span class="number">1</span>,<span class="number">2</span>)  #确定compute是函数</span><br><span class="line">    print(f<span class="string">&quot;compute参数的类型是：&#123;type(compute)&#125;&quot;</span>)</span><br><span class="line">    print(f<span class="string">&quot;计算结果：&#123;result&#125;&quot;</span>)</span><br><span class="line">#定义一个函数，准备作为参数传入另一个函数</span><br><span class="line">def <span class="title function_">compute</span><span class="params">(x,y)</span>:</span><br><span class="line">    <span class="keyword">return</span> x + y</span><br><span class="line">#调用，并传入函数</span><br><span class="line"><span class="title function_">test_func</span><span class="params">(compute)</span></span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763629363808-0e226b83-e63a-49b6-8386-d29bc4283d54.png" width="608" title="" crop="0,0,1,1" id="uf829e6a4" class="ne-image"><p><strong><font style="color:#DF2A3F;">将函数传入的作用在于：传入计算逻辑，而非传入数据</font></strong></p><h2 id="lambda-匿名函数">lambda 匿名函数</h2><p>函数的定义中</p><ul><li>def 关键字，可以定义<font style="color:#DF2A3F;">带有名称</font>的函数</li><li>lambda 关键字，可以<font style="color:#DF2A3F;">定义匿名</font>函数（无名称）</li></ul><p>有名称的函数可以基于名称<font style="color:#DF2A3F;">重复使用</font></p><p>无名称的匿名函数只可<font style="color:#DF2A3F;">临时使用一次</font></p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766048834910-90934414-6382-4bf6-8c3b-89e7db98aa13.png" width="567" title="" crop="0,0,1,1" id="u3fcbbdb3" class="ne-image"><h3 id="匿名函数定义语法">匿名函数定义语法</h3><p>**<font style="color:#DF2A3F;">lambda </font>**传入参数：函数体（一行代码）</p><ul><li>lambda 是关键字，表示定义匿名函数</li><li>传入参数表示匿名函数的形式参数，如：x，y 表示接收 2 个形式参数</li><li>函数体，就是函数的执行逻辑，要注意：只能写一行，无法书写多行代码</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">演示lambda匿名函数</span></span><br><span class="line"><span class="string">&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">#定义一个函数，接受其他函数输入</span><br><span class="line">def <span class="title function_">test_func</span><span class="params">(compute)</span>:</span><br><span class="line">    result = compute(<span class="number">1</span>,<span class="number">2</span>)</span><br><span class="line">    print(f<span class="string">&quot;结果：&#123;result&#125;&quot;</span>)</span><br><span class="line">#通过lambda匿名函数的形式，将匿名函数作为参数传入</span><br><span class="line">test_func(lambda x,y: x + y)</span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763630048820-9a7bdee2-b27b-4ef3-8350-e2f919bbb5cb.png" width="326" title="" crop="0,0,1,1" id="ufeb81c6c" class="ne-image"><h2 id="注意：">注意：</h2><ul><li>匿名函数用于临时构建一个函数，只能用一次的场景</li><li>匿名函数的定义中，函数体只能写一行代码，如果函数体要写多行代码，不可用 lambda 匿名函数，应使用 def 定义带名函数</li></ul><h1>map 函数</h1><p>map（）函数是一个内置的高阶函数</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766104681090-8df034bd-9cc6-405c-9286-5e47e50e36fc.png" width="327" title="" crop="0,0,1,1" id="u4a1e8698" class="ne-image"><p>参数 1：传入一个函数，这个函数可以是内置的，也可以是自己定义，也可以是匿名函数</p><p>参数 2：是可迭代对象，如列表，字符串等等</p><p>该函数返回一个 map 对象，是个迭代器</p><p>注意不是列表不能直接输出，可以通过 for 循环或 list（）来显示</p><p>map 函数将 iterable 中的每一个元素执行一遍 function，结果以 map 对象的形式返回</p><p>注意，iterable 后还有省略号，即可以传多个 iterable，如果有额外的 iterable 参数，并行的从这些参数中取元素，并调用 function</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">def <span class="title function_">square</span><span class="params">(x)</span>:</span><br><span class="line">    <span class="keyword">return</span> X*X</span><br><span class="line">a = <span class="built_in">map</span>(square,[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br><span class="line">print(a)</span><br><span class="line">print(<span class="built_in">list</span>(a))</span><br><span class="line"><span class="meta">#map返回的实际上是一个map对象</span></span><br><span class="line">#也可以通过<span class="keyword">for</span>循环来取出内容</span><br><span class="line">def <span class="title function_">square</span><span class="params">(x)</span>:</span><br><span class="line">    <span class="keyword">return</span> X*X</span><br><span class="line">a = <span class="built_in">map</span>(square,[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br><span class="line">ls = []</span><br><span class="line"><span class="keyword">for</span> i in a:</span><br><span class="line">    ls.append(i)</span><br><span class="line">print(ls)</span><br><span class="line">#也可以使用推导式</span><br><span class="line">def square(x):</span><br><span class="line">    <span class="keyword">return</span> X*X</span><br><span class="line">a = <span class="built_in">map</span>(square,[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br><span class="line">ls = [item <span class="keyword">for</span> item in a] </span><br><span class="line">print(ls)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;多个返回值&lt;/p&gt;
&lt;p&gt;如果一个函数要有多个返回值，该如何书写代码？&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span</summary>
      
    
    
    
    <category term="-python笔记" scheme="http://www.ububan.github.io/categories/python%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>Python文件操作</title>
    <link href="http://www.ububan.github.io/posts/23245.html"/>
    <id>http://www.ububan.github.io/posts/23245.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T06:28:48.405Z</updated>
    
    <content type="html"><![CDATA[<h1>打开文件</h1><p>python 使用内置函数 open（）打开文件，创建 file 对象，在系统中，只有存在 file 对象后，用户才能对文件进行相应的操作</p><img src="https://54325432.s3.bitiful.net/image%20%2832%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034307Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=dfd4454bdd5a995285ca5d6a1b7d9ea5d9cc5d44e003a8af57f967a7f32c2499" width="507" title="" crop="0,0,1,1" id="ua32239ea" class="ne-image"><ul><li>文件名（name）为必选参数,name:是要打开的目标文件名的字符串（可以包含文件所在的具体路径）</li><li>模式（mode）和缓冲（buffering）参数是可选的，mode：设置打开文件的模式（访问模式）：只读，写入，追加等</li><li>该函数返回一个文件对象</li><li>encoding：编码格式（推荐使用 UTF-8）</li></ul><img src="https://54325432.s3.bitiful.net/image%20%2833%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034319Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=c7ed4712c1d89e7bab4f940fa5783178b489b177dcc90215b7b42df3678e901f" width="1083" title="" crop="0,0,1,1" id="u22dc940c" class="ne-image"><img src="https://54325432.s3.bitiful.net/image%20%2834%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034336Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=2335097b29d13318931ec979793696e56952390354caf053a8307ebff904a558" width="673" title="" crop="0,0,1,1" id="u808cf07c" class="ne-image"><h2 id="模式参数组合及其描述">模式参数组合及其描述</h2><table><thead><tr><th>模式参数组合</th><th>描述</th></tr></thead><tbody><tr><td>r+</td><td>以读写模式打开</td></tr><tr><td>w+</td><td>以读写模式打开</td></tr><tr><td>a+</td><td>以读写模式打开</td></tr><tr><td>rb</td><td>以二进制读模式打开</td></tr><tr><td>wb</td><td>以二进制写模式打开</td></tr><tr><td>ab</td><td>以二进制追加模式打开</td></tr><tr><td>rb+</td><td>以二进制读写模式打开</td></tr><tr><td>wb+</td><td>以二进制读写模式打开</td></tr><tr><td>ab+</td><td>以二进制读写模式打开</td></tr></tbody></table><img src="https://54325432.s3.bitiful.net/image%20%2835%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034348Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=8bd6dbb84f2e77daf88975a4d9922286c370db6fb79301eaebbe2cc5804f242b" width="394" title="" crop="0,0,1,1" id="u643fa181" class="ne-image"><p>写模式打开一个指定的文件（C:\Users\test.txt)</p><p>f 是一个文件对象，它与指定的文件建立了关联，很多文献称 f 为文件描述符</p><img src="https://54325432.s3.bitiful.net/image%20%2836%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034403Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=e1ef2a8807fbd7571a9f89d3a88d4c3c1d3a3a89e54cc843fce9bc7f9e62dc5d" width="282" title="" crop="0,0,1,1" id="u7cb913c2" class="ne-image"><p>读取的文件与程序在相同文件夹中，直接提供文件名即可</p><p>以<font style="color:#DF2A3F;">读模式</font>打开文件时，文件必须存在，否则会<font style="color:#DF2A3F;">引发异常</font></p><p>以<font style="color:#DF2A3F;">写模式</font>打开一个文件时，如果输出文件已经<font style="color:#DF2A3F;">存在</font>，那么它在写入新数据之前会被<font style="color:#DF2A3F;">清空</font>；如果文件不存在，会<font style="color:#DF2A3F;">创建一个空文件</font></p><h1>close（）关闭文件对象</h1><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">f = open(<span class="string">&quot;python.txt&quot;</span>, <span class="string">&quot;r&quot;</span>)</span><br><span class="line">f.close()</span><br><span class="line">#最后通过close，关闭文件对象，也就是关闭对文件的占用</span><br><span class="line">#如果不调用close，同时程序没有停止运行，那么这个文件将一直被python程序占用</span><br></pre></td></tr></table></figure><h1>with open 语法</h1><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">with <span class="title function_">open</span><span class="params">(<span class="string">&quot;python.txt&quot;</span>, <span class="string">&quot;r&quot;</span>)</span> as f:</span><br><span class="line">    f.<span class="title function_">readlines</span><span class="params">()</span></span><br><span class="line">#通过在with open的语句块中对文件进行操作</span><br><span class="line">#可以在操作完成后自动关闭close文件，避免遗忘掉close方法</span><br></pre></td></tr></table></figure><h2 id="案例演示">案例演示</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">#<span class="number">1</span>，打开文件</span><br><span class="line">f = open(<span class="string">&#x27;python.txt&#x27;</span>,<span class="string">&#x27;w&#x27;</span>)</span><br><span class="line">#<span class="number">2</span>,文件写入</span><br><span class="line">f.write(<span class="string">&#x27;hello world&#x27;</span>)</span><br><span class="line">#<span class="number">3</span>,内容刷新</span><br><span class="line">f.flush()</span><br></pre></td></tr></table></figure><p><font style="color:#DF2A3F;">注意：</font></p><ul><li><font style="color:#DF2A3F;">直接调用 write，内容并未真正写入文件，而是会积攒在程序的内存中，称之为缓冲区</font></li><li><font style="color:#DF2A3F;">当调用 flush 的时候，内容会真正写入文件</font></li></ul><h1>读和写</h1><h2 id="1，read（）方法，语法格式如下：">1，read（）方法，语法格式如下：</h2><img src="https://54325432.s3.bitiful.net/image%20%2837%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034416Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=b85c1b569faad9bb6af90868b1325de1773853f444c4e50db8c45625ae47f2fd" width="335" title="" crop="0,0,1,1" id="udc5cc14a" class="ne-image"><p>size——从文件中读取的字节数，如果未指定则读取文件的全部信息</p><p>返回值为从文件中读取的字符串</p><h2 id="2，write（）方法，语法格式如下；">2，write（）方法，语法格式如下；</h2><img src="https://54325432.s3.bitiful.net/image%20%2838%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034425Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=3d5f81e0b863134d54cbfafe32930838a341cecf5705e1fdb17209c6bc7acd7e" width="274" title="" crop="0,0,1,1" id="u584decc8" class="ne-image"><p>write（）方法将字符串写入一个打开的文件</p><p>write（）方法不会自动在字符串的末尾添加换行符（‘\n’)，需要人为在字符串末尾添加换行符，</p><p>返回值：写入的字符数或字节数</p><h2 id="会读文件">会读文件</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">f = open(<span class="string">&quot;./data.txt&quot;</span>)</span><br><span class="line">print(f.read()) #对文件的操作</span><br><span class="line">f.close()   #关闭文件，释放资源</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">with <span class="title function_">open</span><span class="params">(<span class="string">&quot;./data.txt&quot;</span>)</span> as f:</span><br><span class="line"><span class="title function_">print</span><span class="params">(f.read())</span>  #对文件的操作</span><br></pre></td></tr></table></figure><p>with 后面跟上 open 函数的调用</p><p>as 后面跟上文件对象的命名，冒号，缩进的代码块放上对该文件对象的操作，这样在缩进的内容执行完毕后，文件就会被自动关闭，写法二能让代码更加简洁，不用单独调用 close 方法了</p><h3 id="readline-方法">readline 方法</h3><p>用于读取文件中所有行，直到结束符 EOF，并返回列表，包括所有行的信息，该列表可以由 python 的“for…in…&quot;结构进行处理</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">f = open(<span class="string">&quot;./data.txt&quot;</span>, <span class="string">&quot;r&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>)</span><br><span class="line">line = f.readline() </span><br><span class="line">    #读第一行</span><br><span class="line"><span class="keyword">while</span> line != <span class="string">&quot;&quot;</span>:   </span><br><span class="line">#判断当前行是否为空</span><br><span class="line">    print(line)   </span><br><span class="line">        #不为空则打印当前行</span><br><span class="line">    line = f.readline()  </span><br><span class="line">        #读取下一行</span><br></pre></td></tr></table></figure><h3 id="readlines-方法">readlines 方法</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">f = open(<span class="string">&quot;./data.txt&quot;</span>, <span class="string">&quot;r&quot;</span>,encoding=<span class="string">&quot;utf-8&quot;</span>)</span><br><span class="line">    <span class="meta">#readlines会读全部文件内容，并把每行作为列表元素返回</span></span><br><span class="line">    print(f.readlines())</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2839%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034437Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=5e01e64da68d24ffb83e43ae835fa6271caccf0a6cdee7bd805ab7d466ae30cf" width="1495" title="" crop="0,0,1,1" id="ue355f54c" class="ne-image"><h1>读取行</h1><ul><li>调用 read（）会一次性读取文件的全部内容，如果文件有 10G，太耗内存，所以，保险起见，可反复调用 read（size）方法，每次最多读取 size 个字节的内容</li><li>调用 readline（）可以每次读取一行内容，调用 readlines（）一次读取所有内容并按行返回 list，因此，要根据需要决定怎么调用</li><li>如果<font style="color:#DF2A3F;">文件很小</font>，read（）一次性读取最方便；如果<font style="color:#DF2A3F;">不能确定文件大小</font>，反复调用 read（size）比较保险；如果是<font style="color:#DF2A3F;">配置文件</font>，调用 readlines（）最方便</li></ul><h2 id="unittest-TestCase-类的常见测试方法">unittest.TestCase 类的常见测试方法</h2><img src="https://54325432.s3.bitiful.net/image%20%2840%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034453Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=43308c745bc39776e76546a92b3db04c824a7ab5ca6e1ee1bab75465aea1424c" width="1132" title="" crop="0,0,1,1" id="u6f6fa854" class="ne-image"><h1>操作汇总</h1><table><thead><tr><th>操作</th><th>功能</th></tr></thead><tbody><tr><td>文件对象 = open(file,mode,encoding)</td><td>打开文件获得文件对象</td></tr><tr><td>文件对象.read(num)</td><td>读取指定长度字节<br/>不指定 num 读取文件全部</td></tr><tr><td>文件对象.readline()</td><td>读取一行</td></tr><tr><td>文件对象.readlines()</td><td>读取全部行，得到列表</td></tr><tr><td>for line in 文件对象</td><td>for 循环文件行，一次循环得到一行数据</td></tr><tr><td>文件对象.close()</td><td>关闭文件对象</td></tr><tr><td>with open() as f</td><td>通过 with open 语法打开文件，可以自动关闭</td></tr></tbody></table><h1>创建目录</h1><p>mkdir（）方法，语法格式如下：</p><img src="https://54325432.s3.bitiful.net/image%20%2841%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034510Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=ef8a6cd7e66ef2cf125c1996800526ae9246ca1c1eccea3d5d4ba9ec9af72495" width="233" title="" crop="0,0,1,1" id="u2bf6141d" class="ne-image"><p>newdir——新建的目录名称，必须要带目录的完整路径</p><p>注意：要使用目录操作相关的内置函数，必须先导入 os 模块，然后才可以调用相关的功能</p><p>os.mkdir()方法应用如下所示：</p><img src="https://54325432.s3.bitiful.net/image%20%2842%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034517Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=0b8f6f50d6f3393a17c6a4a163ae1437499683a2042c06bf99435e896c1a4424" width="343" title="" crop="0,0,1,1" id="ua15f9550" class="ne-image"><h2 id="显示当前工作目录">显示当前工作目录</h2><p>getcwd（）方法，语法格式如下：</p><img src="https://54325432.s3.bitiful.net/image%20%2843%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034529Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=e78ea435a1db7625c99bc6d93e1065cffa55919a7c58bc3dbcb5fafb6c905750" width="294" title="" crop="0,0,1,1" id="u28f68058" class="ne-image"><h1>改变目录</h1><p>chdir（）方法，语法格式如下：</p><img src="https://54325432.s3.bitiful.net/image%20%2844%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034537Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=739544623c5c0302ff179b894451292bec837d84cf7400df6a8d94ecd92fb699" width="215" title="" crop="0,0,1,1" id="ua5a3472b" class="ne-image"><p>chdir——要改变的新的工作目录名称，需要带目录的完整路径</p><img src="https://54325432.s3.bitiful.net/image%20%2845%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034547Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=9aa69e18672476cd64d3ba0f3e746fa658ee26400e747a6c1fa6f585703b2df7" width="862" title="" crop="0,0,1,1" id="u183a3a99" class="ne-image"><h1>删除目录</h1><p>rmdir（）方法，语法格式如下：</p><img src="https://54325432.s3.bitiful.net/image%20%2846%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=77313496baff0a86941b06d079011493c1c1911a3d2baff21fbc6f1fef0a1072" width="252" title="" crop="0,0,1,1" id="u7b7ab781" class="ne-image"><p>rmdir——要删除的目录名称，需要带目录的完整路径</p><h1>OS 模块提供的与目录相关的函数</h1><table><thead><tr><th>getcwd（）</th><th>返回当前的工作目录</th></tr></thead><tbody><tr><td>listdir（path）</td><td>返回指定路径下的文件和目录信息</td></tr><tr><td>mkdir（path [,mode])</td><td>创建目录</td></tr><tr><td>makedirs（path1/path2…[,mode])</td><td>创建多级目录</td></tr><tr><td>rmdir（path）</td><td>删除目录</td></tr><tr><td>removedirs（path1/path2…)</td><td>删除多级目录</td></tr><tr><td>chdir（path）</td><td>把 path 设置为当前工作目录</td></tr><tr><td>walk（top[,topdown[,onerror]])</td><td>遍历目录树，该方法返回一个元组，包括所有路径名，所有目录列表和文件列表 3 个元素</td></tr></tbody></table><h1>os.path 模块提供的与目录相关的函数</h1><table><thead><tr><th>abspath（path）</th><th>用于获取文件或目录的绝对路径</th></tr></thead><tbody><tr><td>exists（path）</td><td>用于判断目录或文件是否存在，如果存在则返回 true，否则返回 false</td></tr><tr><td>join（path，name）</td><td>将目录与目录或者文件名拼接起来</td></tr><tr><td>splitext（）</td><td>分离文件名和扩展名</td></tr><tr><td>basename（path）</td><td>从一个目录中提取文件名</td></tr><tr><td>dirname（path）</td><td>从一个路径中提取文件路径，不包括文件名</td></tr><tr><td>isdir（path）</td><td>用于判断是否为路径</td></tr></tbody></table><h1>os.stat(path)获取基本信息</h1><p>返回值是一个对象，通过这个对象的一些属性就可以获取这个文件的基本信息</p><img src="https://54325432.s3.bitiful.net/image%20%2847%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034613Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=f02d81ba98133e4dd8620ed5c3479f4fc9cc3b9db59b23a3548a64e9230af137" width="915" title="" crop="0,0,1,1" id="u80fc0ec5" class="ne-image"><h2 id="基本语法">基本语法</h2><p><font style="background-color:#C1E77E;">st_ctime 获取文件的创建日期(状态变化时间）</font></p><p><font style="background-color:#C1E77E;">st_mtime 获取文件的修改日期</font></p><p><font style="background-color:#C1E77E;">st_size 获取文件的大小</font></p><p><font style="background-color:#C1E77E;">st_mode 获取文件的保护模式</font></p><p><font style="background-color:#C1E77E;">st_ino 获取文件的索引号</font></p><p><font style="background-color:#C1E77E;">st_atime 获取文件的最后一次访问时间</font></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">import os </span><br><span class="line">def <span class="title function_">formatTime</span><span class="params">(longtime)</span>:</span><br><span class="line">    &#x27;&#x27;&#x27;格式化时间的函数&#x27;&#x27;&#x27;</span><br><span class="line">    import time</span><br><span class="line">    <span class="keyword">return</span> time.<span class="title function_">strftime</span><span class="params">(<span class="string">&quot;%Y-%m-%d %H:%M:%S&quot;</span>,time.localtime(longtime))</span></span><br><span class="line">def <span class="title function_">formatByte</span><span class="params">(number)</span></span><br><span class="line">    &#x27;&#x27;&#x27;格式化文件大小的函数&#x27;&#x27;&#x27;</span><br><span class="line">    <span class="title function_">for</span> <span class="params">(scale,label)</span> in [<span class="params">(<span class="number">1024</span>*<span class="number">1024</span>*<span class="number">1024</span>,<span class="string">&quot;GB&quot;</span>)</span>,<span class="params">(<span class="number">1024</span>*<span class="number">1024</span>,<span class="string">&quot;MB&quot;</span>)</span>,<span class="params">(<span class="number">1024</span>,<span class="string">&quot;KB&quot;</span>)</span>]:</span><br><span class="line">        <span class="keyword">if</span> number&gt;=scale: #大于等于<span class="number">1</span>KB</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;%.2f %s&quot;</span> %(number*<span class="number">1.0</span>/scale,lable)</span><br><span class="line">        elif number == <span class="number">1</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;1 字节&quot;</span></span><br><span class="line">        <span class="keyword">else</span>:  #小于<span class="number">1</span>KB</span><br><span class="line">            byte = <span class="string">&quot;%.2f&quot;</span> %(number or <span class="number">0</span>)</span><br><span class="line">        <span class="keyword">return</span> (byte[:<span class="number">-3</span>] <span class="keyword">if</span> byte.endswith(<span class="string">&quot;.00&quot;</span>) <span class="keyword">else</span> byte) + <span class="string">&quot;字节&quot;</span></span><br><span class="line">            </span><br><span class="line">fileino = os.stat(<span class="string">&quot;mr.png&quot;</span>) #获取文件的基本信息</span><br><span class="line">print(<span class="string">&quot;文件完整路径：&quot;</span>,os.path.abspat(<span class="string">&quot;mr.png&quot;</span>))  #获取文件的完整路径</span><br><span class="line">#输出文件的基本信息：</span><br><span class="line">print(<span class="string">&quot;索引号：&quot;</span>,fileinfo.st_ino)</span><br><span class="line">print(<span class="string">&quot;设备名：&quot;</span>,fileinfo.st_dev)</span><br><span class="line">print(<span class="string">&quot;文件大小：&quot;</span>,fileinfo.st_size)</span><br><span class="line">print(<span class="string">&quot;最后一次访问时间：&quot;</span>,fileinfo.st_atime)</span><br><span class="line">print(<span class="string">&quot;最后一次修改时间：&quot;</span>,fileinfo.st_mtime)</span><br><span class="line">print(<span class="string">&quot;最后一次状态变化的时间：&quot;</span>,fileinfo.st_ctime)</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2848%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034629Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=b02eea3b4524a9d25ed3e8a68a524323fe4a35847db1ed7e8fad5c8bc8271bce" width="1613" title="" crop="0,0,1,1" id="u830540ab" class="ne-image"><h2 id="使用递归算法遍历目录下所有文件">使用递归算法遍历目录下所有文件</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">import os</span><br><span class="line">allfile = []</span><br><span class="line"></span><br><span class="line">def getFiles(path,level):</span><br><span class="line">    childFiles = os.listdir(path)</span><br><span class="line">    <span class="keyword">for</span> file in childFiles:</span><br><span class="line">        filepath = os.path.join(path,file)</span><br><span class="line">        <span class="keyword">if</span> os.path.isdir(filepath):</span><br><span class="line">            getFiles(filepath,level+<span class="number">1</span>)</span><br><span class="line">        allfile.append(<span class="string">&quot;\t&quot;</span>*level+filepath)</span><br><span class="line"></span><br><span class="line">getFiles(os.getcwd(),<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> f in reversed(allfile):</span><br><span class="line">    print(f)</span><br></pre></td></tr></table></figure><img src="https://54325432.s3.bitiful.net/image%20%2849%29.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=jV9TksE6z1iWPKscHVQSK8Pe%2F20260407%2F%2Fs3%2Faws4_request&X-Amz-Date=20260407T034637Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&x-id=GetObject&X-Amz-Signature=54480bdf16d43175d865075c8f933771610ec33fbed8ab882e3e78a65f543f55" width="771" title="" crop="0,0,1,1" id="uf46172d3" class="ne-image">]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;打开文件&lt;/h1&gt;
&lt;p&gt;python 使用内置函数 open（）打开文件，创建 file 对象，在系统中，只有存在 file 对象后，用户才能对文件进行相应的操作&lt;/p&gt;
&lt;img src=&quot;https://54325432.s3.bitiful.net/image%2</summary>
      
    
    
    
    <category term="-python笔记" scheme="http://www.ububan.github.io/categories/python%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>扣子</title>
    <link href="http://www.ububan.github.io/posts/33243.html"/>
    <id>http://www.ububan.github.io/posts/33243.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T06:46:54.933Z</updated>
    
    <content type="html"><![CDATA[<h1>知识库相关内容</h1><p>扣子的知识库功能支持上传和存储外部知识内容，并提供了多种检索能力，扣子的知识能力可以解决大模型幻觉，专业领域知识不足的问题，提升大模型回复的准确率</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1764141900100-b14ab4e9-b015-4544-98b3-4d292d77d499.png" width="979" title="" crop="0,0,1,1" id="u163bfcc4" class="ne-image"><p>扣子的知识库功能包括两个能力</p><p>一是存储和管理外部数据的能力</p><p>二是增强检索的能力</p><ul><li>数据管理与存储</li></ul><p>扣子支持从多种数据源例如本地文档，在线数据，Notion，飞书文档等渠道上传文本和表格数据。上传后，扣子可将知识内容自动切分为一个个内容片段进行存储，同时支持用户自定义内容分片规则，例如通过分段标识符，字符长度等方式进行内容分割。</p><ul><li>增强检索</li></ul><p>扣子的知识功能还提供了多种检索方式来对存储的内容片段进行检索，例如使用全文检索通过关键词进行内容片段检索和召回。大模型会根据召回的内容片段生成最终的回复内容</p><h1>知识库类型与限制</h1><p>使用知识库功能的第一步就是上传知识内容，知识内容分为如下三种知识类型:</p><table><thead><tr><th>对比项</th><th>文本类型</th><th>表格类型</th><th>照片知识库</th></tr></thead><tbody><tr><td>使用场景</td><td>文本知识库支持基于内容片段进行检索和召回，大模型结合召回的内容生成最终内容回复，适用于知识问答等场景</td><td>表格知识库支持基于索引列的匹配（表格按行进行划分），同时也支持基于 NL2SQL 的查询和计算</td><td>照片知识库支持基于标注信息的匹配，适用于图像生成场景</td></tr><tr><td>导入方式</td><td>+ 本地文档 ：从本地文件中导入文本内容，支持.txt, .pdf, .doc ,.docx 文件格式<br/>+ 在线数据：通过自动和手动方式采集指定网页的内容<br/>+ 第三方采集：从飞书文档和 Notion 文档中导入内容<br/>+ 自定义：手动输入要导入的文本内容</td><td>+ 本地文档 ：从本地文件中导入文本内容，支持.csv 和.xlsx 文件格式<br/>+ 在线数据：通过 API 导入数据<br/>+ 第三方采集：支持从飞书表格中导入数据<br/>+ 自定义：手动输入要导入的表格数据</td><td>本地图片：从本地文件中导入图片，支持 JPG，JPEG 和 PNG 图片格式<br/></td></tr><tr><td>内容分段</td><td>支持自动内容分段和手动分段方式</td><td>对于表格内容，默认按行分片，一行就是一个内容片段，不需要再进行分段设置</td><td>不涉及</td></tr><tr><td>索引</td><td>不涉及</td><td>扣子支持设置索引字段<br/>用户输入的问题会与设置的索引字段内容对比，根据相似度匹配最相关的内容给大模型用于内容生成</td><td>扣子支持设置图片的标注信息<br/>用户输入的问题会与设置的标注信息对比，根据相似度匹配最相关的图片给大模型用于内容生成</td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;知识库相关内容&lt;/h1&gt;
&lt;p&gt;扣子的知识库功能支持上传和存储外部知识内容，并提供了多种检索能力，扣子的知识能力可以解决大模型幻觉，专业领域知识不足的问题，提升大模型回复的准确率&lt;/p&gt;
&lt;img src=&quot;https://cdn.nlark.com/yuque/0/20</summary>
      
    
    
    
    <category term="-个人日记" scheme="http://www.ububan.github.io/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>函数</title>
    <link href="http://www.ububan.github.io/posts/33452.html"/>
    <id>http://www.ububan.github.io/posts/33452.html</id>
    <published>2026-03-17T13:24:45.000Z</published>
    <updated>2026-04-07T06:37:47.257Z</updated>
    
    <content type="html"><![CDATA[<h1>定义语法</h1><p><font style="background-color:#C1E77E;">def 函数名（传入参数）:</font></p><p><font style="background-color:#C1E77E;">函数体</font></p><p><font style="background-color:#C1E77E;">return 返回值</font></p><h2 id="使用步骤">使用步骤</h2><p><font style="color:#DF2A3F;">先定义函数</font></p><p><font style="color:#DF2A3F;">后调用函数</font></p><h2 id="注意事项">注意事项</h2><p>参数不需要，可以省略</p><p>返回值不需要，可省略</p><h1>函数的定义</h1><p>一个程序可以按不同功能实现拆分成不同模块，而函数就是能实现某一部分功能的代码块。</p><p>python 中定义一个函数要使用 def 语句，依次写出函数名，括号，括号内参数和冒号，然后在缩进块中编写函数体，函数的返回值用 return 语句返回</p><p>注意：python 是靠缩进块来标明函数的作用域范围的，缩进块内是函数体，这和其他高级编程语言是有区别的，比如：C/C++/java/R 语言大括号{ }内的是函数体</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766045318823-0546ed0e-ac04-4f46-8cd7-80a0c1c85c9f.png" width="452" title="" crop="0,0,1,1" id="ued982fe3" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766045323862-19ea2649-2cc6-4a05-9187-ceabb950b9c3.png" width="298" title="" crop="0,0,1,1" id="u48aa4954" class="ne-image"><h1>函数中传入参数</h1><p><strong>传入参数的功能是：在函数进行计算的时候，接受外部（调用时）提供的数据</strong></p><h2 id="使用方式">使用方式</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">def <span class="title function_">add</span><span class="params">(x,y)</span></span><br><span class="line">    result = x + y</span><br><span class="line">    <span class="title function_">print</span><span class="params">(<span class="string">&quot;f&#123;x&#125; + &#123;y&#125;的结果是：&#123;result&#125;&quot;</span>)</span></span><br></pre></td></tr></table></figure><h2 id="注意事项-2">注意事项</h2><p>函数定义中的参数称之为形式参数</p><p>函数调用中的参数称之为实际参数</p><p>函数的参数数量不限，使用逗号分隔开</p><p>传入参数的时候，要和形式参数一 一对应，逗号隔开</p><h1>函数的返回值</h1><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763604984594-b26f49c8-831c-44a7-a5ca-16d438afa70e.png" width="305" title="" crop="0,0,1,1" id="u2370524c" class="ne-image"><p>如图代码，定义两数相加的函数功能，完成功能后，会将相加的结果返回给函数调用者，所以，变量 r 接收到了函数的执行结果</p><p>综上所述，返回值就是程序中函数完成事情后，最后给调用者的结果</p><h2 id="返回值的语法">返回值的语法</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">def 函数（参数）：</span><br><span class="line">函数体</span><br><span class="line"><span class="keyword">return</span>返回值</span><br><span class="line">变量=函数（参数）</span><br></pre></td></tr></table></figure><p>变量就能接收到函数的返回值</p><p>语法就是：通过 return 关键字，就能向调用者返回数据</p><h2 id="应用语法">应用语法</h2><p>使用关键字：return 来返回结果</p><h2 id="注意：">注意：</h2><p><strong>函数体在遇到 return 后就结束了，所以写在 return 后的代码不会执行</strong></p><h2 id="None-类型">None 类型</h2><p>其类型是：&lt;class ‘NoneType’&gt;</p><p>无返回值的函数，实际上就是返回了：None 这个字面量</p><p>None 表示：空的，无实际意义的意思</p><p>函数返回的 None 就表示这个函数没有返回什么有意义的内容</p><p>也就是返回了空的意思</p><h2 id="应用场景">应用场景</h2><h3 id="1，用于函数无返回值上">1，用于函数无返回值上</h3><h3 id="2，用在-if-判断上">2，用在 if 判断上</h3><p>（1），在 if 判断上，None 等同于 False</p><p>（2），一般用于在函数中主动返回 None，配合 if 判断做相关处理</p><h3 id="3，用于声明无内容的变量上">3，用于声明无内容的变量上</h3><p>定义变量，但暂时不需要变量有具体值，可以用 None 来代替</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#暂不赋予变量具体值</span><br><span class="line">name = None</span><br></pre></td></tr></table></figure><h2 id="函数如何返回-None">函数如何返回 None</h2><p>1，不使用 return 语句即返回 None</p><p>2，主动 return None</p><h1>说明文档</h1><p>函数是纯代码语言，想要理解其含义，就需要一行行的去阅读理解代码，效率比较低</p><p>我们可以给函数添加说明文档，辅助理解函数的作用</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">def <span class="title function_">func</span><span class="params">(x,y)</span>:</span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">    函数说明</span><br><span class="line">    ：param x：形参x的说明</span><br><span class="line">    ：param y：形参y的说明</span><br><span class="line">    ：<span class="keyword">return</span>：返回值的说明</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    函数体</span><br><span class="line">    <span class="keyword">return</span>返回值</span><br></pre></td></tr></table></figure><p>通过多行注释的形式，对函数进行说明解释</p><p>内容应写在函数体之前</p><p>：param 用于解释参数</p><p>：return 用于解释返回值</p><h1>函数的嵌套</h1><p>函数嵌套指的是一个函数里面又调用了另外一个函数</p><p>·<img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763607852211-b42847eb-4a1b-4a01-8063-6cc787bd2e91.png" width="341" title="" crop="0,0,1,1" id="u2237b576" class="ne-image"></p><p>执行流程：</p><p>函数 A 中执行到调用函数 B 的语句，会将函数 B 全部执行完成后，继续执行函数 A 的剩余内容</p><h1>变量</h1><h2 id="局部变量">局部变量</h2><p>变量作用域指的是变量的作用范围（变量在哪里可用，在哪里不可用）</p><p>主要分为两类：局部变量和全局变量</p><p>所谓局部变量是定义在函数体内部的变量，即只在函数体内部生效</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763608191443-59ef9b79-acc3-43cb-84f0-748569309bbf.png" width="503" title="" crop="0,0,1,1" id="ua0ad9a10" class="ne-image"><p>变量 A 是定义在“testA”函数内部的 变量，在函数外部访问则立即报错</p><p>局部变量的作用：在函数内部，临时保存数据，即当函数调用完成后，则销毁局部变量</p><h2 id="全局变量">全局变量</h2><p>指的是在函数体内，外都能生效的变量</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763608668048-cfa79cd0-e054-413c-8f86-5d5e9ce7b76e.png" width="424" title="" crop="0,0,1,1" id="ua31b7af9" class="ne-image"><p>使用 global 关键字将函数内定义的变量声明为全局变量</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763609063374-49eb652a-4f02-474b-9cef-ec170ba1917c.png" width="445" title="" crop="0,0,1,1" id="u8bb4cc2f" class="ne-image"><h2 id="位置参数和关键字参数">位置参数和关键字参数</h2><p>位置参数调用参数时，传入参数值按照位置顺序依次赋给参数，这样的参数称为位置参数，如下所示代码 ：</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766046180534-ef01bdb8-6edf-45d9-bdaa-c64ead75acc8.png" width="563" title="" crop="0,0,1,1" id="u8086dafd" class="ne-image"><p>关键字参数函数调用时，通过参数名指定需要赋值的参数。通常我们在调用一个函数的时候，如果参数有多个，我们常常会混洗一个参数的顺序，达不到我们希望的效果。在 python 中引入关键字参数就可解决这个潜在的问题，如下所示代码：</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1766046274079-6014d81d-c19a-4ee2-8c18-355ba6af1895.png" width="928" title="" crop="0,0,1,1" id="u3dccc520" class="ne-image"><h1>例题</h1><p>主菜单效果</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763610310964-06fd5d8e-cce1-4867-a71c-0d906f2b1ca8.png" width="419" title="" crop="0,0,1,1" id="u51e66508" class="ne-image"><p>查询余额效果</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763610406872-2b269a51-45dc-4536-90e1-bbe395bdf352.png" width="693" title="" crop="0,0,1,1" id="u9ff5bbc8" class="ne-image"><p>存，取款效果</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763610455334-37833a7f-c373-4afc-9264-8a9a225d73ef.png" width="365" title="" crop="0,0,1,1" id="u4ca11d4f" class="ne-image"><p>1.定义一个全局变量：money，用来记录银行卡余额（默认 5000000）</p><p>2，定义一个全局变量：name ，用来记录客户姓名（启动程序时输入）</p><p>3.定义如下的函数：</p><ul><li>查询余额函数</li><li>存款函数</li><li>取款函数</li><li>主菜单函数</li></ul><p>要求：</p><ul><li>程序启动后要求输入客户姓名</li><li>查询余额，存款，取款后都会返回主菜单</li><li>存款，取款后，都应显示一下当前余额</li><li>客户选择退出或输入错误，程序会退出，否则程序会一直运行</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">演示函数综合案例开发</span></span><br><span class="line"><span class="string">&quot;</span><span class="string">&quot;&quot;</span></span><br><span class="line">#定义全局变量money name</span><br><span class="line">money = <span class="number">5000000</span></span><br><span class="line">name = None</span><br><span class="line"></span><br><span class="line">#要求客户输入姓名</span><br><span class="line">name = input(<span class="string">&quot;请输入您的姓名：&quot;</span>)</span><br><span class="line">#定义查询函数</span><br><span class="line">def query(show_header):</span><br><span class="line">  <span class="keyword">if</span> show_header:</span><br><span class="line">      print(<span class="string">&quot;----------------查询余额-----------------------&quot;</span>)</span><br><span class="line">  print(f<span class="string">&quot;&#123;name&#125;,您好，您的余额剩余：&#123;money&#125;元&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#定义存款函数</span><br><span class="line">def saving(num):</span><br><span class="line">  global money   <span class="meta">#money在函数内部定义为全局变量</span></span><br><span class="line">  money += num</span><br><span class="line">  print(<span class="string">&quot;----------------存款-----------------------&quot;</span>)</span><br><span class="line">  print(f<span class="string">&quot;&#123;name&#125;,您好，您存款&#123;num&#125;元成功&quot;</span>)</span><br><span class="line"></span><br><span class="line">  #调用query函数查询余额</span><br><span class="line">  query(False)</span><br><span class="line"></span><br><span class="line">#定义取款函数</span><br><span class="line">def get_money(num):</span><br><span class="line">  global money</span><br><span class="line">  money -= num</span><br><span class="line">  print(<span class="string">&quot;----------------取款-----------------------&quot;</span>)</span><br><span class="line">  print(f<span class="string">&quot;&#123;name&#125;,您好，您取款&#123;num&#125;元成功&quot;</span>)</span><br><span class="line"></span><br><span class="line">#调用query函数查询余额</span><br><span class="line">query(False)</span><br><span class="line">#定义主菜单函数</span><br><span class="line">def main():</span><br><span class="line">  print(<span class="string">&quot;----------------主菜单-----------------------&quot;</span>)</span><br><span class="line">  print(f<span class="string">&quot;&#123;name&#125;,您好，欢迎来到黑马银行AMT。请选择操作：&quot;</span>)</span><br><span class="line">  print(<span class="string">&quot;查询余额\t[输入1]&quot;</span>)</span><br><span class="line">  print(<span class="string">&quot;存款\t\t[输入2]&quot;</span>)</span><br><span class="line">  print(<span class="string">&quot;取款\t\t[输入3]&quot;</span>)   #通过\t制表符对齐输出</span><br><span class="line">  print(<span class="string">&quot;退出\t\t[输入4]&quot;</span>)</span><br><span class="line">  <span class="keyword">return</span> input(<span class="string">&quot;请输入您的选择：&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#设置无限循环，确保程序不退出</span><br><span class="line"><span class="keyword">while</span> True:</span><br><span class="line">  keyboard_input = main()</span><br><span class="line">  <span class="keyword">if</span> keyboard_input == <span class="string">&quot;1&quot;</span>:</span><br><span class="line">    query(True)</span><br><span class="line">    <span class="keyword">continue</span>  #通过<span class="keyword">continue</span>继续下一次循环，一进来就是回到了主菜单</span><br><span class="line">  elif keyboard_input == <span class="string">&quot;2&quot;</span>:</span><br><span class="line">    num = <span class="type">int</span>(input(<span class="string">&quot;您想要存多少钱？请输入：&quot;</span>))</span><br><span class="line">    saving(num)</span><br><span class="line">    <span class="keyword">continue</span></span><br><span class="line">  elif keyboard_input == <span class="string">&quot;3&quot;</span>:</span><br><span class="line">    num = <span class="type">int</span>(input(<span class="string">&quot;您想要取多少钱？请输入：&quot;</span>))</span><br><span class="line">    get_money(num)</span><br><span class="line">    <span class="keyword">continue</span></span><br><span class="line">  <span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&quot;程序退出啦&quot;</span>)</span><br><span class="line">    <span class="keyword">break</span>    #通过<span class="keyword">break</span>退出循环</span><br></pre></td></tr></table></figure><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763620373307-c9c8f1b3-c59f-4149-94ce-d05abfebf127.png" width="602" title="" crop="0,0,1,1" id="u7a7c1dfb" class="ne-image"><h1>递归函数</h1><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763691056696-66a46993-07bd-4e72-b039-d1eb33891ef3.png" width="637" title="" crop="0,0,1,1" id="u662856ff" class="ne-image"><p>递归可以把一个大问题分解成更小的同类型问题，直到问题小到可以被直接解决，继而层层解决掉原本的大问题</p><p>递归函数需要一个终止条件，当满足某个终止条件时，函数就不再递归调用了</p><h2 id="为什么无限调用会导致程序崩溃呢？">为什么无限调用会导致程序崩溃呢？</h2><p>因为每次调用函数都会在内存新增一个栈帧，用来保存函数内部的状态，比如函数局部变量的值等等，因为函数各个都是相互独立的，但栈空间是有限的，如果我们只是一味调用函数而不返回，一旦栈被填满后，就会导致栈溢出。程序会直接中止运行</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763691372887-a7e72b0b-4dd0-4869-9b34-8346725f1538.png" width="384" title="" crop="0,0,1,1" id="uc83b2975" class="ne-image"><p>基本情况（Base case）：用来决定递归的终止条件</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763691554319-6059f77a-b3c6-4ea8-b70e-149c06fdf3f1.png" width="1370" title="" crop="0,0,1,1" id="u800a35d8" class="ne-image"><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763691738743-1f356d56-38c4-4d18-b80f-c5be6e079142.png" width="1357" title="" crop="0,0,1,1" id="u8f8a0de3" class="ne-image"><h1>LEGB 规则</h1><p>python 在查找“名称”时，是按照 LEGB 规则查找的：</p><img src="https://cdn.nlark.com/yuque/0/2025/png/50252276/1763692622619-652d5270-43ab-46ed-9896-b3b7750fd346.png" width="827" title="" crop="0,0,1,1" id="udc541eb2" class="ne-image"><p>Local 指的是函数或者类的方法内部</p><p>Enclosed 指的是嵌套函数（一个函数包裹另一个函数，闭包）</p><p>Global 指的是模块中的全局变量</p><p>Built in 指的是 python 为自己保留的特殊名称</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;定义语法&lt;/h1&gt;
&lt;p&gt;&lt;font style=&quot;background-color:#C1E77E;&quot;&gt;def 函数名（传入参数）:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font style=&quot;background-color:#C1E77E;&quot;&gt;函数体&lt;/font&gt;&lt;/p&gt;</summary>
      
    
    
    
    <category term="-python笔记" scheme="http://www.ububan.github.io/categories/python%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="-示例 -博客" scheme="http://www.ububan.github.io/tags/%E7%A4%BA%E4%BE%8B-%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
</feed>
