<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>印星</title>
  
  <subtitle>印星</subtitle>
  <link href="http://example.com/atom.xml" rel="self"/>
  
  <link href="http://example.com/"/>
  <updated>2026-04-03T08:43:34.173Z</updated>
  <id>http://example.com/</id>
  
  <author>
    <name>印星</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>PY进阶——生成器与正则</title>
    <link href="http://example.com/2026/04/01/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E7%94%9F%E6%88%90%E5%99%A8%E4%B8%8E%E6%AD%A3%E5%88%99/"/>
    <id>http://example.com/2026/04/01/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E7%94%9F%E6%88%90%E5%99%A8%E4%B8%8E%E6%AD%A3%E5%88%99/</id>
    <published>2026-04-01T11:40:14.000Z</published>
    <updated>2026-04-03T08:43:34.173Z</updated>
    
    <content type="html"><![CDATA[<h3 id="迭代器"><a href="#迭代器" class="headerlink" title="迭代器"></a>迭代器</h3><p>迭代器是py的一种对象，可以对数据集进行遍历，例如列表、元组、range()等等<br>实现了__iter__()和__next__()方法的对象，可以逐步遍历它的元素</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Foreach</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,start,end</span>):<br>        <span class="hljs-variable language_">self</span>.start = start<br>        <span class="hljs-variable language_">self</span>.end = end<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__iter__</span>(<span class="hljs-params">self</span>):<span class="hljs-comment">#返回迭代对象</span><br>        <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__next__</span>(<span class="hljs-params">self</span>):<span class="hljs-comment">#返回当前值并更新当前值</span><br>        <span class="hljs-keyword">if</span> <span class="hljs-variable language_">self</span>.start &gt;= <span class="hljs-variable language_">self</span>.end:<br>            <span class="hljs-keyword">raise</span> StopIteration<br>        <span class="hljs-keyword">else</span>:<br>            <span class="hljs-variable language_">self</span>.start+=<span class="hljs-number">1</span><br>            <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.start-<span class="hljs-number">1</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> Foreach(<span class="hljs-number">1</span>,<span class="hljs-number">6</span>):<br>    <span class="hljs-built_in">print</span>(i)<br></code></pre></td></tr></table></figure><h3 id="生成器"><a href="#生成器" class="headerlink" title="生成器"></a>生成器</h3><p>根据程序员制定的规则循环生成数据，当条件不成立时生成数据结束，使用一个再生成一个，可以节约内存<br><strong>创建方式</strong><br>生成器推导式</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><code class="hljs python"><span class="hljs-comment"># 创建生成器</span><br>g=(i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>,<span class="hljs-number">11</span>) <span class="hljs-keyword">if</span> i%<span class="hljs-number">2</span>==<span class="hljs-number">0</span>)<br><span class="hljs-built_in">print</span>(g)<br><span class="hljs-comment"># &lt;generator object &lt;genexpr&gt; at 0x000001DFD0750380&gt;</span><br><span class="hljs-comment"># 获取数据</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(g))<span class="hljs-comment">#2</span><br><span class="hljs-keyword">for</span> target <span class="hljs-keyword">in</span> g:<br>    <span class="hljs-built_in">print</span>(target)<span class="hljs-comment">#4 6 8 10</span><br></code></pre></td></tr></table></figure><p>上述代码中循环输出语句没有输出2是因为生成器是使用一个再生成一个，2在next中已经被使用了<br>yield关键字创建</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><code class="hljs python"><span class="hljs-comment">#定义函数，存储到生成器中并返回</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">g</span>():<br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">2</span>,<span class="hljs-number">11</span>,<span class="hljs-number">2</span>):<br>        <span class="hljs-keyword">yield</span> i<br>g=g()<br><span class="hljs-built_in">print</span>(g)<br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">next</span>(g))<br><span class="hljs-keyword">for</span> target <span class="hljs-keyword">in</span> g:<br>    <span class="hljs-built_in">print</span>(target)<br></code></pre></td></tr></table></figure><p>结果与推导式的一致</p><h3 id="Property属性-原型"><a href="#Property属性-原型" class="headerlink" title="Property属性(原型)"></a>Property属性(原型)</h3><p>把函数当属性使用，可以简化代码使用<br>装饰器定义</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><code class="hljs python"><span class="hljs-comment"># @property 修饰 获取值的函数</span><br><span class="hljs-comment"># 获取值的函数名.setter 修饰设置值的函数</span><br><span class="hljs-comment"># .函数名 当属性名来使用</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, name, age</span>):<br>        <span class="hljs-variable language_">self</span>.name = name<br>        <span class="hljs-variable language_">self</span>.__age = age<br><span class="hljs-meta">    @property</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">get_age</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.__age<br><span class="hljs-comment"># 装饰名与函数要一致</span><br><span class="hljs-meta">    @get_age.setter</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">get_age</span>(<span class="hljs-params">self, age</span>):<br>        <span class="hljs-variable language_">self</span>.__age = age<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:<br>    p=Person(<span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-number">18</span>)<br>    p.get_age=<span class="hljs-number">20</span><br>    <span class="hljs-built_in">print</span>(p.get_age)<br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, name, age</span>):<br>        <span class="hljs-variable language_">self</span>.name = name<br>        <span class="hljs-variable language_">self</span>.__age = age<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">get_age</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.__age<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">set_age</span>(<span class="hljs-params">self, age</span>):<br>        <span class="hljs-variable language_">self</span>.__age = age<br>    age = <span class="hljs-built_in">property</span>(get_age, set_age)<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:<br>    p=Person(<span class="hljs-string">&#x27;john&#x27;</span>, <span class="hljs-number">18</span>)<br>    p.age=<span class="hljs-number">10</span><br>    <span class="hljs-built_in">print</span>(p.age)<br></code></pre></td></tr></table></figure><h3 id="正则"><a href="#正则" class="headerlink" title="正则"></a>正则</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">match默认从前往后匹配，匹配则返回</span><br><span class="hljs-string">search是分段找，存在段匹配则返回</span><br><span class="hljs-string">compile(&#x27;正则表达式&#x27;).sub(替换后的内容，要被替换的字符串)</span><br><span class="hljs-string">常用规则</span><br><span class="hljs-string">. 代表任意一个字符（\n除外）</span><br><span class="hljs-string">\. 取消.的特殊含义，就是一个普通的.</span><br><span class="hljs-string">[abc] 代表abc中任意一个字符</span><br><span class="hljs-string">[^abc] 代表出了abc外任意的一个字符</span><br><span class="hljs-string">\d 代表数字，等价于[0-9]</span><br><span class="hljs-string">\D 代表非数字 等价于[^0-9]</span><br><span class="hljs-string">* 数量词任意多个字符</span><br><span class="hljs-string">+ 匹配前一个字符多次</span><br><span class="hljs-string">? 匹配前一个字符0或1次</span><br><span class="hljs-string">&#123;m&#125; 匹配前一个字符出现m次</span><br><span class="hljs-string">&#123;m,n&#125; 匹配前一个字符出现从m到n次</span><br><span class="hljs-string">\s 匹配空白，即空格，tab键</span><br><span class="hljs-string">\S 匹配非空白</span><br><span class="hljs-string">\w 匹配非特殊字符，如a-z,A-Z,0-9、_、汉字</span><br><span class="hljs-string">\W 匹配特殊字符</span><br><span class="hljs-string">^ 匹配字符串开头</span><br><span class="hljs-string">$ 匹配字符串结尾</span><br><span class="hljs-string">| 匹配左右任意一个表达式</span><br><span class="hljs-string">(ab)将括号中字符作为一个分组</span><br><span class="hljs-string">\num 引用分组num匹配到字符串</span><br><span class="hljs-string">(?P&lt;分组名&gt;)设置分组</span><br><span class="hljs-string">(?P=分组名)</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-comment"># \num的使用</span><br>res=re.<span class="hljs-keyword">match</span>(<span class="hljs-string">&#x27;&lt;([a-zA-Z]&#123;1,4&#125;)&gt;.*&lt;/\1&gt;&#x27;</span>，html)<span class="hljs-comment">#匹配标签</span><br></code></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><code class="hljs python"><span class="hljs-comment"># 导入</span><br><span class="hljs-keyword">import</span> re<br><span class="hljs-comment"># 校验</span><br>res=re.<span class="hljs-keyword">match</span>(<span class="hljs-string">&#x27;校验规则&#x27;</span>,<span class="hljs-string">&#x27;被校验字符串&#x27;</span>)<br><span class="hljs-comment"># 获取数据</span><br>info=res.group()<br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;迭代器&quot;&gt;&lt;a href=&quot;#迭代器&quot; class=&quot;headerlink&quot; title=&quot;迭代器&quot;&gt;&lt;/a&gt;迭代器&lt;/h3&gt;&lt;p&gt;迭代器是py的一种对象，可以对数据集进行遍历，例如列表、元组、range()等等&lt;br&gt;实现了__iter__()和__next__</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python进阶" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E8%BF%9B%E9%98%B6/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python进阶" scheme="http://example.com/tags/python%E8%BF%9B%E9%98%B6/"/>
    
  </entry>
  
  <entry>
    <title>PY进阶——网编与多线程</title>
    <link href="http://example.com/2026/03/27/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E7%BD%91%E7%BC%96%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/"/>
    <id>http://example.com/2026/03/27/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E7%BD%91%E7%BC%96%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/</id>
    <published>2026-03-27T07:01:26.000Z</published>
    <updated>2026-04-02T13:47:34.353Z</updated>
    
    <content type="html"><![CDATA[<h2 id="网络编程"><a href="#网络编程" class="headerlink" title="网络编程"></a>网络编程</h2><p>用来实现不同计算机上运行的程序间进行数据交互<br>主要应用于文件传输、设备数据传输</p><h3 id="IP-端口号-协议"><a href="#IP-端口号-协议" class="headerlink" title="IP&#x2F;端口号&#x2F;协议"></a>IP&#x2F;端口号&#x2F;协议</h3><p>IP确定设备，端口号确定服务，协议保障数据传输的规则</p><h3 id="Soket与TCP开发流程"><a href="#Soket与TCP开发流程" class="headerlink" title="Soket与TCP开发流程"></a>Soket与TCP开发流程</h3><p>TCP通信：三次握手建立连接，四次挥手断开连接<br>建立连接后进行数据传输，该协议数据传输可靠<br><strong>Socket</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment">#导入socket模块</span><br><span class="hljs-keyword">import</span> socket<br><span class="hljs-comment"># socket(AddressFamily,Type)</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">上述创建一个socket对象</span><br><span class="hljs-string">参数AddressFamily（地址族）默认选择AF_INET(ipv4），AF_INT6（ipv6）用于进程间通信，</span><br><span class="hljs-string">Type表示套接字类型（默认SOCK_STREAM，用于TCP协议；SOCK_DGRAM用于UDP）</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-comment">#创建Socket对象</span><br>socket_obj=socket.socket(socket.AF_INET,socket.SOCK_STREAM)<br></code></pre></td></tr></table></figure><h4 id="TCP开发流程"><a href="#TCP开发流程" class="headerlink" title="TCP开发流程"></a>TCP开发流程</h4><p>服务端：socket()-&gt;bind()-&gt;listen()-&gt;accept()-&gt;等待连接-&gt;(send()&lt;&#x3D;&gt;recv())-&gt;close()<br>bind()指定服务端(ip,端口号)，listen()最大监听数(最大数为128),accept()等待监听（会返回一个包含负责和客户端交互的socket与客户端信息的元组，也称为connection对象），即当客户端开始连接时，会分配单独的socket对象与客户端做交互<br>send(data)发送数据（data为bytes二进制形式），recv(bufsize)接收数据（返回bytes二进制形式，bufsize指定最大的数据量），close()关闭连接，对服务端来说关闭的是那个单独的socket<br>客户端：socket()-&gt;connect()-&gt;(recv()&lt;&#x3D;&gt;send())-&gt;close()<br>connect()向(ip,端口号)发起连接<br><img src="/img/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/1.png"><br>除上述外还有同时应用于服务端&#x2F;客户端的函数为**setsokopt(level,optname,value)**用于设置端口号复用，当程序结束后立即释放端口号，level&#x3D;SOL_SOCKET（当前套接字对象）,optname&#x3D;SO_REUSEADDR（重用端口）,value&#x3D;True</p><h3 id="TCP编程"><a href="#TCP编程" class="headerlink" title="TCP编程"></a>TCP编程</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> socket<br><span class="hljs-comment"># 服务端</span><br>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br><span class="hljs-comment"># 绑定数据</span><br>s.bind((<span class="hljs-string">&#x27;127.0.0.1&#x27;</span>, <span class="hljs-number">9092</span>))<br><span class="hljs-comment"># 设置监听数目</span><br>s.listen(<span class="hljs-number">5</span>)<br><span class="hljs-comment"># 监听等待连接</span><br>conn, addr = s.accept()<br><span class="hljs-comment">#发送消息</span><br>conn.send(<span class="hljs-string">b&#x27;Hello, world!&#x27;</span>)<span class="hljs-comment">#对英文字符转二进制</span><br><span class="hljs-comment">#接收信息</span><br>data=conn.recv(<span class="hljs-number">1024</span>).decode(<span class="hljs-string">&#x27;utf8&#x27;</span>)<br><span class="hljs-built_in">print</span>(data)<br><span class="hljs-comment">#关闭连接</span><br>conn.close()<br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> socket<br><span class="hljs-comment"># 客户端</span><br>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br><span class="hljs-comment"># 绑定数据</span><br>s.connect((<span class="hljs-string">&#x27;127.0.0.1&#x27;</span>, <span class="hljs-number">9092</span>))<br><span class="hljs-comment">#发送消息</span><br>s.send(<span class="hljs-string">&#x27;你好&#x27;</span>.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>))<br><span class="hljs-comment">#接收信息</span><br>data=s.recv(<span class="hljs-number">1024</span>).decode(<span class="hljs-string">&#x27;utf8&#x27;</span>)<br><span class="hljs-built_in">print</span>(data)<br><span class="hljs-comment">#关闭连接</span><br>s.close()<br></code></pre></td></tr></table></figure><p>上述代码是单线程的<br>当客户端close后，服务端的recv会解阻塞，返回的数据长度为0，以此判断客户端是否下线</p><h4 id="模拟多任务处理"><a href="#模拟多任务处理" class="headerlink" title="模拟多任务处理"></a>模拟多任务处理</h4><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><code class="hljs python"><span class="hljs-keyword">import</span> socket<br><span class="hljs-comment"># 服务端</span><br>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br><span class="hljs-comment"># 绑定数据</span><br>s.bind((<span class="hljs-string">&#x27;127.0.0.1&#x27;</span>, <span class="hljs-number">9092</span>))<br><span class="hljs-comment"># 设置监听数目</span><br>s.listen(<span class="hljs-number">5</span>)<br><span class="hljs-comment"># 监听等待连接</span><br><span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>    <span class="hljs-keyword">try</span>:<span class="hljs-comment">#防止存在连接错误</span><br>        conn, addr = s.accept()<br>        conn.senda(<span class="hljs-string">b&#x27;Hello, world!&#x27;</span>)<br>        data=conn.recv(<span class="hljs-number">1024</span>).decode(<span class="hljs-string">&#x27;utf8&#x27;</span>)<br>        <span class="hljs-built_in">print</span>(data)<br>        conn.close()<br>    <span class="hljs-keyword">except</span>:<br>        <span class="hljs-keyword">pass</span><br></code></pre></td></tr></table></figure><p>上述代码是模拟多任务，实际上是分时操作</p><h4 id="编解码"><a href="#编解码" class="headerlink" title="编解码"></a>编解码</h4><p>英文字母、数字、特殊符号在所有码表中只占一个字节，中文在gbk占两个字节，utf中占3字节<br><strong>二进制特殊编码</strong>：对字母，数字，特殊符号可使用**b’str’**做编码<br>常规编码</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><code class="hljs python">s1=<span class="hljs-string">&#x27;你好22hello!&#x27;</span><br><span class="hljs-comment"># 编码</span><br>s1.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>)<br>s2=s1.encode(<span class="hljs-string">&#x27;gbk&#x27;</span>)<br><span class="hljs-comment"># 解码</span><br>s2.decode(<span class="hljs-string">&#x27;gbk&#x27;</span>)<br></code></pre></td></tr></table></figure><h3 id="文件传输例"><a href="#文件传输例" class="headerlink" title="文件传输例"></a>文件传输例</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><code class="hljs python"><span class="hljs-keyword">import</span> socket<br><span class="hljs-comment"># 客户端</span><br>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br><span class="hljs-comment"># 绑定数据</span><br>s.connect((<span class="hljs-string">&#x27;127.0.0.1&#x27;</span>, <span class="hljs-number">9092</span>))<br><span class="hljs-comment">#发送消息</span><br><span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&#x27;./data/text.txt&#x27;</span>, <span class="hljs-string">&#x27;rb&#x27;</span>) <span class="hljs-keyword">as</span> f:<br>    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>        byes = f.read(<span class="hljs-number">8192</span>)<br>        <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(byes) ==<span class="hljs-number">0</span>:<br>            <span class="hljs-keyword">break</span><br>        s.send(byes)<br><span class="hljs-comment"># 发送完毕后主动关闭连接</span><br>s.shutdown(socket.SHUT_WR)<br>data=s.recv(<span class="hljs-number">1024</span>).decode(<span class="hljs-string">&#x27;utf8&#x27;</span>)<br><span class="hljs-built_in">print</span>(data)<br><span class="hljs-comment">#关闭连接</span><br>s.close()<br></code></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><code class="hljs python"><span class="hljs-keyword">import</span> socket<br><span class="hljs-comment"># 服务端</span><br>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br><span class="hljs-comment"># 绑定数据</span><br>s.bind((<span class="hljs-string">&#x27;127.0.0.1&#x27;</span>, <span class="hljs-number">9092</span>))<br><span class="hljs-comment"># 设置监听数目</span><br>s.listen(<span class="hljs-number">5</span>)<br>count=<span class="hljs-number">0</span><br><span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>    count+=<span class="hljs-number">1</span><br>    <span class="hljs-comment"># 监听等待连接</span><br>    conn, addr = s.accept()<br>    <span class="hljs-keyword">try</span>:<br>        <span class="hljs-comment"># 关联目的地文件</span><br>        <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">&#x27;./data/&#x27;</span>+<span class="hljs-built_in">str</span>(count)+<span class="hljs-string">&#x27;.txt&#x27;</span>, <span class="hljs-string">&#x27;wb&#x27;</span>) <span class="hljs-keyword">as</span> dest_f:<br>        <span class="hljs-comment">#接收信息</span><br>            <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>                byes=conn.recv(<span class="hljs-number">8192</span>)<br>                <span class="hljs-comment"># 无数据时说明客户端已断开连接</span><br>                <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(byes)==<span class="hljs-number">0</span>:<br>                    <span class="hljs-keyword">break</span><br>                dest_f.write(byes)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;文件接收成功&#x27;</span>)<br>        conn.send(<span class="hljs-string">&#x27;文件上传成功&#x27;</span>.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>))<br>        conn.close()<br>    <span class="hljs-keyword">except</span>:<br>         conn.send(<span class="hljs-string">&#x27;文件上传失败&#x27;</span>.encode(<span class="hljs-string">&#x27;utf-8&#x27;</span>))<br>         <span class="hljs-keyword">break</span><br></code></pre></td></tr></table></figure><h2 id="多任务"><a href="#多任务" class="headerlink" title="多任务"></a>多任务</h2><p>多任务同时执行能够充分利用CPU效率，提高执行效率<br>多任务是在同一时间内执行多个任务<br>并发：在一段时间内交替执行任务（单核CPU实现多任务效果，CPU做高效切换）<br>并行：在一段时间内同时执行多个任务（多核cpu）</p><h2 id="进程"><a href="#进程" class="headerlink" title="进程"></a>进程</h2><p>进程是cpu分配资源的最小单位<br>比如一个正在运行的程序至少有一个进程<br>Process(target&#x3D;None,name&#x3D;None,args&#x3D;(),kwargs&#x3D;{})<br>target调用对象,子进程要执行的任务(回调函数入口地址)<br>name子进程名称<br>args以元组形式向子任务函数传参,顺序一致<br>kwargs以字典形式向子任务传参</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><code class="hljs python"><span class="hljs-comment"># 创建多进程</span><br><span class="hljs-comment"># 导入进程工具包</span><br><span class="hljs-keyword">import</span> multiprocessing <span class="hljs-keyword">as</span> mp<br><span class="hljs-comment"># 创建实例化对象</span><br>m=mp.Process()<br><span class="hljs-comment"># 启动进程</span><br>m.start()<br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 创建多进程</span><br><span class="hljs-comment"># 导入进程工具包</span><br><span class="hljs-keyword">import</span> multiprocessing <span class="hljs-keyword">as</span> mp<br><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">reading</span>(<span class="hljs-params">name</span>):<br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>,<span class="hljs-number">11</span>):<br>        time.sleep(<span class="hljs-number">0.1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;reading <span class="hljs-subst">&#123;name&#125;</span> in <span class="hljs-subst">&#123;i&#125;</span>&#x27;</span>)<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">writing</span>(<span class="hljs-params">name</span>):<br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>,<span class="hljs-number">11</span>):<br>        time.sleep(<span class="hljs-number">0.1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;writing <span class="hljs-subst">&#123;name&#125;</span> in <span class="hljs-subst">&#123;i&#125;</span>&#x27;</span>)<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    r=mp.Process(target=reading,args=(<span class="hljs-string">&#x27;book&#x27;</span>,))<br>    w=mp.Process(target=writing,args=(<span class="hljs-string">&#x27;title&#x27;</span>,))<br>    r.start()<br>    w.start()<br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">writing title in 1</span><br><span class="hljs-string">reading book in 2</span><br><span class="hljs-string">writing title in 2</span><br><span class="hljs-string">reading book in 3</span><br><span class="hljs-string">writing title in 3</span><br><span class="hljs-string">reading book in 4</span><br><span class="hljs-string">writing title in 4</span><br><span class="hljs-string">reading book in 5</span><br><span class="hljs-string">writing title in 5</span><br><span class="hljs-string">reading book in 6</span><br><span class="hljs-string">writing title in 6</span><br><span class="hljs-string">reading book in 7</span><br><span class="hljs-string">writing title in 7</span><br><span class="hljs-string">reading book in 8</span><br><span class="hljs-string">writing title in 8</span><br><span class="hljs-string">reading book in 9</span><br><span class="hljs-string">writing title in 9</span><br><span class="hljs-string">reading book in 10</span><br><span class="hljs-string">writing title in 10</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br></code></pre></td></tr></table></figure><h3 id="获取进程编号"><a href="#获取进程编号" class="headerlink" title="获取进程编号"></a>获取进程编号</h3><p>一个进程有唯一的标识-进程编号<br>获取进程编号是验证主进程与子进程的关系,得知子进程是由哪个主进程创建的<br>也可以杀死指定进程,创建子进程</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><code class="hljs python"><span class="hljs-comment"># 获取当前进程编号 os.getpid()或者mp.current_process().pid</span><br><span class="hljs-comment"># 获取当前父进程编号os.getppid()</span><br><span class="hljs-keyword">import</span> multiprocessing <span class="hljs-keyword">as</span> mp<br><span class="hljs-keyword">import</span> os<br><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">reading</span>(<span class="hljs-params">name</span>):<br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>,<span class="hljs-number">11</span>):<br>        time.sleep(<span class="hljs-number">0.1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;reading <span class="hljs-subst">&#123;name&#125;</span> in <span class="hljs-subst">&#123;i&#125;</span>&#x27;</span>)<br>    <span class="hljs-built_in">print</span>(os.getpid(),mp.current_process().pid,os.getppid())<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">writing</span>(<span class="hljs-params">name</span>):<br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1</span>,<span class="hljs-number">11</span>):<br>        time.sleep(<span class="hljs-number">0.1</span>)<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;writing <span class="hljs-subst">&#123;name&#125;</span> in <span class="hljs-subst">&#123;i&#125;</span>&#x27;</span>)<br>    <span class="hljs-built_in">print</span>(os.getpid(), mp.current_process().pid, os.getppid())<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    r=mp.Process(target=reading,args=(<span class="hljs-string">&#x27;book&#x27;</span>,))<br>    w=mp.Process(target=writing,args=(<span class="hljs-string">&#x27;title&#x27;</span>,))<br>    r.start()<br>    w.start()<br>    r.join()<br>    w.join()<br>    <span class="hljs-built_in">print</span>(os.getpid(), mp.current_process().pid, os.getppid())<br><span class="hljs-comment"># 90776 90776 97956</span><br><span class="hljs-comment"># 92172 92172 97956</span><br><span class="hljs-comment"># 97956 97956 88604</span><br></code></pre></td></tr></table></figure><p>main中创建的进程没有特殊指定,它的父进程都是main进程,main进程的父进程是IDE</p><h3 id="进程注意点"><a href="#进程注意点" class="headerlink" title="进程注意点"></a>进程注意点</h3><p><strong>进程之间不共享全局变量</strong>:即进程对全局变量的操作不会污染变量,进程会将main的外资源拷贝一份一起执行<br><strong>主进程会等待所有子进程执行结束后再结束</strong><br>为了不让主进程等待子进程,可以为子进程设置守候进程或者主动终止子进程(不推荐,会成为僵尸进程,不会立即释放资源)</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><code class="hljs python"><span class="hljs-comment"># 守护进程</span><br>进程名.daemon=<span class="hljs-literal">True</span><br><span class="hljs-comment"># 主动关闭</span><br>进程名.terminate()<br></code></pre></td></tr></table></figure><h2 id="线程"><a href="#线程" class="headerlink" title="线程"></a>线程</h2><p>线程是cpu调度资源（调度已分配资源）上的基本单位，即分配进程内的资源<br>每个进程至少都有一个线程（主线程），在这之外我们还能在进程内创建自定义线程(启动后才能抢资源)</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><code class="hljs python"><span class="hljs-keyword">import</span> threading <span class="hljs-keyword">as</span> tp<br><span class="hljs-comment"># 创建实例化对象</span><br>t=tp.Thread()<br><span class="hljs-comment"># 启动进程</span><br>t.start()<br></code></pre></td></tr></table></figure><h3 id="线程注意点"><a href="#线程注意点" class="headerlink" title="线程注意点"></a>线程注意点</h3><p><strong>线程之间的执行是无序的</strong><br><strong>默认主线程会等待所有子线程执行结束后结束</strong><br>要设置守护线程可以，会在主线程结束后直接结束子线程</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">t=tp.Thread(daemon=<span class="hljs-literal">True</span>)<br></code></pre></td></tr></table></figure><p><strong>（同一进程）线程之间共享全局变量</strong><br><strong>线程之间共享全局数据出现错误（使用互斥解决）</strong></p><h3 id="互斥锁"><a href="#互斥锁" class="headerlink" title="互斥锁"></a>互斥锁</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><code class="hljs python"><span class="hljs-comment"># 创建</span><br>mutex=threading.Lock()<br><span class="hljs-comment"># 上锁</span><br>mutex.acquire()<br><span class="hljs-comment"># 释放</span><br>mutex.release()<br></code></pre></td></tr></table></figure><p><strong>死锁</strong>：未在合适位置释放锁，导致程序无法向下运行</p><h3 id="进程与线程"><a href="#进程与线程" class="headerlink" title="进程与线程"></a>进程与线程</h3><p><strong>关系</strong><br>线程依附于进程<br>一个进程默认一条线程，进程内可以创建多线程<br><strong>区别</strong><br>进程之间不共享全局变量<br>线程之间共享全局变量（存在互斥，使用互斥锁）<br>创建进程的资源开销比创建线程大<br>进程是操作系统资源分配的基本单位，线程是cpu调度的基本单位<br>线程不呢独立执行，存在于进程<br>py中多进程开发比单进程多线程开发稳定性要强</p><h2 id="进程与线程都是程序（CPU）实现多任务的手段"><a href="#进程与线程都是程序（CPU）实现多任务的手段" class="headerlink" title="进程与线程都是程序（CPU）实现多任务的手段"></a>进程与线程都是程序（CPU）实现多任务的手段</h2>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;网络编程&quot;&gt;&lt;a href=&quot;#网络编程&quot; class=&quot;headerlink&quot; title=&quot;网络编程&quot;&gt;&lt;/a&gt;网络编程&lt;/h2&gt;&lt;p&gt;用来实现不同计算机上运行的程序间进行数据交互&lt;br&gt;主要应用于文件传输、设备数据传输&lt;/p&gt;
&lt;h3 id=&quot;IP-端口号-</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python进阶" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E8%BF%9B%E9%98%B6/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python进阶" scheme="http://example.com/tags/python%E8%BF%9B%E9%98%B6/"/>
    
  </entry>
  
  <entry>
    <title>PY进阶——闭包与装饰器</title>
    <link href="http://example.com/2026/03/25/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%97%AD%E5%8C%85%E4%B8%8E%E8%A3%85%E9%A5%B0%E5%99%A8/"/>
    <id>http://example.com/2026/03/25/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%97%AD%E5%8C%85%E4%B8%8E%E8%A3%85%E9%A5%B0%E5%99%A8/</id>
    <published>2026-03-25T11:28:26.000Z</published>
    <updated>2026-03-27T07:12:36.028Z</updated>
    
    <content type="html"><![CDATA[<h2 id="闭包"><a href="#闭包" class="headerlink" title="闭包"></a>闭包</h2><p>在函数调用结束后，函数内定义的变量就销毁了，有时需要保存函数内变量（比如我需要记录函数调用次数）<br>使用外部函数变量的内部函数就叫做闭包<br><strong>条件</strong>有嵌套、有引用、有返回<br><strong>nonlocal</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>():<br>    num=<span class="hljs-number">0</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">fn2</span>():<br>        <span class="hljs-keyword">nonlocal</span> num <span class="hljs-comment">#引入外部函数变量</span><br>        num=num+<span class="hljs-number">1</span><br>        <span class="hljs-built_in">print</span>(num)<br>    <span class="hljs-keyword">return</span> fn2<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    f=fn()<br>    f() <span class="hljs-comment">#1</span><br>    f2=fn()<br>    f() <span class="hljs-comment">#2</span><br>    f2()<span class="hljs-comment">#1</span><br></code></pre></td></tr></table></figure><p>上述代码中f和f2中的num并不共用</p><h2 id="装饰器"><a href="#装饰器" class="headerlink" title="装饰器"></a>装饰器</h2><p>装饰器是特殊的闭包，其目的是不改变函数功能的情况下对函数做增强<br>构成装饰器的条件在闭包的条件下增加一个<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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">语法1：</span><br><span class="hljs-string">变量名=装饰器名(原有函数名)</span><br><span class="hljs-string">变量名()</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">txt</span>):<br>        <span class="hljs-comment">#增加功能</span><br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;add option&quot;</span>)<br>        fn(txt)<br>    <span class="hljs-keyword">return</span> option<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt)<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    txt1 = <span class="hljs-string">&quot;Hello World&quot;</span><br>    fn_text=add_option(text)<br>    fn_text(txt1)<br><span class="hljs-comment"># add option</span><br><span class="hljs-comment"># Hello World</span><br></code></pre></td></tr></table></figure><p>语法2：语法糖(@装饰器名)，后直接调用原函数名</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-comment">#增加功能</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">txt</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;add option&quot;</span>)<br>        fn(txt)<br>    <span class="hljs-keyword">return</span> option<br><span class="hljs-meta">@add_option</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt)<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    txt1 = <span class="hljs-string">&quot;Hello World&quot;</span><br>    text(txt1)<br><span class="hljs-comment"># add option</span><br><span class="hljs-comment"># Hello World</span><br></code></pre></td></tr></table></figure><p><strong>注意</strong>装饰器的内部函数格式要与原函数保持一致<br>不定参有返回值函数装饰器</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-comment">#增加功能</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">*args,**kwargs</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;add option&quot;</span>)<br>        <span class="hljs-keyword">return</span> fn(*args,**kwargs)<br>    <span class="hljs-keyword">return</span> option<br></code></pre></td></tr></table></figure><h3 id="多装饰器装饰"><a href="#多装饰器装饰" class="headerlink" title="多装饰器装饰"></a>多装饰器装饰</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><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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-comment">#增加功能</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">*args, **kwargs</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;add option&quot;</span>)<br>        <span class="hljs-keyword">return</span> fn(*args, **kwargs)<br>    <span class="hljs-keyword">return</span> option<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option1</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-comment">#增加功能</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">*args, **kwargs</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;add option1&quot;</span>)<br>        <span class="hljs-keyword">return</span> fn(*args, **kwargs)<br>    <span class="hljs-keyword">return</span> option<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt)<br>    <span class="hljs-keyword">return</span> txt<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    txt1 = <span class="hljs-string">&quot;Hello World&quot;</span><br>    text=add_option(text)<br>    text=add_option1(text)<span class="hljs-comment">#最靠近调用函数的先执行</span><br>    text(txt1)<br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">add option1</span><br><span class="hljs-string">add option</span><br><span class="hljs-string">Hello World</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-comment">#增加功能</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">*args, **kwargs</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;add option&quot;</span>)<br>        <span class="hljs-keyword">return</span> fn(*args, **kwargs)<br>    <span class="hljs-keyword">return</span> option<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option1</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-comment">#增加功能</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">*args, **kwargs</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;add option1&quot;</span>)<br>        <span class="hljs-keyword">return</span> fn(*args, **kwargs)<br>    <span class="hljs-keyword">return</span> option<br><br><span class="hljs-meta">@add_option</span><br><span class="hljs-meta">@add_option1</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt)<br>    <span class="hljs-keyword">return</span> txt<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    txt1 = <span class="hljs-string">&quot;Hello World&quot;</span><br>    text(txt1)<br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">add option</span><br><span class="hljs-string">add option1</span><br><span class="hljs-string">Hello World</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br></code></pre></td></tr></table></figure><h3 id="单装饰器多函数（多参装饰器）"><a href="#单装饰器多函数（多参装饰器）" class="headerlink" title="单装饰器多函数（多参装饰器）"></a>单装饰器多函数（多参装饰器）</h3><p>装饰器只能传递一个参数也就是函数，要传入多一个参数就要在外层多传递一个参数<br>即改造为嵌套装饰</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">choice</span>(<span class="hljs-params">flag</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option</span>(<span class="hljs-params">fn</span>):<br>        <span class="hljs-comment"># 增加功能</span><br>        <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">*args, **kwargs</span>):<br>            <span class="hljs-keyword">if</span> flag==<span class="hljs-number">1</span>:<span class="hljs-comment">#判断</span><br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;txt1&quot;</span>)<br>            <span class="hljs-keyword">elif</span> flag==<span class="hljs-number">2</span>:<br>                <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;txt2&quot;</span>)<br>            <span class="hljs-comment">#返回装饰后函数</span><br>            <span class="hljs-keyword">return</span> fn(*args, **kwargs)<br>        <span class="hljs-comment">#返回内部函数</span><br>        <span class="hljs-keyword">return</span> option<br>    <span class="hljs-comment">#返回装饰器</span><br>    <span class="hljs-keyword">return</span> add_option<br><span class="hljs-meta">@choice(<span class="hljs-params"><span class="hljs-number">1</span></span>)</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt)<br>    <span class="hljs-keyword">return</span> txt<br><span class="hljs-meta">@choice(<span class="hljs-params"><span class="hljs-number">2</span></span>)</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text2</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt+<span class="hljs-string">&#x27;2&#x27;</span>)<br>    <span class="hljs-keyword">return</span> txt<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    txt1 = <span class="hljs-string">&quot;Hello World&quot;</span><br>    text(txt1)<br>    text2(txt1)<br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">txt1</span><br><span class="hljs-string">Hello World</span><br><span class="hljs-string">txt2</span><br><span class="hljs-string">Hello World2</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_option</span>(<span class="hljs-params">fn</span>):<br>    <span class="hljs-comment">#增加功能</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">option</span>(<span class="hljs-params">*args, **kwargs</span>):<br>        <span class="hljs-keyword">if</span> fn.__name__ == <span class="hljs-string">&quot;text&quot;</span>:  <span class="hljs-comment"># 判断</span><br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;txt1&quot;</span>)<br>        <span class="hljs-keyword">elif</span> fn.__name__ == <span class="hljs-string">&quot;text2&quot;</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;txt2&quot;</span>)<br>        <span class="hljs-keyword">return</span> fn(*args, **kwargs)<br>    <span class="hljs-keyword">return</span> option<br><span class="hljs-meta">@add_option</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt)<br>    <span class="hljs-keyword">return</span> txt<br><span class="hljs-meta">@add_option</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">text2</span>(<span class="hljs-params">txt</span>):<br>    <span class="hljs-built_in">print</span>(txt+<span class="hljs-string">&#x27;2&#x27;</span>)<br>    <span class="hljs-keyword">return</span> txt<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    txt1 = <span class="hljs-string">&quot;Hello World&quot;</span><br>    text(txt1)<br>    text2(txt1)<br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">txt1</span><br><span class="hljs-string">Hello World</span><br><span class="hljs-string">txt2</span><br><span class="hljs-string">Hello World2</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br></code></pre></td></tr></table></figure><h2 id="深浅拷贝"><a href="#深浅拷贝" class="headerlink" title="深浅拷贝"></a>深浅拷贝</h2><p>数据类型中存在可变类型（列表、字典、集合）与不可变类型<br>深浅拷贝是针对可变类型<br>浅拷贝只拷贝了对象本省，内部的元素只拷贝了一个引用（即仍指向原数据存放的堆）<br>对不可变类型使用深浅拷贝，效果和直接赋值一样<br><strong>浅拷贝</strong>：copy()<br><strong>深拷贝</strong>：deepcoy()</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;闭包&quot;&gt;&lt;a href=&quot;#闭包&quot; class=&quot;headerlink&quot; title=&quot;闭包&quot;&gt;&lt;/a&gt;闭包&lt;/h2&gt;&lt;p&gt;在函数调用结束后，函数内定义的变量就销毁了，有时需要保存函数内变量（比如我需要记录函数调用次数）&lt;br&gt;使用外部函数变量的内部函数就叫做闭包</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python进阶" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E8%BF%9B%E9%98%B6/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python进阶" scheme="http://example.com/tags/python%E8%BF%9B%E9%98%B6/"/>
    
  </entry>
  
  <entry>
    <title>PY进阶——面向对象_多态性</title>
    <link href="http://example.com/2026/03/25/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-%E5%A4%9A%E6%80%81%E6%80%A7/"/>
    <id>http://example.com/2026/03/25/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-%E5%A4%9A%E6%80%81%E6%80%A7/</id>
    <published>2026-03-25T09:24:23.000Z</published>
    <updated>2026-03-25T10:31:54.211Z</updated>
    
    <content type="html"><![CDATA[<h3 id="多态"><a href="#多态" class="headerlink" title="多态"></a>多态</h3><p>多态指的是同一个函数接收不同的参数有不同的效果<br>实现多态的条件：<br>1.有继承<br>2.函数重写（子类重写父类的函数）<br>3.父类引用指向子类对象（子类对象传给父类对象调用者）<br><strong>注意</strong>上述条件与JAVA中的一致，但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><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><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">sex</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">pass</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Man</span>(<span class="hljs-title class_ inherited__">Person</span>):<span class="hljs-comment">#继承</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-variable language_">self</span>.name = <span class="hljs-string">&#x27;Man&#x27;</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">sex</span>(<span class="hljs-params">self</span>):<span class="hljs-comment">#函数重写</span><br>        <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.name<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Woman</span>(<span class="hljs-title class_ inherited__">Person</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-variable language_">self</span>.name = <span class="hljs-string">&#x27;WoMan&#x27;</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">sex</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.name<br><span class="hljs-keyword">def</span> <span class="hljs-title function_">get_sex</span>(<span class="hljs-params">m</span>):<span class="hljs-comment">#接收不同对象实现不同效果，等同m:Person,但py的弱类型语言，传递非Person类的参数时只会警告</span><br>    <span class="hljs-keyword">return</span>  m.sex()<br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    m1 = Man() <span class="hljs-comment">#m1:Person=Man() 父类引用指向子类对象</span><br>    m2 = Woman()<br>    <span class="hljs-built_in">print</span>(get_sex(m1))<br>    <span class="hljs-built_in">print</span>(get_sex(m2))<br></code></pre></td></tr></table></figure><p>多态能实现模块间的解耦合（函数重写与调用函数来实现），增加可扩展性<br>但在python中无法精准限定类型（只警告，不报错）</p><p><strong>注意</strong>：上述代码中父类的sex方法是空写pass，这是使用父类来确定有哪些方法（<strong>抽象类、抽象接口</strong>），子类来实现具体方法</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;多态&quot;&gt;&lt;a href=&quot;#多态&quot; class=&quot;headerlink&quot; title=&quot;多态&quot;&gt;&lt;/a&gt;多态&lt;/h3&gt;&lt;p&gt;多态指的是同一个函数接收不同的参数有不同的效果&lt;br&gt;实现多态的条件：&lt;br&gt;1.有继承&lt;br&gt;2.函数重写（子类重写父类的函数）&lt;br&gt;3</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/tags/python%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>PY进阶——面向对象_封装篇</title>
    <link href="http://example.com/2026/03/24/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-%E5%B0%81%E8%A3%85%E7%AF%87/"/>
    <id>http://example.com/2026/03/24/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-%E5%B0%81%E8%A3%85%E7%AF%87/</id>
    <published>2026-03-24T12:32:41.000Z</published>
    <updated>2026-03-25T09:22:58.027Z</updated>
    
    <content type="html"><![CDATA[<h3 id="封装"><a href="#封装" class="headerlink" title="封装"></a>封装</h3><p>将属性和方法写入类中的操作就是封装，封装可以为属性和方法添加私有权限<br>当不想被继承时，可以设置某个属性或者方法前加上__</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><code class="hljs python"><span class="hljs-comment">#私有属性</span><br>__属性名<br><span class="hljs-comment">#私有方法</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">__方法名</span>():<br>    ...<br></code></pre></td></tr></table></figure><p>私有属性&#x2F;方法只能在类的内部使用，不能在外部使用<br>如果想要在外部使用要通过公共接口</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Man</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.leg=<span class="hljs-number">2</span><br>        <span class="hljs-variable language_">self</span>.eyes=<span class="hljs-number">2</span><br>        <span class="hljs-variable language_">self</span>.__money=money<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">consumption</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.__money+=money<br>        <span class="hljs-built_in">print</span>(<span class="hljs-variable language_">self</span>.__money)<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">get_money</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.__money<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Children</span>(<span class="hljs-title class_ inherited__">Man</span>):<br>    <span class="hljs-keyword">pass</span><br><span class="hljs-keyword">if</span> __name__==<span class="hljs-string">&quot;__main__&quot;</span>:<br>    c1=Children(<span class="hljs-number">100</span>)<br>    <span class="hljs-comment"># print(c1.__money) 报错</span><br>    <span class="hljs-built_in">print</span>(c1.get_money()) <span class="hljs-comment"># 100</span><br></code></pre></td></tr></table></figure><p>上述代码中，公共接口是父类定义的方法<strong>get_money</strong>为公共接口，同理也能定义修改的公共接口<br>私有确实提高了代码的安全性，但会提高代码量，为解决这个问题所以提出了继承，继承的弊端是耦合性强，因此我们提出多态</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;封装&quot;&gt;&lt;a href=&quot;#封装&quot; class=&quot;headerlink&quot; title=&quot;封装&quot;&gt;&lt;/a&gt;封装&lt;/h3&gt;&lt;p&gt;将属性和方法写入类中的操作就是封装，封装可以为属性和方法添加私有权限&lt;br&gt;当不想被继承时，可以设置某个属性或者方法前加上__&lt;/p&gt;
&lt;f</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/tags/python%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>PY进阶——面向对象_继承篇</title>
    <link href="http://example.com/2026/03/24/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-%E7%BB%A7%E6%89%BF%E7%AF%87/"/>
    <id>http://example.com/2026/03/24/PY%E8%BF%9B%E9%98%B6%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-%E7%BB%A7%E6%89%BF%E7%AF%87/</id>
    <published>2026-03-24T10:11:38.000Z</published>
    <updated>2026-03-24T12:31:38.103Z</updated>
    
    <content type="html"><![CDATA[<h3 id="继承（派生）"><a href="#继承（派生）" class="headerlink" title="继承（派生）"></a>继承（派生）</h3><p>子类继承父类的属性与方法,所有类都默认继承object类<br>能够提高代码的复用性，但耦合性增强、会继承到不需要的属性与方法<br><strong>派生</strong>是从父类角度来描述继承的，即从已有的类产生新的类<br>父类被称为<strong>基类</strong>，子类叫为<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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Parent</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money=money<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">consumption</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money-=money<br>        <span class="hljs-built_in">print</span>(<span class="hljs-variable language_">self</span>.money)<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Children</span>(<span class="hljs-title class_ inherited__">Parent</span>):<br>    <span class="hljs-keyword">pass</span><br><span class="hljs-keyword">if</span> __name__==<span class="hljs-string">&quot;__main__&quot;</span>:<br>    c1=Children(<span class="hljs-number">100</span>)<br>    c1.consumption(<span class="hljs-number">100</span>) <span class="hljs-comment">#0</span><br></code></pre></td></tr></table></figure><h4 id="单继承"><a href="#单继承" class="headerlink" title="单继承"></a>单继承</h4><p>一个子类只能继承自一个父类，不能继承多个类<br>上述代码中体现的是单继承，Children类只有一个父类</p><h4 id="多继承"><a href="#多继承" class="headerlink" title="多继承"></a>多继承</h4><p>多继承中就是一个类同时继承了多个父类，同时具有所有父类的属性和方法<br><strong>注意</strong>:存在MRO机制，当有多个父类时，默认使用第一个父类的同名属性和方法，可以使用**类名.mro()<strong>或者</strong>类名.<strong>mro</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Parent</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money=money<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">consumption</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money-=money<br>        <span class="hljs-built_in">print</span>(<span class="hljs-variable language_">self</span>.money)<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Man</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-variable language_">self</span>.leg=<span class="hljs-number">2</span><br>        <span class="hljs-variable language_">self</span>.eyes=<span class="hljs-number">2</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Children</span>(Parent,Man):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<span class="hljs-comment">#初始化所有父类</span><br>        Parent.__init__(<span class="hljs-variable language_">self</span>, money)<br>        Man.__init__(<span class="hljs-variable language_">self</span>)<br><span class="hljs-keyword">if</span> __name__==<span class="hljs-string">&quot;__main__&quot;</span>:<br>    c1=Children(<span class="hljs-number">100</span>)<br>    c1.consumption(<span class="hljs-number">100</span>)<br>    <span class="hljs-built_in">print</span>(Children.mro())<br>    <span class="hljs-built_in">print</span>(c1.eyes)<br><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">0</span><br><span class="hljs-string">[&lt;class &#x27;__main__.Children&#x27;&gt;, &lt;class &#x27;__main__.Parent&#x27;&gt;, &lt;class &#x27;__main__.Man&#x27;&gt;, &lt;class &#x27;object&#x27;&gt;]</span><br><span class="hljs-string">2</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br></code></pre></td></tr></table></figure><h4 id="子类重写父类同名方法（属性）"><a href="#子类重写父类同名方法（属性）" class="headerlink" title="子类重写父类同名方法（属性）"></a>子类重写父类同名方法（属性）</h4><p>即在子类定义中使用父类的同名方法（属性）会被覆盖，依旧参考mro机制</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Parent</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money=money<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">consumption</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money-=money<br>        <span class="hljs-built_in">print</span>(<span class="hljs-variable language_">self</span>.money)<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Man</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-variable language_">self</span>.leg=<span class="hljs-number">2</span><br>        <span class="hljs-variable language_">self</span>.eyes=<span class="hljs-number">2</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Children</span>(Parent,Man):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        Parent.__init__(<span class="hljs-variable language_">self</span>, money)<br>        Man.__init__(<span class="hljs-variable language_">self</span>)<br>        <span class="hljs-variable language_">self</span>.leg=<span class="hljs-number">1</span><br><span class="hljs-keyword">if</span> __name__==<span class="hljs-string">&quot;__main__&quot;</span>:<br>    c1=Children(<span class="hljs-number">100</span>)<br>    c1.consumption(<span class="hljs-number">100</span>)<br>    <span class="hljs-built_in">print</span>(c1.leg,c1.eyes) <span class="hljs-comment">#优先使用自身属性</span><br><span class="hljs-comment"># 0</span><br><span class="hljs-comment"># 1 2</span><br></code></pre></td></tr></table></figure><h4 id="子类调用特定父类方法"><a href="#子类调用特定父类方法" class="headerlink" title="子类调用特定父类方法"></a>子类调用特定父类方法</h4><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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Parent</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money=money<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">consumption</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money-=money<br>        <span class="hljs-built_in">print</span>(<span class="hljs-variable language_">self</span>.money)<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Man</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.leg=<span class="hljs-number">2</span><br>        <span class="hljs-variable language_">self</span>.eyes=<span class="hljs-number">2</span><br>        <span class="hljs-variable language_">self</span>.money=money<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">consumption</span>(<span class="hljs-params">self,money</span>):<br>        <span class="hljs-variable language_">self</span>.money+=money<br>        <span class="hljs-built_in">print</span>(<span class="hljs-variable language_">self</span>.money)<br><span class="hljs-keyword">class</span> <span class="hljs-title class_">Children</span>(Parent,Man):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,money</span>):<br>        Parent.__init__(<span class="hljs-variable language_">self</span>, money)<br>        Man.__init__(<span class="hljs-variable language_">self</span>, money)<br>        <span class="hljs-variable language_">self</span>.leg=<span class="hljs-number">1</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">man_consumption</span>(<span class="hljs-params">self,money</span>):<br>        Man.consumption(<span class="hljs-variable language_">self</span>,money)<br><span class="hljs-keyword">if</span> __name__==<span class="hljs-string">&quot;__main__&quot;</span>:<br>    c1=Children(<span class="hljs-number">100</span>)<br>    c1.man_consumption(<span class="hljs-number">100</span>)<span class="hljs-comment">#200</span><br><br></code></pre></td></tr></table></figure><p>也能使用**super().父类方法名(self)**来调用父类方法，只能调用首位父类的方法，适合单继承，不适合多继承</p><h4 id="多层继承"><a href="#多层继承" class="headerlink" title="多层继承"></a>多层继承</h4><p>即类A继承类B、类B继承类C，这就是多层继承</p><h3 id="开发原则"><a href="#开发原则" class="headerlink" title="开发原则"></a>开发原则</h3><p>高内聚、低耦合<br>即类的独立性要高，依赖性低</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;继承（派生）&quot;&gt;&lt;a href=&quot;#继承（派生）&quot; class=&quot;headerlink&quot; title=&quot;继承（派生）&quot;&gt;&lt;/a&gt;继承（派生）&lt;/h3&gt;&lt;p&gt;子类继承父类的属性与方法,所有类都默认继承object类&lt;br&gt;能够提高代码的复用性，但耦合性增强、会继承到</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/tags/python%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>PY入门4——面向对象篇</title>
    <link href="http://example.com/2026/03/23/PY%E5%85%A5%E9%97%A84%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%AF%87/"/>
    <id>http://example.com/2026/03/23/PY%E5%85%A5%E9%97%A84%E2%80%94%E2%80%94%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%AF%87/</id>
    <published>2026-03-23T08:42:23.000Z</published>
    <updated>2026-03-25T11:21:42.925Z</updated>
    
    <content type="html"><![CDATA[<h2 id="面向对象基础"><a href="#面向对象基础" class="headerlink" title="面向对象基础"></a>面向对象基础</h2><p>将属性、方法打包到一个对象上，就是面向对象编程</p><h3 id="类与对象"><a href="#类与对象" class="headerlink" title="类与对象"></a>类与对象</h3><p>类：一组具备相同属性、方法的模板<br>对象是类的实例对象，可参考<a href="https://yiliu02.github.io/2026/03/09/%E5%89%8D%E7%AB%AFJS%E8%BF%9B%E9%98%B6%E5%9B%9E%E9%A1%BE1/">前端JS进阶回顾1</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    <span class="hljs-keyword">pass</span><br>p1=Person()<br>p1.name=<span class="hljs-string">&quot;Jack&quot;</span><br>p1.sex=<span class="hljs-string">&#x27;male&#x27;</span><br><span class="hljs-built_in">print</span>(p1.__dict__) <span class="hljs-comment">#特殊属性，字典形式存储对象属性</span><br><span class="hljs-comment"># &#123;&#x27;name&#x27;: &#x27;Jack&#x27;, &#x27;sex&#x27;: &#x27;male&#x27;&#125;</span><br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,name,sex</span>):<br>        <span class="hljs-variable language_">self</span>.name=name<br>        <span class="hljs-variable language_">self</span>.sex=sex<br>p1=Person(<span class="hljs-string">&#x27;Jack&#x27;</span>,<span class="hljs-string">&#x27;male&#x27;</span>)<br></code></pre></td></tr></table></figure><p>上述使用初始化方法__init__为对象设置属性，当实例化时自动调用__init__方法，self指向当前对象（在js中就是this）</p><h3 id="实例方法"><a href="#实例方法" class="headerlink" title="实例方法"></a>实例方法</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><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,name,sex</span>):<br>        <span class="hljs-variable language_">self</span>.name=name<br>        <span class="hljs-variable language_">self</span>.sex=sex<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">work</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;self.name&#125;</span> are working&#x27;</span>)<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">relax</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;self.name&#125;</span> are relaxed&#x27;</span>)<br>p1=Person(<span class="hljs-string">&#x27;Jack&#x27;</span>,<span class="hljs-string">&#x27;male&#x27;</span>)<br>p1.work()<br>p1.relax()<br></code></pre></td></tr></table></figure><h3 id="魔法方法"><a href="#魔法方法" class="headerlink" title="魔法方法"></a>魔法方法</h3><p>py提供的用于定义类的特殊行为，以__开头，如__init__<br>这些方法不需要手动调用，而是在合适的时机自动调用（类似前端的生命周期）</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><code class="hljs python"><span class="hljs-comment">#初始化方法</span><br>__init__<br><span class="hljs-comment">#字符串表示的方法,即定义该方法并存在返回值时，将该对象转为该返回值</span><br>__str__<br><span class="hljs-comment">#比较两个对象是否相等，判断两个实例对象是否相等时，调用该方法</span><br>__eq__<br><span class="hljs-comment">#支持比较对象的大小（小于、小于等于、大于、大于等于），同上理</span><br>__lt__、__le__、__gt__、__ge__<br><span class="hljs-comment">#删除对象时调用，或py执行文件结束</span><br>__del__<br></code></pre></td></tr></table></figure><h3 id="实例属性与类属性"><a href="#实例属性与类属性" class="headerlink" title="实例属性与类属性"></a>实例属性与类属性</h3><p>实例属性是属于具体对象的属性（对象的特有属性）<br>类属性是属于类本身的属性，所有实例共享的</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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    leg=<span class="hljs-number">2</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self,name,sex</span>):<br>        <span class="hljs-variable language_">self</span>.name=name <span class="hljs-comment">#实例属性</span><br>        <span class="hljs-variable language_">self</span>.sex=sex<br>        <span class="hljs-keyword">if</span> name==<span class="hljs-string">&#x27;Jack&#x27;</span>:<br>            <span class="hljs-variable language_">self</span>.leg=<span class="hljs-number">1</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">work</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;self.name&#125;</span> are working&#x27;</span>)<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">relax</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;<span class="hljs-subst">&#123;self.name&#125;</span> are relaxed&#x27;</span>)<br>p1=Person(<span class="hljs-string">&#x27;Jack&#x27;</span>,<span class="hljs-string">&#x27;male&#x27;</span>)<br>p2=Person(<span class="hljs-string">&#x27;Mary&#x27;</span>,<span class="hljs-string">&#x27;male&#x27;</span>)<br><span class="hljs-built_in">print</span>(p1.leg,p2.leg) <span class="hljs-comment">#1,2</span><br></code></pre></td></tr></table></figure><p>通过实例查找属性时，优先查找实例属性，不存在时再查找类属性</p><h3 id="类方法与静态方法"><a href="#类方法与静态方法" class="headerlink" title="类方法与静态方法"></a>类方法与静态方法</h3><p>类方法需要用@classmethod来表示为类方法，方法的第一个参数必须为类对象，习惯以cls作为形参。<br>静态方法使用@staticmethod标识</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><code class="hljs python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">Person</span>:<br>    water=<span class="hljs-literal">False</span><br><span class="hljs-meta">    @classmethod</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">drink</span>(<span class="hljs-params">cls</span>):<br>        cls.water=<span class="hljs-literal">True</span><br><span class="hljs-meta">    @staticmethod</span><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">talk</span>():<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;I am Person&#x27;</span>)<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">run</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">pass</span><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    P1 = Person()<br>    P1.drink()<br>    <span class="hljs-built_in">print</span>(P1.water)<br>    <span class="hljs-built_in">print</span>(Person.water)<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    True</span><br><span class="hljs-string">    True</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br></code></pre></td></tr></table></figure><h2 id="异常"><a href="#异常" class="headerlink" title="异常"></a>异常</h2><p>程序运行中出现的错误会中断执行流程<br>NameError、TypeError、IndexError、KeyError、ValueError等等<br>捕获异常</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><code class="hljs python"><span class="hljs-comment"># 语法</span><br><span class="hljs-keyword">try</span>：<br>    ...<span class="hljs-comment">#可能会异常的代码</span><br><span class="hljs-keyword">except</span> [异常类型 <span class="hljs-keyword">as</span> 变量名]:<span class="hljs-comment">#选写，不写的话默认捕获所有异常，写的话就匹配异常</span><br>    ...<span class="hljs-comment">#异常处理代码</span><br>[<span class="hljs-keyword">finally</span>:<br>    ...]<span class="hljs-comment">#不管是否有异常，都会执行的代码</span><br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;面向对象基础&quot;&gt;&lt;a href=&quot;#面向对象基础&quot; class=&quot;headerlink&quot; title=&quot;面向对象基础&quot;&gt;&lt;/a&gt;面向对象基础&lt;/h2&gt;&lt;p&gt;将属性、方法打包到一个对象上，就是面向对象编程&lt;/p&gt;
&lt;h3 id=&quot;类与对象&quot;&gt;&lt;a href=&quot;#类与</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/tags/python%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>PY入门3——函数篇</title>
    <link href="http://example.com/2026/03/22/PY%E5%85%A5%E9%97%A83%E2%80%94%E2%80%94%E5%87%BD%E6%95%B0%E7%AF%87/"/>
    <id>http://example.com/2026/03/22/PY%E5%85%A5%E9%97%A83%E2%80%94%E2%80%94%E5%87%BD%E6%95%B0%E7%AF%87/</id>
    <published>2026-03-22T12:09:28.000Z</published>
    <updated>2026-03-23T08:33:43.851Z</updated>
    
    <content type="html"><![CDATA[<h2 id="万物皆函数"><a href="#万物皆函数" class="headerlink" title="万物皆函数"></a>万物皆函数</h2><p>函数是可复用的实现特定功能的代码片段</p><h3 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h3><p>先定义后执行<br>语法</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">...arg</span>):<br>    ....<br>    <span class="hljs-keyword">return</span> ...<br>fn(arg)<br></code></pre></td></tr></table></figure><h3 id="参数与返回值"><a href="#参数与返回值" class="headerlink" title="参数与返回值"></a>参数与返回值</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params"><span class="hljs-type">List</span></span>):<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    :param List:传入需要去重排序的列表</span><br><span class="hljs-string">    ：return L:处理后的列表</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    L=[*&#123;*<span class="hljs-type">List</span>&#125;]<br>    L.sort()<br>    <span class="hljs-keyword">return</span> L<br><span class="hljs-type">List</span>=fn([<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">5</span>,<span class="hljs-number">3</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">22</span>,<span class="hljs-number">6</span>])<br><span class="hljs-built_in">help</span>(fn)<span class="hljs-comment"># 查看函数说明文档</span><br><span class="hljs-built_in">print</span>(<span class="hljs-type">List</span>)<br></code></pre></td></tr></table></figure><h3 id="函数嵌套"><a href="#函数嵌套" class="headerlink" title="函数嵌套"></a>函数嵌套</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn_a</span>(<span class="hljs-params">List1,List2</span>):<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    :param List1: 待合并数组1</span><br><span class="hljs-string">    :param List2: 待合并数组2</span><br><span class="hljs-string">    :return: 处理后列表</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    <span class="hljs-keyword">return</span> fn_b([*List1,*List2])<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn_b</span>(<span class="hljs-params"><span class="hljs-type">List</span></span>):<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    :param List: 待去重列表</span><br><span class="hljs-string">    :return: 处理后列表</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    <span class="hljs-keyword">return</span> fn_c([*&#123;*<span class="hljs-type">List</span>&#125;])<br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn_c</span>(<span class="hljs-params"><span class="hljs-type">List</span></span>):<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    :param List: 待排序列表</span><br><span class="hljs-string">    :return: 处理后列表</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    L=<span class="hljs-type">List</span><br>    L.sort()<br>    <span class="hljs-keyword">return</span> L<br>res=fn_a([<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>,<span class="hljs-number">9</span>],[<span class="hljs-number">19</span>,<span class="hljs-number">33</span>,<span class="hljs-number">42</span>,<span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>])<br><span class="hljs-built_in">print</span>(res)<br></code></pre></td></tr></table></figure><p>在上述代码执行过程中，入栈先后顺序为a,b,c，其中指针指向栈顶，当执行到对应调用函数时，函数入栈；函数结束后函数出栈</p><h3 id="函数变量作用域"><a href="#函数变量作用域" class="headerlink" title="函数变量作用域"></a>函数变量作用域</h3><p>即变量的作用范围（使用范围）<br>在函数内定义的变量称为局部变量，无法在函数外部使用，以此保证函数内数据不被污染，该内容可参考<a href="https://yiliu02.github.io/2026/03/09/%E5%89%8D%E7%AB%AFJS%E8%BF%9B%E9%98%B6%E5%9B%9E%E9%A1%BE1/">前端JS进阶回顾1</a>,在py中函数内无法直接对全局变量做修改，以此我们可以使用<strong>global</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></pre></td><td class="code"><pre><code class="hljs python">num=<span class="hljs-number">1</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>():<br>    num=<span class="hljs-number">10</span><br>    <span class="hljs-built_in">print</span>(num) <br>fn() <span class="hljs-comment">#10</span><br><span class="hljs-built_in">print</span>(num)<span class="hljs-comment">#1</span><br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># use global</span><br>num=<span class="hljs-number">1</span><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>():<br>    <span class="hljs-keyword">global</span> num<br>    num=<span class="hljs-number">10</span><br>    <span class="hljs-built_in">print</span>(num) <br>fn() <span class="hljs-comment">#10</span><br><span class="hljs-built_in">print</span>(num)<span class="hljs-comment">#10</span><br></code></pre></td></tr></table></figure><h3 id="参数详解"><a href="#参数详解" class="headerlink" title="参数详解"></a>参数详解</h3><h4 id="传参方式"><a href="#传参方式" class="headerlink" title="传参方式"></a>传参方式</h4><p>调用函数时，传递实参的方式<br><strong>位置参数</strong>：定义函数时参数的位置进行传参数，调用函数是传入参数顺序与定义函数时的形参一致<br><strong>关键字参数</strong>：调用函数时传入键值对，函数执行时通过读取键值（key&#x3D;value形式）对中形参作为关键字的值作为实参<br>（ps:当位置参数与关键字参数混用时，必须先传入位置参数）</p><h4 id="默认参数"><a href="#默认参数" class="headerlink" title="默认参数"></a>默认参数</h4><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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">a=<span class="hljs-number">1</span></span>):<br>    <span class="hljs-built_in">print</span>(a)<br>fn()<span class="hljs-comment">#1</span><br>fn(<span class="hljs-number">10</span>)<span class="hljs-comment">#10</span><br></code></pre></td></tr></table></figure><h4 id="不定长参数"><a href="#不定长参数" class="headerlink" title="不定长参数"></a>不定长参数</h4><p>定义函数时无法预料传入参数数目时，我们使用不定长参数<br><strong>位置传参-不定长参数</strong>，*arg将传入参数封装成元组args</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">*args</span>):<br>    <span class="hljs-built_in">print</span>(*args)<span class="hljs-comment">#解包</span><br>fn(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>)<br><span class="hljs-comment">#1,2,3,4,5</span><br></code></pre></td></tr></table></figure><p><strong>关键字传参-不定长传参</strong>，**kwargs将传入的关键字参数封装成字典</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">*args,**kwargs</span>):<br>    <span class="hljs-built_in">print</span>(*args)<span class="hljs-comment">#解包</span><br>    <span class="hljs-keyword">if</span> kwargs.get(<span class="hljs-string">&#x27;a&#x27;</span>):<br>        <span class="hljs-built_in">print</span>(kwargs[<span class="hljs-string">&#x27;a&#x27;</span>])<br>fn(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,a=<span class="hljs-number">6</span>)<br><span class="hljs-comment">#1,2,3,4,5</span><br><span class="hljs-comment">#6</span><br></code></pre></td></tr></table></figure><h4 id="参数类型"><a href="#参数类型" class="headerlink" title="参数类型"></a>参数类型</h4><p>普通参数：数字、布尔、字符串、数据容器<br>特殊参数：函数</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">x,y,oper</span>):<br>    <span class="hljs-keyword">return</span> oper([x,y])<br><span class="hljs-built_in">print</span>(fn(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-built_in">sum</span>))<br><span class="hljs-comment">#3</span><br></code></pre></td></tr></table></figure><h3 id="匿名函数"><a href="#匿名函数" class="headerlink" title="匿名函数"></a>匿名函数</h3><p>使用<strong>lambda</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><code class="hljs python"><span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">语法：lambda 参数列表：函数体</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br>fn=<span class="hljs-keyword">lambda</span> x,y:x+y<br>fn(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>)<span class="hljs-comment">#3</span><br></code></pre></td></tr></table></figure><h3 id="练习"><a href="#练习" class="headerlink" title="练习"></a>练习</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><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">L</span>):<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    可将列表内元素根据字符长度排序</span><br><span class="hljs-string">    :param L:待排序列表</span><br><span class="hljs-string">    :return:处理后列表</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    L.sort(key=<span class="hljs-keyword">lambda</span> item:<span class="hljs-built_in">len</span>(item))<br>    <span class="hljs-keyword">return</span> L<br>res=fn([<span class="hljs-string">&#x27;cs&#x27;</span>,<span class="hljs-string">&#x27;s&#x27;</span>,<span class="hljs-string">&#x27;uiwhe&#x27;</span>,<span class="hljs-string">&#x27;qwh&#x27;</span>])<br><span class="hljs-built_in">print</span>(res)<br><span class="hljs-comment"># [&#x27;s&#x27;, &#x27;cs&#x27;, &#x27;qwh&#x27;, &#x27;uiwhe&#x27;]</span><br></code></pre></td></tr></table></figure><p>sort()本质也是一个函数，存在key、reverse（bool,是否逆置,默认为false）两个关键字参数，key可传递一个函数指定排序标准，上述代码中指定了len作为标准排序，这也是匿名函数最典型应用。</p><h3 id="类型注解"><a href="#类型注解" class="headerlink" title="类型注解"></a>类型注解</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><code class="hljs python">num:<span class="hljs-built_in">int</span>=<span class="hljs-number">9</span><br>str_list:<span class="hljs-built_in">list</span>[<span class="hljs-built_in">str</span>]=<span class="hljs-built_in">list</span>(<span class="hljs-string">&#x27;abc&#x27;</span>)<br>dict_s_i:<span class="hljs-built_in">dict</span>[<span class="hljs-built_in">str</span>,<span class="hljs-built_in">int</span>]=<span class="hljs-built_in">dict</span>(&#123;<span class="hljs-string">&#x27;abc&#x27;</span>:<span class="hljs-number">1</span>&#125;)<br><span class="hljs-built_in">print</span>(dict_s_i)<br><span class="hljs-built_in">print</span>(str_list)<br><span class="hljs-comment"># &#123;&#x27;abc&#x27;: 1&#125;</span><br><span class="hljs-comment"># [&#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;]</span><br></code></pre></td></tr></table></figure><p>py中还具备<strong>类型推断</strong>机制，是由py解释器自动推断出已赋值的变量、表达式、返回值的数据类型，无需开发者显式声明，因此可以不对已赋值变量做手动的类型注解</p><h4 id="函数的类型注解"><a href="#函数的类型注解" class="headerlink" title="函数的类型注解"></a>函数的类型注解</h4><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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">l:<span class="hljs-built_in">list</span>[<span class="hljs-built_in">str</span>]</span>)-&gt;<span class="hljs-built_in">list</span>[<span class="hljs-built_in">str</span>]:<br>    <span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">    可将列表内元素根据字符长度排序</span><br><span class="hljs-string">    :param L:待排序列表</span><br><span class="hljs-string">    :return:处理后列表</span><br><span class="hljs-string">    &quot;&quot;&quot;</span><br>    l.sort(key=<span class="hljs-keyword">lambda</span> item:<span class="hljs-built_in">len</span>(item))<br>    <span class="hljs-keyword">return</span> l<br>res=fn([<span class="hljs-string">&#x27;cs&#x27;</span>,<span class="hljs-string">&#x27;s&#x27;</span>,<span class="hljs-string">&#x27;uiwhe&#x27;</span>,<span class="hljs-string">&#x27;qwh&#x27;</span>])<br><span class="hljs-built_in">print</span>(res)<br></code></pre></td></tr></table></figure><h3 id="模块"><a href="#模块" class="headerlink" title="模块"></a>模块</h3><p>每个py文件都是一个模块，在主文件中导入外部py文件，能够使用外部py文件内定义的函数。<br>使用模块能够提高代码的复用性、降低开发门槛、避免命名冲突</p><h4 id="导入模块"><a href="#导入模块" class="headerlink" title="导入模块"></a>导入模块</h4><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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> 模块名<br><span class="hljs-keyword">import</span> 模块名 <span class="hljs-keyword">as</span> 别名<br><span class="hljs-keyword">from</span> 模块名 <span class="hljs-keyword">import</span> 功能名<br><span class="hljs-keyword">from</span> 模块名 <span class="hljs-keyword">import</span> 功能名 <span class="hljs-keyword">as</span> 别名<br><span class="hljs-keyword">from</span> 模块名 <span class="hljs-keyword">import</span> *<br></code></pre></td></tr></table></figure><h4 id="自定义模块"><a href="#自定义模块" class="headerlink" title="自定义模块"></a>自定义模块</h4><p>即将代码分模块开发，再使用导入模块在主模块中导入执行，模块化开发有助于项目的维护管理及复用<br>在自定义模块中如果对模块内的代码进行测试，存在测试代码，而导入时不希望测试代码运行，则可以使用**<strong>name</strong>**的内置变量，来表示当前模块名字（直接运行当前模块时，__name__的值为”<strong>main</strong>“,被导入时为该模块的名称。<br>可以将测试代码放入判断语句中</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><code class="hljs python"><span class="hljs-keyword">if</span> __name__==<span class="hljs-string">&#x27;__main__&#x27;</span>:<br>    <span class="hljs-comment"># 测试代码</span><br>    ...<br></code></pre></td></tr></table></figure><p>在导入模块中</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> 模块名 <span class="hljs-keyword">import</span> *<span class="hljs-comment">#中的*导入了模块内__all__指定的功能，如无定义时则默认为所有功能,相当于导出功能</span><br></code></pre></td></tr></table></figure><h4 id="软件包"><a href="#软件包" class="headerlink" title="软件包"></a>软件包</h4><p>上述中的模块能够让项目模块化开发，但大型项目中，模块也会非常多，因此我们可以使用<strong>软件包</strong>来对多个模块做归类，本质其实是新建文件夹存放，但特殊存在的一个**<strong>init</strong>.py**文件来描述当前包的信息<br><strong>导入方式</strong><br>在不同文件夹下时使用绝对路径进行导入根目录下文件来寻找软件包(根目录文件.包名)</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><code class="hljs python"><span class="hljs-keyword">import</span> 包名.模块名<br><span class="hljs-keyword">from</span> 包名 <span class="hljs-keyword">import</span> 模块名<br><span class="hljs-keyword">from</span> 包名 <span class="hljs-keyword">import</span> *<span class="hljs-comment">#这个必须要在__init__.py中设置__all__变量指定导入的模块名，否则无法导入</span><br><span class="hljs-keyword">from</span> 包名.模块名 <span class="hljs-keyword">import</span> 功能名<br><span class="hljs-keyword">from</span> 包名.模块名 <span class="hljs-keyword">import</span> *<br></code></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></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment">#__init__.py</span><br>__version__=<span class="hljs-string">&#x27;v1.0.0&#x27;</span><br>__author__=<span class="hljs-string">&#x27;YX&#x27;</span><br>__all__=[...]<br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;万物皆函数&quot;&gt;&lt;a href=&quot;#万物皆函数&quot; class=&quot;headerlink&quot; title=&quot;万物皆函数&quot;&gt;&lt;/a&gt;万物皆函数&lt;/h2&gt;&lt;p&gt;函数是可复用的实现特定功能的代码片段&lt;/p&gt;
&lt;h3 id=&quot;函数&quot;&gt;&lt;a href=&quot;#函数&quot; class=&quot;he</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/tags/python%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>PY入门2</title>
    <link href="http://example.com/2026/03/22/PY%E5%85%A5%E9%97%A82/"/>
    <id>http://example.com/2026/03/22/PY%E5%85%A5%E9%97%A82/</id>
    <published>2026-03-22T06:48:40.000Z</published>
    <updated>2026-03-22T12:01:44.299Z</updated>
    
    <content type="html"><![CDATA[<h3 id="条件判断"><a href="#条件判断" class="headerlink" title="条件判断"></a>条件判断</h3><p><strong>if…elif…else…</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></pre></td><td class="code"><pre><code class="hljs python">admin_name=<span class="hljs-string">&#x27;admin&#x27;</span><br>admin_password=<span class="hljs-string">&#x27;123456&#x27;</span><br><span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>    username = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;Enter your username: &quot;</span>)<br>    password = <span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;Enter your password: &quot;</span>)<br>    <span class="hljs-keyword">if</span> username == admin_name <span class="hljs-keyword">and</span> password == admin_password:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Login Successful&quot;</span>)<br>        <span class="hljs-keyword">break</span><br>    <span class="hljs-keyword">elif</span> username == admin_name <span class="hljs-keyword">and</span> password != admin_password:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Wrong Password&quot;</span>)<br>    <span class="hljs-keyword">else</span>:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Wrong Username&quot;</span>)<br></code></pre></td></tr></table></figure><h3 id="模式匹配"><a href="#模式匹配" class="headerlink" title="模式匹配"></a>模式匹配</h3><p>**match…case…**与switch…case一致，根据条件精准匹配</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><code class="hljs python"><span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:<br>    class_id = <span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;Please enter your class ID: &#x27;</span>)<br>    <span class="hljs-keyword">match</span> class_id:<br>        <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;101&quot;</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID: 101&#x27;</span>)<br>            <span class="hljs-keyword">break</span><br>        <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;102&quot;</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID: 102&#x27;</span>)<br>            <span class="hljs-keyword">break</span><br>        <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;103&quot;</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID: 103&#x27;</span>)<br>            <span class="hljs-keyword">break</span><br>        <span class="hljs-keyword">case</span> _: <span class="hljs-comment">#other match</span><br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID Not Found&#x27;</span>)<br><br></code></pre></td></tr></table></figure><h3 id="循环"><a href="#循环" class="headerlink" title="循环"></a>循环</h3><p><strong>while…else…<strong>、</strong>for ele in data…else…</strong><br>while循环在上述中以使用，只不过条件一直设置为True,在实际情况中可以灵活设置，比如：</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></pre></td><td class="code"><pre><code class="hljs python">flag=<span class="hljs-literal">True</span><br><span class="hljs-keyword">while</span> flag:<br>    class_id = <span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;Please enter your class ID: &#x27;</span>)<br>    <span class="hljs-keyword">match</span> class_id:<br>        <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;101&quot;</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID: 101&#x27;</span>)<br>            flag -= <span class="hljs-number">1</span><br>        <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;102&quot;</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID: 102&#x27;</span>)<br>            flag -= <span class="hljs-number">1</span><br>        <span class="hljs-keyword">case</span> <span class="hljs-string">&quot;103&quot;</span>:<br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID: 103&#x27;</span>)<br>            flag -= <span class="hljs-number">1</span><br>        <span class="hljs-keyword">case</span> _: <span class="hljs-comment">#other match</span><br>            <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Class ID Not Found&#x27;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;Found Class ID&#x27;</span>)<br></code></pre></td></tr></table></figure><p>for循环是一种轮询遍历</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></pre></td><td class="code"><pre><code class="hljs python">class_room=[]<br>class_num=<span class="hljs-number">101</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">3</span>):<br>    class_room.append(class_num)<br>    class_num+=<span class="hljs-number">1</span><br>class_id=<span class="hljs-built_in">input</span>(<span class="hljs-string">&quot;Enter Class ID&quot;</span>)<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> class_room:<br>    <span class="hljs-keyword">if</span> i==<span class="hljs-built_in">int</span>(class_id):<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Class ID&quot;</span>,class_id)<br>        <span class="hljs-keyword">break</span><br>    <span class="hljs-keyword">elif</span> i==class_room[<span class="hljs-built_in">len</span>(class_room)-<span class="hljs-number">1</span>]:<br>        <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Class ID Not Found&quot;</span>)<br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;End&#x27;</span>)<br></code></pre></td></tr></table></figure><p><strong>嵌套循环</strong><br>冒泡为例子：</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><code class="hljs python">data_arr=[]<br>data=<span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;Please enter the number of rows: &#x27;</span>)<br>now_data=<span class="hljs-string">&#x27;&#x27;</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> data:<br>    <span class="hljs-keyword">if</span> i!=<span class="hljs-string">&#x27;,&#x27;</span>:<br>        now_data+=i<br>    <span class="hljs-keyword">else</span>:<br>        data_arr.append(<span class="hljs-built_in">int</span>(now_data))<br>        now_data=<span class="hljs-string">&#x27;&#x27;</span><br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-keyword">if</span> now_data:<br>        data_arr.append(<span class="hljs-built_in">int</span>(now_data))<br>    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(data_arr)):<br>        <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-built_in">len</span>(data_arr)-<span class="hljs-number">1</span>-i):<br>            <span class="hljs-keyword">if</span> data_arr[j]&gt;data_arr[j+<span class="hljs-number">1</span>]:<br>                data_arr[j],data_arr[j+<span class="hljs-number">1</span>]=data_arr[j+<span class="hljs-number">1</span>],data_arr[j]<br><span class="hljs-built_in">print</span>(data_arr)<br><br></code></pre></td></tr></table></figure><h3 id="数据容器"><a href="#数据容器" class="headerlink" title="数据容器"></a>数据容器</h3><p>用来存储大量数据（列表list、字符串str、元组tuple、集合set、字典dict）</p><h4 id="List"><a href="#List" class="headerlink" title="List"></a>List</h4><p>可以存储不同类型的元素，元素有序、可重复、可修改，可通过索引访问（0开始，反向索引从-1开始）<br>增删改查</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><code class="hljs python">list_type=[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">2</span>]<br><span class="hljs-keyword">del</span> list_type[<span class="hljs-number">0</span>]<br>list_type.append(<span class="hljs-number">3</span>)<br><span class="hljs-built_in">print</span>(list_type)<br></code></pre></td></tr></table></figure><p><strong>切片</strong>列表、字符串、元组等：序列数据[开始索引:结束索引:步长]，默认为[0,len(list),1]</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><code class="hljs python">list_type=[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">2</span>,<span class="hljs-number">873</span>,<span class="hljs-number">2</span>,<span class="hljs-number">10</span>,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">46</span>,<span class="hljs-number">2</span>,<span class="hljs-number">56</span>]<br><span class="hljs-built_in">print</span>(list_type[<span class="hljs-number">2</span>:<span class="hljs-number">9</span>:<span class="hljs-number">2</span>])<span class="hljs-comment"># [3, 873, 10, 2]</span><br></code></pre></td></tr></table></figure><p><strong>常见方法</strong><br>append(ele)、insert(index,ele)、remove(first_ele)、pop(index)、sort()、reverse()</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></pre></td><td class="code"><pre><code class="hljs python">data_arr=[]<br>data=<span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;Please enter the number of rows: &#x27;</span>)<br>now_data=<span class="hljs-string">&#x27;&#x27;</span><br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> data:<br>    <span class="hljs-keyword">if</span> i!=<span class="hljs-string">&#x27;,&#x27;</span>:<br>        now_data+=i<br>    <span class="hljs-keyword">elif</span> now_data:<br>        data_arr.append(<span class="hljs-built_in">int</span>(now_data))<br>        now_data=<span class="hljs-string">&#x27;&#x27;</span><br><span class="hljs-keyword">else</span>:<br>    <span class="hljs-keyword">if</span> now_data:<br>        data_arr.append(<span class="hljs-built_in">int</span>(now_data))<br>    data_arr.sort()<br>    <span class="hljs-built_in">print</span>(data_arr[<span class="hljs-number">0</span>],data_arr[-<span class="hljs-number">1</span>],<span class="hljs-built_in">sum</span>(data_arr)/<span class="hljs-built_in">len</span>(data_arr))<br></code></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></pre></td><td class="code"><pre><code class="hljs python">list1=[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">12</span>,<span class="hljs-number">34</span>,<span class="hljs-number">5</span>]<br>list2=[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>]<br>list1=[*list1,*list2]<span class="hljs-comment"># 解组包操作</span><br>list3=[]<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> list1:<br>   <span class="hljs-keyword">if</span> i <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> list3:<br>       list3.append(i)<br>list3.sort()<br><span class="hljs-built_in">print</span>(list3)<br></code></pre></td></tr></table></figure><h4 id="Str"><a href="#Str" class="headerlink" title="Str"></a>Str</h4><p>无法修改、有序、可迭代<br>具备索引，可通过索引查询<br><strong>索引</strong>and<strong>切片</strong>应用与List一致<br><strong>常用方法</strong><br>find(str):返回匹配str的索引或-1<br>count(str)：统计匹配次数<br>upper():转大写<br>lower():转小写<br>split(split_str):指定分割符为列表<br>strip(strip):去除空白字符或指定字符<br>replace(old,new): 替换子串<br>startswith(str)是否以指定子串开头，返回bool</p><h4 id="Tuple"><a href="#Tuple" class="headerlink" title="Tuple"></a>Tuple</h4><p>在某一些情景下，数据只能被查询而无法被修改时，我们可以用元组（tuple）来存储<br>重复、有序、不可修改（支持索引，切片）<br>定义单元素元组要在后面加,</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><code class="hljs python">t0=(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">5</span>,<span class="hljs-number">3</span>,<span class="hljs-number">21</span>,<span class="hljs-number">78</span>,<span class="hljs-number">2</span>)<br>t1=() <span class="hljs-comment">#tuple()</span><br>t3=(<span class="hljs-number">1</span>,) <span class="hljs-comment">#t3=(1)会被认为多余括号</span><br>t0[<span class="hljs-number">1</span>] <span class="hljs-comment">#2</span><br>t0.index(<span class="hljs-number">2</span>) <span class="hljs-comment">#1 获取第一个ele的索引</span><br>t0.count(<span class="hljs-number">2</span>) <span class="hljs-comment">#2</span><br></code></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><code class="hljs python">t0=<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span> <span class="hljs-comment">#t0=(1,2,3)</span><br>a,b,c=t0 <span class="hljs-comment">#a=1,b=2,c=3，数目对应</span><br>x,*y=t0 <span class="hljs-comment">#x=1,y=[2,3],会生成列表</span><br></code></pre></td></tr></table></figure><h4 id="Set"><a href="#Set" class="headerlink" title="Set"></a>Set</h4><p>需要批量存储不可重复的数据（唯一标识）,能够自动去重<br>无序、不重复、可修改</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><code class="hljs python">s1=&#123;<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>&#125;<br>s2=<span class="hljs-built_in">set</span>()<span class="hljs-comment">#定义空集合，不可使用s2=&#123;&#125;,&#123;&#125;是空字典</span><br></code></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></pre></td><td class="code"><pre><code class="hljs python">list1=[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">12</span>,<span class="hljs-number">34</span>,<span class="hljs-number">5</span>]<br>list2=[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>]<br>list1=[*&#123;*list1,*list2&#125;]<br>list1.sort()<br><span class="hljs-built_in">print</span>(list1)<br></code></pre></td></tr></table></figure><p><strong>常用方法</strong><br>add(ele)、remove(ele)、pop()随机删除元素、clear()清空、difference(setData)差集、union(setData)并集、intersection(setData)交集</p><h4 id="Dict"><a href="#Dict" class="headerlink" title="Dict"></a>Dict</h4><p>字典中存储键值对{key:value,…}<br>不重复、可修改</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><code class="hljs python">d1=&#123;&#125; <span class="hljs-comment">#d1=dict()</span><br>d2=&#123;<span class="hljs-string">&#x27;Jay&#x27;</span>:<span class="hljs-number">100</span>,<span class="hljs-string">&#x27;John&#x27;</span>:<span class="hljs-number">90</span>,<span class="hljs-string">&#x27;Bob&#x27;</span>:<span class="hljs-number">97</span>&#125;<br>d2[<span class="hljs-string">&#x27;Jay&#x27;</span>] <span class="hljs-comment"># 100</span><br></code></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><code class="hljs python">d0=<span class="hljs-built_in">dict</span>()<br>d0[<span class="hljs-string">&#x27;a&#x27;</span>],d0[<span class="hljs-string">&#x27;b&#x27;</span>]=<span class="hljs-number">10</span>,<span class="hljs-number">20</span><br>d0.pop(<span class="hljs-string">&#x27;a&#x27;</span>)<br><span class="hljs-keyword">del</span> d0[<span class="hljs-string">&#x27;b&#x27;</span>]<br>d0[<span class="hljs-string">&#x27;c&#x27;</span>],d0[<span class="hljs-string">&#x27;d&#x27;</span>]=<span class="hljs-number">30</span>,<span class="hljs-number">30</span><br>d0[<span class="hljs-string">&#x27;c&#x27;</span>]=<span class="hljs-number">20</span><br><span class="hljs-built_in">print</span>(d0.get(<span class="hljs-string">&#x27;c&#x27;</span>),d0.keys(),d0.values(),d0.items())<br><span class="hljs-comment"># 20 dict_keys([&#x27;c&#x27;, &#x27;d&#x27;]) dict_values([20, 30]) dict_items([(&#x27;c&#x27;, 20), (&#x27;d&#x27;, 30)])</span><br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;条件判断&quot;&gt;&lt;a href=&quot;#条件判断&quot; class=&quot;headerlink&quot; title=&quot;条件判断&quot;&gt;&lt;/a&gt;条件判断&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;if…elif…else…&lt;/strong&gt;:满足条件时执行对应逻辑&lt;/p&gt;
&lt;figure class=&quot;</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/tags/python%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>PY入门1</title>
    <link href="http://example.com/2026/03/20/PY%E5%85%A5%E9%97%A81/"/>
    <id>http://example.com/2026/03/20/PY%E5%85%A5%E9%97%A81/</id>
    <published>2026-03-20T05:50:46.000Z</published>
    <updated>2026-03-20T08:51:25.912Z</updated>
    
    <content type="html"><![CDATA[<h3 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h3><p>在pycharm默认创建一个项目后，存在.venv文件夹与不显示的.idea文件夹，.idea文件夹中存放的是项目的配置文件，.venv是虚拟环境目录，存放当前项目中的环境信息（依赖项）,通过虚拟运行环境可以保证每个py项目都在独立的环境下运行。<br><img src="/img/PY%E5%85%A5%E9%97%A81/1.png"></p><h3 id="字面量"><a href="#字面量" class="headerlink" title="字面量"></a>字面量</h3><p>字面量类型：数字（int,float）、布尔（bool本质也是数字，True&#x3D;1,False&#x3D;0）、字符串（str）、空值（NoneType）、数据容器（列表、元组、集合、字典）<br>可通过**type()**获取数据类型,**isinstance(data,type)**检查数据是否属于指定类型,返回bool值</p><h3 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h3><p>存储单个数据的容器（空间）,变量名&#x3D;变量值</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><code class="hljs python">num = <span class="hljs-number">1</span><br><span class="hljs-built_in">print</span>(num)<span class="hljs-comment"># 1</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;num:<span class="hljs-subst">&#123;num&#125;</span>&#x27;</span>) <span class="hljs-comment"># print(&#x27;num:&#x27;,num)</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">type</span>(num)) <span class="hljs-comment"># int</span><br><span class="hljs-built_in">print</span>(<span class="hljs-built_in">isinstance</span>(num,<span class="hljs-built_in">int</span>)) <span class="hljs-comment"># True</span><br></code></pre></td></tr></table></figure><h3 id="标识符"><a href="#标识符" class="headerlink" title="标识符"></a>标识符</h3><p>标识符为代码中对变量、函数、类等元素的满足，标识符严格区分大小写<br>规范：帮助理解，多部分使用下划线连接，英文字母小写</p><h3 id="字符串"><a href="#字符串" class="headerlink" title="字符串"></a>字符串</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></pre></td><td class="code"><pre><code class="hljs python">str1=<span class="hljs-string">&quot;str1&quot;</span><br>str2=<span class="hljs-string">&#x27;str2&#x27;</span><br>str3=<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">s</span><br><span class="hljs-string">t</span><br><span class="hljs-string">r</span><br><span class="hljs-string">3</span><br><span class="hljs-string">&quot;&quot;&quot;</span><br></code></pre></td></tr></table></figure><p>字符是字符串内的基本单位，字符串内包含字母数字符号汉字等等都是字符<br>对字符串中的引号或者特殊表示可使用<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></pre></td><td class="code"><pre><code class="hljs python">str1=<span class="hljs-string">&#x27;It\&#x27;s&#x27;</span> <span class="hljs-comment">#单引号</span><br>str2=<span class="hljs-string">&quot;It\&quot;s&quot;</span><br>str3=<span class="hljs-string">&#x27;\n&#x27;</span> <span class="hljs-comment">#换行</span><br>str4=<span class="hljs-string">&#x27;\t&#x27;</span> <span class="hljs-comment">#增加缩进tab</span><br></code></pre></td></tr></table></figure><h3 id="字符串拼接"><a href="#字符串拼接" class="headerlink" title="字符串拼接"></a>字符串拼接</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><code class="hljs python"><span class="hljs-built_in">str</span>=<span class="hljs-string">&#x27;str1&#x27;</span>+<span class="hljs-string">&#x27;str2&#x27;</span><br>Str=<span class="hljs-string">&#x27;str3&#x27;</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;str:&#x27;</span>+<span class="hljs-built_in">str</span>+<span class="hljs-string">&#x27;,Str&#x27;</span>+Str)<br></code></pre></td></tr></table></figure><p><strong>字符串格式化</strong>,通过占位符%s,%表示要占位，s表示将变量转为字符串放入占位的位置</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><code class="hljs python"><span class="hljs-built_in">str</span>=<span class="hljs-string">&#x27;str1&#x27;</span>+<span class="hljs-string">&#x27;str2&#x27;</span><br>Str=<span class="hljs-string">&#x27;str3&#x27;</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">&#x27;str:%s,Str:%s&#x27;</span>%(<span class="hljs-built_in">str</span>,Str))<br><span class="hljs-built_in">print</span>(<span class="hljs-string">f&#x27;str:<span class="hljs-subst">&#123;<span class="hljs-built_in">str</span>&#125;</span>,Str:<span class="hljs-subst">&#123;Str&#125;</span>&#x27;</span>)<br></code></pre></td></tr></table></figure><h3 id="输入与输出"><a href="#输入与输出" class="headerlink" title="输入与输出"></a>输入与输出</h3><p>输入<strong>input(提示信息)<strong>获取键盘输入的数据<br>输出</strong>print(数据)</strong></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><code class="hljs python">in_put=<span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;input somthing&#x27;</span>)<br><span class="hljs-built_in">print</span>(in_put)<br></code></pre></td></tr></table></figure><h3 id="运算符"><a href="#运算符" class="headerlink" title="运算符"></a>运算符</h3><h4 id="算术运算符"><a href="#算术运算符" class="headerlink" title="算术运算符"></a>算术运算符</h4><p>+、-、<em>、&#x2F;（返回小数）<br>整除&#x2F;&#x2F;，取余%，幂指数</em>*<br>存在精度损失,如下：</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><code class="hljs python">x=<span class="hljs-built_in">float</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;input x&#x27;</span>)) <span class="hljs-comment">#0.5</span><br>y=<span class="hljs-built_in">float</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">&#x27;input y&#x27;</span>)) <span class="hljs-comment">#0.4</span><br><span class="hljs-built_in">print</span>(x-y) <span class="hljs-comment">#0.09999999999999998</span><br></code></pre></td></tr></table></figure><p>精度损失是由于计算机底层是基于<strong>二进制</strong>进行数据存储管理,二进制无法准确表示所有小数，涉及浮点数运算时可能会有损失</p><h4 id="赋值运算符"><a href="#赋值运算符" class="headerlink" title="赋值运算符"></a>赋值运算符</h4><p>+&#x3D;、-&#x3D;、*&#x3D;、&#x2F;&#x3D;、&#x2F;&#x2F;&#x3D;、%&#x3D;、**&#x3D;</p><h4 id="比较运算符"><a href="#比较运算符" class="headerlink" title="比较运算符"></a>比较运算符</h4><p>&#x3D;&#x3D;、!&#x3D;、&gt;、&gt;&#x3D;、&lt;、&lt;&#x3D;</p><h4 id="逻辑运算符"><a href="#逻辑运算符" class="headerlink" title="逻辑运算符"></a>逻辑运算符</h4><p>and、or、not</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;目录结构&quot;&gt;&lt;a href=&quot;#目录结构&quot; class=&quot;headerlink&quot; title=&quot;目录结构&quot;&gt;&lt;/a&gt;目录结构&lt;/h3&gt;&lt;p&gt;在pycharm默认创建一个项目后，存在.venv文件夹与不显示的.idea文件夹，.idea文件夹中存放的是项目的配置文件</summary>
      
    
    
    
    <category term="python开发" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/categories/python%E5%BC%80%E5%8F%91/python%E5%85%A5%E9%97%A8/"/>
    
    
    <category term="python开发" scheme="http://example.com/tags/python%E5%BC%80%E5%8F%91/"/>
    
    <category term="python入门" scheme="http://example.com/tags/python%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>前端JS进阶回顾2</title>
    <link href="http://example.com/2026/03/10/%E5%89%8D%E7%AB%AFJS%E8%BF%9B%E9%98%B6%E5%9B%9E%E9%A1%BE2/"/>
    <id>http://example.com/2026/03/10/%E5%89%8D%E7%AB%AFJS%E8%BF%9B%E9%98%B6%E5%9B%9E%E9%A1%BE2/</id>
    <published>2026-03-10T12:28:43.000Z</published>
    <updated>2026-03-11T12:00:12.290Z</updated>
    
    <content type="html"><![CDATA[<h3 id="面向对象"><a href="#面向对象" class="headerlink" title="面向对象"></a>面向对象</h3><p>每一个对象具备明确分工，具备封装性、继承性、多态性</p><h3 id="面向对象-构造函数"><a href="#面向对象-构造函数" class="headerlink" title="面向对象-构造函数"></a>面向对象-构造函数</h3><p>面向对象编程借助于构造函数实现<br>在进阶1中提到的构造函数在实例化新对象时会重新开辟空间存储新值，存在浪费内存的问题</p><h3 id="原型"><a href="#原型" class="headerlink" title="原型"></a>原型</h3><p>原型能够解决构造函数中浪费内存的问题<br>构造函数中通过原型分配的函数是所有对象所共享的<br>JS规定：每一个构造函数都有一个<strong>prototype</strong>属性，指向原型对象（每个构造方法只有一个），该对象可以挂载函数，因此可以将公共的方法定义在原型对象上，其中无论是构造函数还是原型对象中，this都指向实例化的对象</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">Student</span>(<span class="hljs-params">name,age</span>)&#123;<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">name</span>=name<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">age</span>=age<br>&#125;<br><span class="hljs-title class_">Student</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">read</span>=<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;read&#x27;</span><br>&#125;<br><span class="hljs-keyword">const</span> <span class="hljs-title class_">Jack</span>=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Student</span>(<span class="hljs-string">&#x27;jack&#x27;</span>,<span class="hljs-number">19</span>)<br><span class="hljs-title class_">Jack</span>.<span class="hljs-title function_">read</span>()<span class="hljs-comment">//read this-&gt;Jack</span><br></code></pre></td></tr></table></figure><h4 id="constructor属性"><a href="#constructor属性" class="headerlink" title="constructor属性"></a>constructor属性</h4><p>原型对象内都存在constructor属性（构造器-构造函数）,该属性指向构造函数<br>在对原型对象进行赋值多个方法时，会使用对象赋值的形式，但会覆盖构造函数原型对象原有的内容，使修改后的原型对象constructor不在指向原有构造函数，为解决该问题：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">Student</span>(<span class="hljs-params"></span>)&#123;<br>&#125;<br><span class="hljs-keyword">const</span> <span class="hljs-title class_">Jack</span>=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Student</span>()<br><span class="hljs-comment">// Student.prototype.constructor-&gt;Student</span><br><span class="hljs-title class_">Student</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>=&#123;<br>    <span class="hljs-attr">constructor</span>:<span class="hljs-title class_">Student</span><br>    <span class="hljs-attr">read</span>:<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;<span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;read&#x27;</span>&#125;,<br>    <span class="hljs-attr">write</span>:<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;<span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;write&#x27;</span>&#125;<br>&#125;<br></code></pre></td></tr></table></figure><h4 id="对象原型"><a href="#对象原型" class="headerlink" title="对象原型"></a>对象原型</h4><p>每个构造函数都有一个原型对象，而构造函数能够创建实例对象，实例对象依靠<strong>对象原型</strong>访问原型对象内的属性<br>**对象原型__proto__**是对象的一个属性（只读），指向构造函数的原型对象,有些浏览器是[[prototype]]</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">Student</span>(<span class="hljs-params"></span>)&#123;<br>&#125;<br><span class="hljs-keyword">const</span> <span class="hljs-title class_">Jack</span>=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Student</span>()<br><span class="hljs-comment">// Jack.__proto__-&gt;Student.prototype</span><br><span class="hljs-comment">// Jack.__proto__.constructor-&gt;Student</span><br></code></pre></td></tr></table></figure><h4 id="原型继承"><a href="#原型继承" class="headerlink" title="原型继承"></a>原型继承</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> <span class="hljs-title class_">Home</span>=&#123;<br>    <span class="hljs-attr">money</span>:<span class="hljs-number">100</span><br>&#125;<br><span class="hljs-keyword">function</span> <span class="hljs-title function_">Parent</span>(<span class="hljs-params"></span>)&#123;<br>    <br>&#125;<br><span class="hljs-title class_">Parent</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>=<span class="hljs-title class_">Home</span><br><span class="hljs-title class_">Parent</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">constructor</span>=<span class="hljs-title class_">Parent</span><br></code></pre></td></tr></table></figure><p>上述就是一个继承，但存在问题，当多个构造函数继承同一个对象时，会存在变量污染，此时可以使用继承构造函数的实例化对象解决</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">Home</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">money</span>=<span class="hljs-number">100</span><br>&#125;<br><span class="hljs-keyword">function</span> <span class="hljs-title function_">Parent</span>(<span class="hljs-params"></span>)&#123;<br>    <br>&#125;<br><span class="hljs-title class_">Parent</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Home</span>()<br><span class="hljs-title class_">Parent</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">constructor</span>=<span class="hljs-title class_">Parent</span><br></code></pre></td></tr></table></figure><h4 id="原型链"><a href="#原型链" class="headerlink" title="原型链"></a>原型链</h4><p>原型对象中也有对象原型，其中原型对象的对象原型指向Object的原型对象（构造函数的原型对象，所有对象包括原型对象都是由Object构造的），Object的原型对象的对象原型为null<br>原型链是基于原型对象的继承使得不同的构造函数的原型对象关联起来的链状结构<br>原型链为对象的属性或方法提供了一条查找链<br><strong>instanceof</strong>运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上</p><h3 id="深浅拷贝"><a href="#深浅拷贝" class="headerlink" title="深浅拷贝"></a>深浅拷贝</h3><p>运用于复制对象，在直接复制对象时，修改新对象属性时会污染原对象属性</p><h4 id="浅拷贝"><a href="#浅拷贝" class="headerlink" title="浅拷贝"></a>浅拷贝</h4><p>浅拷贝拷贝的是简单数据的值</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><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><code class="hljs javascript"><span class="hljs-keyword">const</span> obj=&#123;<br>    <span class="hljs-attr">a</span>:<span class="hljs-number">1</span><br>&#125;<br><span class="hljs-keyword">const</span> o=&#123;...obj&#125;<br></code></pre></td></tr></table></figure><p><strong>assgin()</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">Object</span>.<span class="hljs-title function_">assgin</span>(o,obj)<br></code></pre></td></tr></table></figure><h4 id="深拷贝"><a href="#深拷贝" class="headerlink" title="深拷贝"></a>深拷贝</h4><p>浅拷贝只拷贝简单数据类型的值，当对象内存在对象（复杂数据）,栈内存储的数据地址指向堆内数据，浅拷贝依旧存储堆内复杂数据的地址，导致依旧指向原堆内数据，造成污染。<br>深拷贝能解决这个问题<br><strong>递归函数</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params">o,obj</span>)&#123;<br>    <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> k <span class="hljs-keyword">in</span> obj)&#123;<br>        <span class="hljs-keyword">if</span>(obj[k] <span class="hljs-keyword">instanceof</span> <span class="hljs-title class_">Array</span>)&#123;<br>            o[k]=[]<br>            <span class="hljs-title function_">fn</span>(o[k],obj[k])<br>        &#125;<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(obj[k] <span class="hljs-keyword">instanceof</span> <span class="hljs-title class_">Object</span>)&#123;<br>            o[k]=&#123;&#125;<br>            <span class="hljs-title function_">fn</span>(o[k],obj[k])<br>        &#125;<span class="hljs-keyword">else</span>&#123;<br>            o[k]=obj[k]<br>        &#125;<br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>lodash-cloneDeep</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> o=_.<span class="hljs-title function_">cloneDeep</span>(obj)<br></code></pre></td></tr></table></figure><p><strong>JSON</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> o=<span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">parse</span>(<span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(obj))<br></code></pre></td></tr></table></figure><h3 id="异常处理"><a href="#异常处理" class="headerlink" title="异常处理"></a>异常处理</h3><h4 id="throw抛异常"><a href="#throw抛异常" class="headerlink" title="throw抛异常"></a>throw抛异常</h4><p>预估代码执行过程中可能发生的错误,会中断程序</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> <span class="hljs-title function_">fn</span>=(<span class="hljs-params">x</span>)=&gt;&#123;<br>    <span class="hljs-keyword">if</span>(!x)&#123;<br>        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">&#x27;无参数&#x27;</span>)<br>    &#125;<br>    <span class="hljs-keyword">return</span> x<br>&#125;<br></code></pre></td></tr></table></figure><h4 id="try-catch捕获异常"><a href="#try-catch捕获异常" class="headerlink" title="try&#x2F;catch捕获异常"></a>try&#x2F;catch捕获异常</h4><p>将可能错误的代码写到try，catch内写错误后的处理函数，不会中断程序;finally不管报错与否都会执行</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-keyword">try</span>&#123;<br>        ...<br>    &#125;<span class="hljs-keyword">catch</span>(err)&#123;<br>        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(err)<br>    &#125;<span class="hljs-keyword">finally</span>&#123;<br><br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><h4 id="debugger"><a href="#debugger" class="headerlink" title="debugger"></a>debugger</h4><p>在代码中使用debugger,程序中断于debugger处</p><h3 id="处理this"><a href="#处理this" class="headerlink" title="处理this"></a>处理this</h3><h4 id="this指向"><a href="#this指向" class="headerlink" title="this指向"></a>this指向</h4><p>普通函数中this指向调用函数的对象，普通函数中无明确调用者时指向windows，在严格模式(use strict)中无明确调用者时返回undefind<br>箭头函数无this，函数内的this沿着作用域指向上一层this的值，箭头函数不适用于构造函数，原型函数，dom事件函数等等</p><h4 id="改变指向"><a href="#改变指向" class="headerlink" title="改变指向"></a>改变指向</h4><p>**fn.call(thisArg,arg1,arg2,…)**调用函数fn，thisArg是fn运行时指定的this值，其他arg为其他参数<br>**fn.apply(thisArg,[argsArray])**调用函数fn，thisArg是fn运行时指定的this值，其他参数必须包含在数组内<br>**fn.bind(thisArg,arg1,arg2,…)**不调用函数，返回指定的this值和初始化参数的新函数(原函数改造)</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;面向对象&quot;&gt;&lt;a href=&quot;#面向对象&quot; class=&quot;headerlink&quot; title=&quot;面向对象&quot;&gt;&lt;/a&gt;面向对象&lt;/h3&gt;&lt;p&gt;每一个对象具备明确分工，具备封装性、继承性、多态性&lt;/p&gt;
&lt;h3 id=&quot;面向对象-构造函数&quot;&gt;&lt;a href=&quot;#面向对</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>前端JS进阶回顾1</title>
    <link href="http://example.com/2026/03/09/%E5%89%8D%E7%AB%AFJS%E8%BF%9B%E9%98%B6%E5%9B%9E%E9%A1%BE1/"/>
    <id>http://example.com/2026/03/09/%E5%89%8D%E7%AB%AFJS%E8%BF%9B%E9%98%B6%E5%9B%9E%E9%A1%BE1/</id>
    <published>2026-03-09T08:44:21.000Z</published>
    <updated>2026-03-10T12:25:21.061Z</updated>
    
    <content type="html"><![CDATA[<h3 id="作用域"><a href="#作用域" class="headerlink" title="作用域"></a>作用域</h3><p>作用域规定了变量能够被访问的范围。</p><h4 id="局部作用域与全局作用域"><a href="#局部作用域与全局作用域" class="headerlink" title="局部作用域与全局作用域"></a>局部作用域与全局作用域</h4><p><strong>局部作用域</strong>：函数作用域与块作用域<br>函数作用域：在函数内部声明的变量只能在函数内部访问，外部无法直接访问（函数执行完毕后，函数内部的变量就被清空了）<br>块作用域：在js中使用{}包裹的代码称为代码块，代码块内部声明的变量外部可能（var定义可被访问）无法被访问<br>let、const声明的变量会产生块作用域，var不会产生<br><strong>全局作用域</strong>：在script标签与.js文件中为全局作用域，在其中声明的变量全局可访问</p><h4 id="作用域链"><a href="#作用域链" class="headerlink" title="作用域链"></a>作用域链</h4><p>作用域链本质上就是变量查找机制<br>函数被执行时会采用<strong>就近原则</strong>优先查找函数作用域中的变量，如果当前作用域无该变量则逐级查找父级作用域直至全局作用域（子能够访问父作用域，父无法访问子作用域）</p><h4 id="JS垃圾回收机制（GC）"><a href="#JS垃圾回收机制（GC）" class="headerlink" title="JS垃圾回收机制（GC）"></a>JS垃圾回收机制（GC）</h4><p>JS中内存的分配回收都是自动完成的，内存在不使用的时候会被垃圾回收器自动回收<br>内存生命周期：<strong>内存分配（声明时）-&gt;内存使用（读写内存时）-&gt;内存回收（使用完毕时）</strong><br>全局变量关闭页面回收，局部变量在不使用时会自动回收<br><strong>内存泄漏</strong>：程序中分配的内存由于某种原因未释放或无法释放叫做内存泄漏<br><strong>垃圾回收算法</strong>：引用计数法与标记清除法<br>复杂数据类型的数据地址存储在栈中，数据存储在堆中，栈中的地址指向该数据（或堆内其他数据指向该数据时）称为被引用，当地址指向更改为其他数据时，原数据的引用就被减少，当无地址（或数据）指向原数据时，称为无引用<br><strong>引用计数法</strong>：该对象是否存在指向它的引用，如果无引用则回收对象</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs 算法">1.跟着记录被引用的次数<br>2.如果被引用了一次，记录+1，多次引用累加<br>3.减少一个引用则-1<br>4.引用次数为0时释放内存<br></code></pre></td></tr></table></figure><p>引用计数存在一个致命问题,嵌套引用</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-keyword">let</span> o1=&#123;&#125;<br>    <span class="hljs-keyword">let</span> o2=&#123;&#125;<br>    o1.<span class="hljs-property">a</span>=o2<br>    o2.<span class="hljs-property">a</span>=o1<br>    <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;引用计数无法回收&#x27;</span><br>&#125;<br></code></pre></td></tr></table></figure><p><strong>标记清除法</strong><br>标记清除法是从根部（全局对象）出发定时扫描内存中的对象，能从根部到达的对象都是还需要使用的，无法触及到的对象标记为不再使用，稍后进行回收</p><h4 id="闭包"><a href="#闭包" class="headerlink" title="闭包"></a>闭包</h4><p>一个函数对周围状态的引用捆绑在一起，内层函数中访问到其外层函数的作用域<br><strong>闭包&#x3D;内层函数+外层函数变量</strong><br>作用：将内部数据返回，让外部能够使用函数内部变量，实现数据的私有</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-keyword">const</span> arg=<span class="hljs-number">1</span><br>    <span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">g</span>(<span class="hljs-params"></span>)&#123;<br>        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arg)<br>    &#125;<br>&#125;<br><span class="hljs-title function_">fn</span>()<br></code></pre></td></tr></table></figure><p>风险：可能导致内存泄漏</p><h4 id="变量提升"><a href="#变量提升" class="headerlink" title="变量提升"></a>变量提升</h4><p>变量提升是JS的缺陷,只存在var中<br>在代码执行之前，将var的声明提升到当前作用域最前面，但不提升赋值</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arg)<span class="hljs-comment">//return undefined</span><br><span class="hljs-keyword">var</span> arg=<span class="hljs-number">1</span><br></code></pre></td></tr></table></figure><p>上述代码等效于</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">var</span> arg<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arg)<span class="hljs-comment">//return undefined</span><br>arg=<span class="hljs-number">1</span><br></code></pre></td></tr></table></figure><h3 id="函数进阶"><a href="#函数进阶" class="headerlink" title="函数进阶"></a>函数进阶</h3><h4 id="函数提升"><a href="#函数提升" class="headerlink" title="函数提升"></a>函数提升</h4><p>函数提升与变量提升类似,在相同作用域下</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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><code class="hljs javascript"><span class="hljs-title function_">fn</span>()<br><span class="hljs-keyword">function</span> <span class="hljs-title function_">fn</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-comment">// ...</span><br>    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span><br>&#125;<br></code></pre></td></tr></table></figure><h4 id="函数参数"><a href="#函数参数" class="headerlink" title="函数参数"></a>函数参数</h4><p><strong>动态参数</strong>：arguments包含调用函数时传入的所有实参，返回的是伪数组</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">getSum</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-keyword">let</span> sum=<span class="hljs-number">0</span><br>    <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i=<span class="hljs-number">0</span>;i&lt;<span class="hljs-variable language_">arguments</span>.<span class="hljs-property">length</span>;i++)&#123;<br>        sum+=<span class="hljs-variable language_">arguments</span>[i]<br>    &#125;<br>    <span class="hljs-keyword">return</span> sum<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>剩余参数</strong>:用于接收形参后的多余参数,剩余参数中返回的是真数组</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">getSum</span>(<span class="hljs-params">...arg</span>)&#123;<br>     <span class="hljs-keyword">let</span> sum=<span class="hljs-number">0</span><br>    <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i=<span class="hljs-number">0</span>;i&lt;arg.<span class="hljs-property">length</span>;i++)&#123;<br>        sum+=arg[i]<br>    &#125;<br>    <span class="hljs-keyword">return</span> sum<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>…</strong>:展开运算符，可以展开数组，可以求数组最大值，合并数组等</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">const</span> arr=[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>]<br><span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(...arr)<span class="hljs-comment">//return 5</span><br><span class="hljs-keyword">const</span> arr2=[...arr,<span class="hljs-number">23</span>,<span class="hljs-number">5</span>]<br></code></pre></td></tr></table></figure><h4 id="箭头函数"><a href="#箭头函数" class="headerlink" title="箭头函数"></a>箭头函数</h4><p>箭头函数使得函数表达式更简洁</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> <span class="hljs-title function_">fn</span>=(<span class="hljs-params"></span>)=&gt;&#123;<br>    <span class="hljs-comment">// ...</span><br>    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span><br>&#125;<br><span class="hljs-keyword">const</span> <span class="hljs-title function_">fn1</span>=x=&gt;&#123;<br>    <span class="hljs-keyword">return</span> x<br>&#125;<br><span class="hljs-keyword">const</span> <span class="hljs-title function_">fn2</span>=y=&gt;y<br></code></pre></td></tr></table></figure><p><strong>参数</strong>：没有动态参数，只有剩余参与</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> <span class="hljs-title function_">getSum</span>=(<span class="hljs-params">...arg</span>)=&gt;&#123;<br>    <span class="hljs-keyword">let</span> sum=<span class="hljs-number">0</span><br>     <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i=<span class="hljs-number">0</span>;i&lt;arg.<span class="hljs-property">length</span>;i++)&#123;<br>        sum+=arg[i]<br>    &#125;<br>    <span class="hljs-keyword">return</span> sum<br>&#125;<br></code></pre></td></tr></table></figure><p><strong>this</strong>:在作用域的上一层沿用this</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> <span class="hljs-title function_">fn</span>=(<span class="hljs-params"></span>)=&gt;&#123;<br>    <span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span> <span class="hljs-comment">//return window</span><br>&#125;<br><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br>cls.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;click&#x27;</span>,fn)<span class="hljs-comment">//return e</span><br></code></pre></td></tr></table></figure><h3 id="解构赋值"><a href="#解构赋值" class="headerlink" title="解构赋值"></a>解构赋值</h3><p>解构赋值是将复杂数据类型的值依次赋予给一系列变量的简洁语法</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> arr=[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>]<br><span class="hljs-keyword">const</span> obj=&#123;<br>    <span class="hljs-attr">a</span>:<span class="hljs-number">1</span>,<br>    <span class="hljs-attr">b</span>:<span class="hljs-number">2</span><br>&#125;<br><span class="hljs-keyword">const</span> [a,b,c]=arr<br><span class="hljs-keyword">const</span> &#123;<span class="hljs-attr">a</span>:d,<span class="hljs-attr">b</span>:e&#125;=obj<span class="hljs-comment">//d===obj.a</span><br></code></pre></td></tr></table></figure><p>在立即执行函数和[]前必须加分号</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">let</span> a=<span class="hljs-number">1</span><br><span class="hljs-keyword">let</span> b=<span class="hljs-number">2</span>;<br>[b,a]=[a,b]<br></code></pre></td></tr></table></figure><h3 id="深入对象"><a href="#深入对象" class="headerlink" title="深入对象"></a>深入对象</h3><p>字面量创建</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">const</span> obj=&#123;<br>    <span class="hljs-attr">a</span>:<span class="hljs-number">1</span><br>&#125;<br></code></pre></td></tr></table></figure><p>利用<strong>new Object</strong>创建</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> obj=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Object</span>()<br>obj.<span class="hljs-property">a</span>=<span class="hljs-number">1</span><br><span class="hljs-keyword">const</span> obj1=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Object</span>(&#123;<br>    <span class="hljs-attr">b</span>:<span class="hljs-number">1</span><br>&#125;)<br></code></pre></td></tr></table></figure><p>利用<strong>构造函数</strong>创建，构造函数用于初始化对象</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">Student</span>(<span class="hljs-params">name,age</span>)=&gt;&#123;<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">name</span>=name<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">age</span>=age<br>&#125;<br><span class="hljs-keyword">const</span> <span class="hljs-title class_">Jack</span>=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Student</span>(<span class="hljs-string">&#x27;Jack&#x27;</span>,<span class="hljs-number">19</span>)<br></code></pre></td></tr></table></figure><h4 id="实例化执行过程"><a href="#实例化执行过程" class="headerlink" title="实例化执行过程"></a>实例化执行过程</h4><p>创建新对象<br>构造函数this指向新对象<br>执行构造函数代码，修改this，添加新的属性<br>返回新对象</p><h4 id="实例成员-静态成员"><a href="#实例成员-静态成员" class="headerlink" title="实例成员&amp;静态成员"></a>实例成员&amp;静态成员</h4><p>通过构造函数创建的对象称为<strong>实例对象</strong>，实例对象中的属性和方法称为<strong>实例成员</strong><br>构造函数创建的实例对象彼此独立互不影响</p><p>构造函数中的属性和方法被称为<strong>静态成员</strong>，静态成员只能构造函数访问，静态方法中的this指向构造函数</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">Student</span>(<span class="hljs-params">name,age</span>)=&gt;&#123;<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">name</span>=name<br>    <span class="hljs-variable language_">this</span>.<span class="hljs-property">age</span>=age<br>&#125;<br><span class="hljs-title class_">Student</span>.<span class="hljs-property">num</span>=<span class="hljs-number">1001</span><br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title class_">Student</span>.<span class="hljs-property">num</span>)<span class="hljs-comment">//1001</span><br></code></pre></td></tr></table></figure><h3 id="内置构造函数"><a href="#内置构造函数" class="headerlink" title="内置构造函数"></a>内置构造函数</h3><p>JS底层对数据进行实例化，使得简单数据类型包装为复杂数据类型</p><h4 id="Object"><a href="#Object" class="headerlink" title="Object"></a>Object</h4><p>Object.key(obj)获取对象中的所有属性，返回一个数组<br>Object.values(obj)获取对象中的所有值，返回一个数组<br>Object.assign(newObj,oldObj)用于对象拷贝，实际上常用与对象追加，将oldObj的属性增加到newObj</p><h4 id="Array"><a href="#Array" class="headerlink" title="Array"></a>Array</h4><p>forEach(fn)用于遍历数组，不返回数组<br>filter(fn)用于过滤数组，返回符合筛选条件的新数组<br>map(fn)用于迭代数组，返回处理后的新数组<br>reduce(fn(prev,curr),init)返回累计处理的结果,init为初始值，prev为前一个值，curr为当前值，init可不传，fn返回值作为下一次循环的prev</p><p><strong>其他常用方法</strong><br>join用于拼接字符串<br>find查找元素，返回符合条件的第一个元素组，无则返回undefined<br>every检测所有元素是否符合指定条件，所有都符合返回true,否则false<br>some检测是否存在元素符合条件，存在返回true，否则false<br>concat合并两个数组，返回新数组<br>sort排序<br>splice删除或替换原数组元素<br>reverse反转数组<br>findIndex查找元素索引</p><h4 id="String"><a href="#String" class="headerlink" title="String"></a>String</h4><p>length获取字符串长度<br>split(splitStr)字符串拆分为数组<br>substring(start,end)截取字符串<br>startsWith是否以某字符开头<br>includes判断字符是否包含，return boolean<br>toUpperCase转大写<br>toLowerCase转小写<br>indexOf检测包含某字符<br>endsWith检测是否以某字符结尾<br>replace替换字符串，正则<br>match查找字符串，正则</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;作用域&quot;&gt;&lt;a href=&quot;#作用域&quot; class=&quot;headerlink&quot; title=&quot;作用域&quot;&gt;&lt;/a&gt;作用域&lt;/h3&gt;&lt;p&gt;作用域规定了变量能够被访问的范围。&lt;/p&gt;
&lt;h4 id=&quot;局部作用域与全局作用域&quot;&gt;&lt;a href=&quot;#局部作用域与全局作用域&quot; </summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>前端WebAPIs回顾5</title>
    <link href="http://example.com/2026/03/09/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE5/"/>
    <id>http://example.com/2026/03/09/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE5/</id>
    <published>2026-03-09T07:48:06.000Z</published>
    <updated>2026-03-09T08:36:48.497Z</updated>
    
    <content type="html"><![CDATA[<h3 id="正则表达式"><a href="#正则表达式" class="headerlink" title="正则表达式"></a>正则表达式</h3><p>正则表达式是用于匹配字符串中的字符组合的模式,可以用于验证表单、敏感词过滤<br>**regObj.test(str)**匹配返回bolean,匹配为true<br>**regObj.exec(str)**匹配成功返回Arr,否则为null</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">const</span> str=<span class="hljs-string">&#x27;examp str&#x27;</span><br><span class="hljs-keyword">const</span> reg=<span class="hljs-regexp">/str/</span><br>reg.<span class="hljs-title function_">test</span>(str)<br></code></pre></td></tr></table></figure><h4 id="元字符"><a href="#元字符" class="headerlink" title="元字符"></a>元字符</h4><p>元字符是一些具有特殊含义的字符，即将常用的普通字符映射为更简洁的表示方式<br>**[a-z]**代表a到z的26个英文字母<br><strong>边界符</strong>表示位置、开头(^)与结尾($),^…$表示精确匹配…<br><strong>量词</strong>表示重复次数，*表示重复0次或更多次，+表示重复1次或更多次，?表示重复0次或1次;{n}重复n次、{n,}重复n次或以上，{n,m}重复n到m次</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> reg=<span class="hljs-regexp">/^ab*$/</span> <span class="hljs-comment">// /^ab&#123;0,&#125;$/</span><br>reg.<span class="hljs-title function_">test</span>(<span class="hljs-string">&#x27;abdiusadab&#x27;</span>)<span class="hljs-comment">//true</span><br></code></pre></td></tr></table></figure><p><strong>字符类</strong>使用字符代表规则,[]匹配字符集合，包含集合其中之一，返回匹配；-连字符表示一个范围</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> reg=<span class="hljs-regexp">/[abc]/</span><br><span class="hljs-keyword">const</span> reg1=<span class="hljs-regexp">/^[a-zA-Z0-9]&#123;4,6&#125;$/</span><br></code></pre></td></tr></table></figure><p><strong>预定义类</strong><br><a href="https://juejin.cn/post/7559553453531447306">参考链接</a></p><h4 id="修饰符"><a href="#修饰符" class="headerlink" title="修饰符"></a>修饰符</h4><p>修饰符表示匹配过程中是否区分大小写、是否支持多行匹配<br><strong>i</strong>表示匹配不区分大小写<br><strong>g</strong>表示全局匹配</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> reg=<span class="hljs-regexp">/^[a-z]/i</span><br></code></pre></td></tr></table></figure><p>**str.replace(reg,str)**将匹配reg的文本替换为str</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;正则表达式&quot;&gt;&lt;a href=&quot;#正则表达式&quot; class=&quot;headerlink&quot; title=&quot;正则表达式&quot;&gt;&lt;/a&gt;正则表达式&lt;/h3&gt;&lt;p&gt;正则表达式是用于匹配字符串中的字符组合的模式,可以用于验证表单、敏感词过滤&lt;br&gt;**regObj.test(str</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>前端WebAPIs回顾4</title>
    <link href="http://example.com/2026/03/08/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE4/"/>
    <id>http://example.com/2026/03/08/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE4/</id>
    <published>2026-03-08T09:57:37.000Z</published>
    <updated>2026-03-08T11:38:21.854Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Window对象"><a href="#Window对象" class="headerlink" title="Window对象"></a>Window对象</h3><h4 id="BOM-浏览器对象模型"><a href="#BOM-浏览器对象模型" class="headerlink" title="BOM(浏览器对象模型)"></a>BOM(浏览器对象模型)</h4><p>BOM对象包含window（navigator、location、document、history、screen）</p><h4 id="定时器-延时函数"><a href="#定时器-延时函数" class="headerlink" title="定时器-延时函数"></a>定时器-延时函数</h4><p><strong>setTimeout</strong>定时器</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> timer=<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">()=&gt;</span>fn,wait)<br><span class="hljs-built_in">clearTimeout</span>(timer)<br></code></pre></td></tr></table></figure><h4 id="JS执行机制（事件循环-event-loop）"><a href="#JS执行机制（事件循环-event-loop）" class="headerlink" title="JS执行机制（事件循环-event loop）"></a>JS执行机制（事件循环-event loop）</h4><p>JS是<strong>单线程语言</strong>，代码从上往下执行，需要前一个任务完成后才能做下一个任务，如果存在延时操作的任务时会造成任务运行时间长，阻塞页面渲染。<br>为了解决这个问题，HTML5提出<strong>Web Worker</strong>标准，允许js脚本创建多线程，因此产生了<strong>同步</strong>(顺序执行)与<strong>异步</strong>(同时执行)。<br>同步任务在主线程上执行，形成一个<strong>执行栈</strong><br>异步任务通过回调函数实现的（事件监听、资源加载、定时器），结束后添加到<strong>任务队列（消息队列）</strong>中<br><strong>执行过程</strong>：先执行执行栈中的同步任务；异步任务经过webAPI进行执行；将执行完毕的异步任务放入任务队列中；等待执行栈中的同步任务执行完毕;将顺序读取任务队列中的异步任务;加入执行栈开始执行。</p><h4 id="location对象"><a href="#location对象" class="headerlink" title="location对象"></a>location对象</h4><p>location对象拆分并保存了url地址的各个组成部分<br><strong>常用属性</strong>：herf(用于js跳转页面)、hash（获取地址中的hash值，即url中#后的部分）、reload(boolean)（刷新当前页面）</p><h4 id="navigator对象"><a href="#navigator对象" class="headerlink" title="navigator对象"></a>navigator对象</h4><p>navigator对象记录浏览器的相关信息<br><strong>常用属性和方法</strong>：userAgent(检测浏览器的版本及平台)</p><h4 id="histroy对象"><a href="#histroy对象" class="headerlink" title="histroy对象"></a>histroy对象</h4><p>history对象主要管理历史对象（页面的前进、后退、历史记录等）<br><strong>常用属性和方法</strong>：**back()<strong>用于后退、</strong>forward()<strong>前进功能、</strong>go(arg)**arg为正整数，-1为后退一个页面，1为前进一个页面</p><h3 id="本地存储"><a href="#本地存储" class="headerlink" title="本地存储"></a>本地存储</h3><p>数据存储在用户浏览器中，在页面刷新时不丢失网页数据<br><strong>localStorage</strong>:将数据永远存储在本地，关闭页面也会存在，可以多窗口共享</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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><code class="hljs javascript"><span class="hljs-comment">//SET</span><br><span class="hljs-variable language_">localStorage</span>.<span class="hljs-title function_">setItem</span>(key,value)<span class="hljs-comment">//(string,string)</span><br><span class="hljs-comment">// GET</span><br><span class="hljs-variable language_">localStorage</span>.<span class="hljs-title function_">getItem</span>(key)<span class="hljs-comment">//(string)</span><br><span class="hljs-comment">// REMOVE</span><br><span class="hljs-variable language_">localStorage</span>.<span class="hljs-title function_">removeItem</span>(key)<span class="hljs-comment">//(string)</span><br></code></pre></td></tr></table></figure><p><strong>sessionStorage</strong>:数据存储在网页，当关闭浏览器时数据消失，在同一个窗口中共享</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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><code class="hljs javascript"><span class="hljs-comment">//SET</span><br><span class="hljs-variable language_">sessionStorage</span>.<span class="hljs-title function_">setItem</span>(key,value)<span class="hljs-comment">//(string,string)</span><br><span class="hljs-comment">// GET</span><br><span class="hljs-variable language_">sessionStorage</span>.<span class="hljs-title function_">getItem</span>(key)<span class="hljs-comment">//(string)</span><br><span class="hljs-comment">// REMOVE</span><br><span class="hljs-variable language_">sessionStorage</span>.<span class="hljs-title function_">removeItem</span>(key)<span class="hljs-comment">//(string)</span><br></code></pre></td></tr></table></figure><p><strong>存储复杂数据</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(obj)<span class="hljs-comment">//return obj`s JSON</span><br><span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">oarse</span>(json)<span class="hljs-comment">//return json`s OBJ</span><br></code></pre></td></tr></table></figure><h3 id="forEach-map-join"><a href="#forEach-map-join" class="headerlink" title="forEach map join"></a>forEach map join</h3><p><strong>forEach</strong>可以遍历数组并处理，无返回值<br><strong>map</strong>可以遍历数组处理数据，并返回新的数组<br>**join(arg)**将数组转为字符串，arg作为分隔符</p><figure class="highlight javascript"><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><code class="hljs javascript">arr.<span class="hljs-title function_">forEach</span>(<span class="hljs-title function_">fn</span>(ele,index))<br>arr.<span class="hljs-title function_">map</span>(<span class="hljs-title function_">fn</span>(ele,index))<br>arr.<span class="hljs-title function_">join</span>(<span class="hljs-string">&#x27;&#x27;</span>)<br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;Window对象&quot;&gt;&lt;a href=&quot;#Window对象&quot; class=&quot;headerlink&quot; title=&quot;Window对象&quot;&gt;&lt;/a&gt;Window对象&lt;/h3&gt;&lt;h4 id=&quot;BOM-浏览器对象模型&quot;&gt;&lt;a href=&quot;#BOM-浏览器对象模型&quot; class</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>前端WebAPIs回顾3</title>
    <link href="http://example.com/2026/03/07/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE3/"/>
    <id>http://example.com/2026/03/07/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE3/</id>
    <published>2026-03-07T11:45:49.000Z</published>
    <updated>2026-03-08T09:52:22.750Z</updated>
    
    <content type="html"><![CDATA[<h3 id="日期对象"><a href="#日期对象" class="headerlink" title="日期对象"></a>日期对象</h3><p>用来表示时间的对象</p><h4 id="实例化"><a href="#实例化" class="headerlink" title="实例化"></a>实例化</h4><p>使用new关键字将时间变为一个对象</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><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><code class="hljs javascript"><span class="hljs-comment">// GET NOW TIME</span><br><span class="hljs-keyword">const</span> date=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>()<br><span class="hljs-comment">// GET CUSTOM TIME</span><br><span class="hljs-keyword">const</span> date1=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>(<span class="hljs-string">&#x27;2005-2-19&#x27;</span>)<br></code></pre></td></tr></table></figure><h4 id="日期对象方法"><a href="#日期对象方法" class="headerlink" title="日期对象方法"></a>日期对象方法</h4><p><strong>getFullYear()</strong>:获取四位年份<br><strong>getMonth()<strong>：获取月份（0-11）<br><strong>getDate()</strong>:获取号数<br><strong>getDay()</strong>:获取星期（0-6）<br><strong>getHours()</strong>:获取小时（0-23）<br><strong>getMinutes()</strong>:获取分钟（0-59）<br><strong>getDSeconds()</strong>:获取秒（0-59）<br>快速转化年月日：</strong>toLocaleString()</strong></p><h4 id="时间戳"><a href="#时间戳" class="headerlink" title="时间戳"></a>时间戳</h4><p>是指1970年1月1日00时00分00秒起至现在的毫秒数，确定时间的标识。<br>可以用来倒计时效果，<strong>将来的时间戳-现在的时间戳&#x3D;剩余时间毫秒数</strong><br><strong>getTime()</strong>: 对实例化后的时间对象调用该方法，获得时间对象的时间戳。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> date=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>()<br><span class="hljs-keyword">const</span> <span class="hljs-title class_">Time</span>=date.<span class="hljs-title function_">getTime</span>()<br></code></pre></td></tr></table></figure><p><strong>+new Date()</strong><br>获取时间戳，实际是将字符型时间对象转为数字型时间戳。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(+<span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>(<span class="hljs-string">&#x27;2005-2-19&#x27;</span>))<br></code></pre></td></tr></table></figure><p><strong>Date.now()</strong><br>获取当前时间戳</p><h3 id="DOM节点"><a href="#DOM节点" class="headerlink" title="DOM节点"></a>DOM节点</h3><p>DOM树内的每个内容都是节点，比如元素节点（标签）、属性节点（属性，如src、class等）、文本节点（文本）。<br>以下操作针对元素节点</p><h4 id="查找节点"><a href="#查找节点" class="headerlink" title="查找节点"></a>查找节点</h4><p><strong>父节点查找</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br><span class="hljs-keyword">const</span> clsParent=cls.<span class="hljs-property">parentNode</span><span class="hljs-comment">//return cls`s parentNode</span><br></code></pre></td></tr></table></figure><p><strong>子节点查找</strong><br><strong>childNodes</strong>获得所有子节点，包括文本节点等等<br><strong>children</strong>仅仅获得所有元素节点，返回伪数组</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br><span class="hljs-keyword">const</span> clsChildren=cls.<span class="hljs-property">children</span><span class="hljs-comment">//return cls`s all childrenNode</span><br></code></pre></td></tr></table></figure><p><strong>兄弟节点查找</strong><br><strong>nextElementSibling</strong>下一个兄弟节点<br><strong>previousElementSibling</strong>上一个兄弟节点</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br><span class="hljs-keyword">const</span> clsNextBro=cls.<span class="hljs-property">nextElementSibling</span><span class="hljs-comment">//return cls`s NextBro</span><br><span class="hljs-keyword">const</span> clsPreviousBro=cls.<span class="hljs-property">previousElementSibling</span><span class="hljs-comment">//return cls`s PreviousBro</span><br></code></pre></td></tr></table></figure><h4 id="增加节点"><a href="#增加节点" class="headerlink" title="增加节点"></a>增加节点</h4><p><strong>createElement</strong>创建元素节点<br>**appendChild(ele)**增加子节点<br>**insertBefore(insertEle,endEle)**增加子节点到某子节点前</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-comment">// Create Element</span><br><span class="hljs-keyword">const</span> div=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&#x27;div&#x27;</span>)<br><span class="hljs-keyword">const</span> div1=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&#x27;div&#x27;</span>)<br><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br>div.<span class="hljs-property">innerHTML</span>=<span class="hljs-string">&#x27;I am examp children&#x27;</span><br>div1.<span class="hljs-property">innerHTML</span>=<span class="hljs-string">&#x27;I am examp children1&#x27;</span><br>cls.<span class="hljs-title function_">appendChild</span>(div)<br>cls.<span class="hljs-title function_">insetBefore</span>(div1,div)<span class="hljs-comment">//cls.insetBefore(div1,cls.children[0])</span><br></code></pre></td></tr></table></figure><h4 id="克隆节点"><a href="#克隆节点" class="headerlink" title="克隆节点"></a>克隆节点</h4><p>**Ele.cloneNode(boolean)**会克隆一个与原标签一样的元素，括号内传入true时代表克隆该节点的所有包括后代节点，false时仅克隆该节点标签本身（不包含内容），默认为false</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br><span class="hljs-keyword">const</span> div=cls.<span class="hljs-title function_">cloneNode</span>(<span class="hljs-literal">true</span>)<br>cls.<span class="hljs-title function_">insertBefore</span>(div,cls.<span class="hljs-property">children</span>[<span class="hljs-number">0</span>])<br></code></pre></td></tr></table></figure><h4 id="删除节点"><a href="#删除节点" class="headerlink" title="删除节点"></a>删除节点</h4><p>删除节点需要通过父元素删除</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">cls.<span class="hljs-title function_">removeChild</span>(cls.<span class="hljs-property">children</span>[<span class="hljs-number">0</span>])<br></code></pre></td></tr></table></figure><h3 id="M端事件"><a href="#M端事件" class="headerlink" title="M端事件"></a>M端事件</h3><p>M端即移动端</p><h4 id="touch（触摸事件）"><a href="#touch（触摸事件）" class="headerlink" title="touch（触摸事件）"></a>touch（触摸事件）</h4><p><strong>touchstart</strong>:手指触摸到一个DOM元素时触发<br><strong>touchmove</strong>:手指在一个DOM元素上滑动触发<br><strong>touchend</strong>：手指从一个DOM元素上移开触发</p><h3 id="Swiper"><a href="#Swiper" class="headerlink" title="Swiper"></a>Swiper</h3><p><a href="https://swiperjs.com/" title="Swiper插件首页">Swiper</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;日期对象&quot;&gt;&lt;a href=&quot;#日期对象&quot; class=&quot;headerlink&quot; title=&quot;日期对象&quot;&gt;&lt;/a&gt;日期对象&lt;/h3&gt;&lt;p&gt;用来表示时间的对象&lt;/p&gt;
&lt;h4 id=&quot;实例化&quot;&gt;&lt;a href=&quot;#实例化&quot; class=&quot;headerlink&quot; t</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>前端WebAPIs回顾2</title>
    <link href="http://example.com/2026/03/07/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE2/"/>
    <id>http://example.com/2026/03/07/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE2/</id>
    <published>2026-03-07T08:36:26.000Z</published>
    <updated>2026-03-07T11:42:42.027Z</updated>
    
    <content type="html"><![CDATA[<h3 id="事件监听"><a href="#事件监听" class="headerlink" title="事件监听"></a>事件监听</h3><p>事件是在系统内发生的动作或发生的事情，给DOM元素添加事件监听则是为了在该元素某事件发生时返回响应。</p><h4 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h4><p><em><strong>addEventListener</strong></em>:多次添加事件，不覆盖前面事件，可做冒泡也可做捕获</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">// Object.addEventListener(string,function)</span><br><span class="hljs-title class_">EleObj</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;event-type&#x27;</span>,fn)<br></code></pre></td></tr></table></figure><p>当event-type事件被执行时,执行fn。<br><strong>on</strong>:与addEventListener相比，on适用于单次的事件添加，多次执行on会覆盖前面的事件绑定，只能做冒泡</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">EleObj</span>.<span class="hljs-property">on</span>=fn<br></code></pre></td></tr></table></figure><h3 id="事件类型"><a href="#事件类型" class="headerlink" title="事件类型"></a>事件类型</h3><p><strong>鼠标事件</strong><br><em><strong>click</strong></em>:鼠标点击<br><em><strong>mouseenter</strong></em>:鼠标经过<br><em><strong>mouseleave</strong></em>:鼠标离开</p><p><strong>焦点事件</strong><br><em><strong>focus</strong></em>：获得焦点<br><em><strong>blur</strong></em>:失去焦点</p><p><strong>键盘事件</strong><br><em><strong>Keydown</strong></em>:键盘按下<br><em><strong>Keyup</strong></em>:键盘抬起</p><p><strong>文本事件</strong><br><em><strong>input</strong></em>:用户输入</p><h3 id="事件对象"><a href="#事件对象" class="headerlink" title="事件对象"></a>事件对象</h3><p>在事件绑定的fn的第一个参数是事件对象</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">EleObj</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;event-type&#x27;</span>,<span class="hljs-title function_">fn</span>(e))<br></code></pre></td></tr></table></figure><p>常用属性：type、clientX&#x2F;clientY(获取光标相对于浏览器可见窗口左上角的位置)、offsetX&#x2F;offsetY(获取光标相对于当前DOM元素左上角的位置)、key（用户按下的键盘值）</p><h3 id="环境对象"><a href="#环境对象" class="headerlink" title="环境对象"></a>环境对象</h3><p>指的是函数内部特殊遍历this，代表当前函数运行所处的环境；在普通函数里this指向window,在事件绑定函数中this指向绑定元素，即谁调用指向谁</p><h3 id="回调函数"><a href="#回调函数" class="headerlink" title="回调函数"></a>回调函数</h3><p>当一个函数作为参数传递给另外一个函数时，作为参数的函数为回调函数</p><h3 id="事件流"><a href="#事件流" class="headerlink" title="事件流"></a>事件流</h3><p>事件流指的是事件完整执行过程中的流动路径，分为<strong>捕获阶段</strong>与<strong>冒泡阶段</strong>，捕获就是在寻找执行事件元素的过程（父-&gt;子），冒泡为执行事件绑定回调时会默认执行父元素的绑定的同一事件回调（子-&gt;父）。</p><h4 id="捕获机制"><a href="#捕获机制" class="headerlink" title="捕获机制"></a>捕获机制</h4><p>在绑定事件addEventListener中第三个参数为是否开启捕获机制（true为开启）,在开启后，会依次执行从父到子的已开启的同一事件的回调函数</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-variable constant_">DOM</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;event-type&#x27;</span>,fn,boolen)<br></code></pre></td></tr></table></figure><h4 id="冒泡机制"><a href="#冒泡机制" class="headerlink" title="冒泡机制"></a>冒泡机制</h4><p>在绑定事件addEventListener中第三个参数为是否开启捕获机制（默认false，则为冒泡阶段）</p><h4 id="stopPropagation"><a href="#stopPropagation" class="headerlink" title="stopPropagation()"></a>stopPropagation()</h4><p>该属性为阻止传播，既能阻止捕获也能阻止冒泡。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">e.<span class="hljs-title function_">stopPropagation</span>()<br></code></pre></td></tr></table></figure><h3 id="解绑事件"><a href="#解绑事件" class="headerlink" title="解绑事件"></a>解绑事件</h3><h4 id="on事件解绑"><a href="#on事件解绑" class="headerlink" title="on事件解绑"></a>on事件解绑</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">EleObj</span>.<span class="hljs-property">onEvent</span>=<span class="hljs-literal">null</span><br></code></pre></td></tr></table></figure><h4 id="addEventListener解绑"><a href="#addEventListener解绑" class="headerlink" title="addEventListener解绑"></a>addEventListener解绑</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">EleObj</span>.<span class="hljs-title function_">removeEventListener</span>(<span class="hljs-string">&#x27;event-type&#x27;</span>,fn)<br></code></pre></td></tr></table></figure><h3 id="事件委托"><a href="#事件委托" class="headerlink" title="事件委托"></a>事件委托</h3><p>同时给多个事件进行事件绑定，可以减少注册次数，提高程序性能。<br><strong>原理</strong>：利用冒泡特点，直接给父元素注册事件，当触发子元素时会冒泡到父元素身上，从而触发父元素事件。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><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><code class="hljs javascript"><span class="hljs-keyword">const</span> parent=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.parentEle&#x27;</span>)<br>parent.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;event-type&#x27;</span>,<span class="hljs-title function_">fn</span>(<span class="hljs-params">e</span>)&#123;<br>    <span class="hljs-keyword">if</span>(e.<span class="hljs-property">target</span>.<span class="hljs-property">tagName</span>=<span class="hljs-string">&#x27;tagName&#x27;</span>) &#123;e.<span class="hljs-property">target</span>.<span class="hljs-property">style</span>.<span class="hljs-property">color</span>=<span class="hljs-string">&#x27;red&#x27;</span>&#125;<br>&#125;)<br></code></pre></td></tr></table></figure><h3 id="阻止默认行为"><a href="#阻止默认行为" class="headerlink" title="阻止默认行为"></a>阻止默认行为</h3><p>在某些情况下需要阻止默认行为的发生，比如在点击链接后我希望先进行弹窗后跳转，此时我可以先阻止链接的默认跳转。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">e.<span class="hljs-title function_">preventDefault</span>()<br></code></pre></td></tr></table></figure><h3 id="其他事件"><a href="#其他事件" class="headerlink" title="其他事件"></a>其他事件</h3><h4 id="页面加载事件"><a href="#页面加载事件" class="headerlink" title="页面加载事件"></a>页面加载事件</h4><p>加载外部资源完毕时触发的事件，在有些页面资源加载缓慢时，我们的js会无法获取未加载的页面元素导致报错，因此我们需要等待页面加载。<br><strong>load</strong>:等待页面所有资源（html、css、img等）完全加载后执行</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-variable language_">window</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;load&#x27;</span>,fn)<br></code></pre></td></tr></table></figure><p><strong>DOMContentLoaded</strong>:当初始html被完全加载解析后该事件触发</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-variable language_">document</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;DOMContentLoaded&#x27;</span>,fn)<br></code></pre></td></tr></table></figure><h4 id="元素滚动事件"><a href="#元素滚动事件" class="headerlink" title="元素滚动事件"></a>元素滚动事件</h4><p>滚动条在滚动时持续触发的事件。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">EleObj</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;scroll&#x27;</span>,fn)<br></code></pre></td></tr></table></figure><p>有一个需求：当我滚动到某一位置后执行某些操作<br><strong>scrollLeft</strong>:往左卷去的距离<br><strong>scrollTop</strong>:往上卷去的距离</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-title class_">EleObj</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;scroll&#x27;</span>，<span class="hljs-title function_">fn</span>(<span class="hljs-params"></span>)&#123;<br>    <span class="hljs-keyword">if</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">scrollTop</span>&gt;=num) ....<span class="hljs-comment">//opt</span><br>&#125;)<br></code></pre></td></tr></table></figure><p>在获取html时使用<strong>document.documentElement</strong></p><h4 id="页面尺寸事件"><a href="#页面尺寸事件" class="headerlink" title="页面尺寸事件"></a>页面尺寸事件</h4><p>当页面尺寸发生变化时使用<br><strong>clientWindth</strong>:获取元素可见宽（不包含边框、margin、滚动条）<br><strong>clientHeight</strong>：获取元素可见高（同上）</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-title class_">EleObj</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;resize&#x27;</span>，fn)<br></code></pre></td></tr></table></figure><p>元素尺寸<br><strong>offsetWidth</strong>:获取元素宽（包括边框、margin）<br><strong>offsetHeigth</strong>获取元素高（同上）<br>元素位置<br><strong>offsetLeft</strong>:获取元素位于父元素左边的距离（只读）<br><strong>offsetTop</strong>：获取元素位于父元素顶部的距离（只读）</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;事件监听&quot;&gt;&lt;a href=&quot;#事件监听&quot; class=&quot;headerlink&quot; title=&quot;事件监听&quot;&gt;&lt;/a&gt;事件监听&lt;/h3&gt;&lt;p&gt;事件是在系统内发生的动作或发生的事情，给DOM元素添加事件监听则是为了在该元素某事件发生时返回响应。&lt;/p&gt;
&lt;h4 id=</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>前端WebAPIs回顾1</title>
    <link href="http://example.com/2026/03/06/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE1/"/>
    <id>http://example.com/2026/03/06/%E5%89%8D%E7%AB%AFWebAPIs%E5%9B%9E%E9%A1%BE1/</id>
    <published>2026-03-06T09:29:05.000Z</published>
    <updated>2026-03-06T11:48:30.353Z</updated>
    
    <content type="html"><![CDATA[<h3 id="DOM树与DOM对象"><a href="#DOM树与DOM对象" class="headerlink" title="DOM树与DOM对象"></a>DOM树与DOM对象</h3><p><em><strong>DOM(文档对象模型)<em><strong>提供操作网页内容的功能，</strong></em>DOM树</strong></em>是将HTML文档以树状结构直观表现出来，<em><strong>DOM对象</strong></em>是HTML标签对应的JS对象，以此我们能使用JS对HTML的标签进行操作。</p><h3 id="获取DOM对象"><a href="#获取DOM对象" class="headerlink" title="获取DOM对象"></a>获取DOM对象</h3><p>根据CSS选择器获取DOM对象</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs html"><span class="hljs-comment">&lt;!-- Example HTML --&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;cls&quot;</span>&gt;</span>example div1<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;cls&quot;</span>&gt;</span>example div2<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&#x27;P&#x27;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span><br><span class="language-javascript">        <span class="hljs-comment">// ADD JS</span></span><br><span class="language-javascript">    </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span><br></code></pre></td></tr></table></figure><h4 id="querySelector-‘css选择器’"><a href="#querySelector-‘css选择器’" class="headerlink" title="querySelector(‘css选择器’)"></a>querySelector(‘css选择器’)</h4><p>选择匹配的第一个元素</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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><code class="hljs javascript"><span class="hljs-comment">// GET FIRST ELE</span><br><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;div&#x27;</span>)<br><span class="hljs-keyword">const</span> cls2=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br><span class="hljs-keyword">const</span> P=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;#P&#x27;</span>)<br>cls.<span class="hljs-property">style</span>.<span class="hljs-property">color</span>=<span class="hljs-string">&#x27;red&#x27;</span><span class="hljs-comment">//Modify object properties</span><br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">dir</span>(cls)<span class="hljs-comment">// return NodeObj</span><br></code></pre></td></tr></table></figure><h4 id="querySelectorAll-‘css选择器’"><a href="#querySelectorAll-‘css选择器’" class="headerlink" title="querySelectorAll(‘css选择器’)"></a>querySelectorAll(‘css选择器’)</h4><p>选择多个匹配的元素</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-comment">//GET ALL ELE</span><br><span class="hljs-keyword">const</span> acls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelectorAll</span>(<span class="hljs-string">&#x27;div&#x27;</span>)<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">dir</span>(acls)<span class="hljs-comment">// return NodeList</span><br></code></pre></td></tr></table></figure><h3 id="操作元素内容"><a href="#操作元素内容" class="headerlink" title="操作元素内容"></a>操作元素内容</h3><p>使用JS操作HTML标签内的内容</p><h4 id="NodeObj-innerText"><a href="#NodeObj-innerText" class="headerlink" title="NodeObj.innerText"></a>NodeObj.innerText</h4><p>修改标签内的内容，不解析内容里的标签</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-comment">//GET ELE</span><br><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br><span class="hljs-comment">//GET ELE`s CONTENT</span><br><span class="hljs-keyword">const</span> clsContent=cls.<span class="hljs-property">innerText</span><br><span class="hljs-comment">//Modify ELE`s CONTENT</span><br>cls.<span class="hljs-property">innerText</span>=<span class="hljs-string">&#x27;&lt;strong&gt;Modified div&lt;/strong&gt;&#x27;</span><br><span class="hljs-comment">//show &lt;strong&gt;Modified div&lt;/strong&gt;</span><br></code></pre></td></tr></table></figure><h4 id="NodeObj-innerHTML"><a href="#NodeObj-innerHTML" class="headerlink" title="NodeObj.innerHTML"></a>NodeObj.innerHTML</h4><p>可解析内容里的标签</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-comment">//GET ELE</span><br><span class="hljs-keyword">const</span> cls=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;.cls&#x27;</span>)<br><span class="hljs-comment">//GET ELE`s CONTENT</span><br><span class="hljs-keyword">const</span> clsContent=cls.<span class="hljs-property">innerText</span><br><span class="hljs-comment">//Modify ELE`s CONTENT</span><br>cls.<span class="hljs-property">innerText</span>=<span class="hljs-string">&#x27;&lt;strong&gt;Modified div&lt;/strong&gt;&#x27;</span><br><span class="hljs-comment">//show Modified div</span><br></code></pre></td></tr></table></figure><h3 id="操作元素属性"><a href="#操作元素属性" class="headerlink" title="操作元素属性"></a>操作元素属性</h3><p>通过JS设置或修改HTML标签属性</p><h4 id="操作常用属性"><a href="#操作常用属性" class="headerlink" title="操作常用属性"></a>操作常用属性</h4><p>常用属性包括：href、title、src,语法如下</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><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><code class="hljs javascript"><span class="hljs-comment">// GET ELE</span><br>...<br><span class="hljs-comment">// Modify Prop</span><br>ele.<span class="hljs-property">prop</span>=newValue<br></code></pre></td></tr></table></figure><h4 id="操作样式属性"><a href="#操作样式属性" class="headerlink" title="操作样式属性"></a>操作样式属性</h4><h5 id="style操作"><a href="#style操作" class="headerlink" title="style操作"></a>style操作</h5><figure class="highlight javascript"><table><tr><td class="gutter"><pre><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><code class="hljs javascript"><span class="hljs-comment">// GET ELE</span><br>...<br><span class="hljs-comment">// Modify Style`s Prop</span><br>ele.<span class="hljs-property">style</span>.<span class="hljs-property">prop</span>=newValue<br></code></pre></td></tr></table></figure><h5 id="className操作"><a href="#className操作" class="headerlink" title="className操作"></a>className操作</h5><p>样式复用时，可使用className操作</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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><code class="hljs javascript"><span class="hljs-comment">// GET ELE</span><br>...<br><span class="hljs-comment">//ADD className</span><br>ele.<span class="hljs-property">className</span>=<span class="hljs-string">&#x27;cls&#x27;</span><br><span class="hljs-comment">// ADD more className</span><br>ele.<span class="hljs-property">className</span>=<span class="hljs-string">&#x27;cls cls2&#x27;</span><br></code></pre></td></tr></table></figure><h5 id="classList操作"><a href="#classList操作" class="headerlink" title="classList操作"></a>classList操作</h5><p>className操作时会覆盖原先样式，为避免原样式被覆盖，引入classList,即存储多个样式类名，可使用add、remove、toggle语句对样式进行追加、移除、切换操作。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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><code class="hljs javascript"><span class="hljs-comment">// ADD CLASSNAME</span><br>ele.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;className&#x27;</span>)<br><span class="hljs-comment">// REMOVE CLASSNAME</span><br>ele.<span class="hljs-property">classList</span>.<span class="hljs-title function_">remove</span>(<span class="hljs-string">&#x27;className&#x27;</span>)<br><span class="hljs-comment">// TOGGLE CLASSNAME</span><br>ele.<span class="hljs-property">classList</span>.<span class="hljs-title function_">toggle</span>(<span class="hljs-string">&#x27;className&#x27;</span>)<br></code></pre></td></tr></table></figure><h3 id="操作表单属性"><a href="#操作表单属性" class="headerlink" title="操作表单属性"></a>操作表单属性</h3><p>对表单（input、button）的属性进行操作，和之前几种操作一样，表单属性有value、type、disabled、checked、selected等</p><h3 id="自定义属性"><a href="#自定义属性" class="headerlink" title="自定义属性"></a>自定义属性</h3><p>上述提到的属性如width、value等为标准属性；除标准属性外我们还能使用自定义属性(data-…),使用dataset属性获取自定义属性，多个自定义属性时dataset返回DOM对象</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">data-prop</span>=<span class="hljs-string">&#x27;value&#x27;</span>&gt;</span>example div<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span><br><span class="language-javascript">        <span class="hljs-keyword">const</span> data=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;div&#x27;</span>)</span><br><span class="language-javascript">        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(data.<span class="hljs-property">dataset</span>)<span class="hljs-comment">//return value</span></span><br><span class="language-javascript">    </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span><br></code></pre></td></tr></table></figure><h3 id="定时器"><a href="#定时器" class="headerlink" title="定时器"></a>定时器</h3><p><em><strong>setInterval(fn,wait)</strong></em>:定时wait执行fn,返回值为定时器id<br><em><strong>clearInterval(id)</strong></em>:id为定时器id,关闭定时器</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;DOM树与DOM对象&quot;&gt;&lt;a href=&quot;#DOM树与DOM对象&quot; class=&quot;headerlink&quot; title=&quot;DOM树与DOM对象&quot;&gt;&lt;/a&gt;DOM树与DOM对象&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;DOM(文档对象模型)&lt;em&gt;&lt;strong&gt;提供操</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>防抖</title>
    <link href="http://example.com/2026/03/05/%E9%98%B2%E6%8A%96/"/>
    <id>http://example.com/2026/03/05/%E9%98%B2%E6%8A%96/</id>
    <published>2026-03-05T11:08:54.000Z</published>
    <updated>2026-03-05T11:22:20.026Z</updated>
    
    <content type="html"><![CDATA[<h3 id="防抖原理"><a href="#防抖原理" class="headerlink" title="防抖原理"></a>防抖原理</h3><p>防抖是一种延迟执行的技术。它的原理是，当事件被触发时，延迟执行事件处理函数，并且在延迟时间内如果事件再次被触发，则重新开始计时。只有当事件在指定的时间内没有再次触发，事件处理函数才会执行。这样可以避免某些高频率的操作被频繁触发，从而提高性能。</p><h3 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">debounce</span>(<span class="hljs-params">func,wait</span>)&#123;<br>    <span class="hljs-comment">//设置初始定时器标志为null</span><br>    <span class="hljs-keyword">let</span> timer=<span class="hljs-literal">null</span><br>    <span class="hljs-keyword">return</span> <span class="hljs-function">(<span class="hljs-params">args</span>)=&gt;</span>&#123;<br>        <span class="hljs-built_in">clearTimeout</span>(timer)<span class="hljs-comment">//执行前清理存在的定时器</span><br>        timer=<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">()=&gt;</span><span class="hljs-title function_">func</span>(...args),wait)<span class="hljs-comment">//启动新定时器</span><br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;防抖原理&quot;&gt;&lt;a href=&quot;#防抖原理&quot; class=&quot;headerlink&quot; title=&quot;防抖原理&quot;&gt;&lt;/a&gt;防抖原理&lt;/h3&gt;&lt;p&gt;防抖是一种延迟执行的技术。它的原理是，当事件被触发时，延迟执行事件处理函数，并且在延迟时间内如果事件再次被触发，则重新开始计</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript原理题" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript%E5%8E%9F%E7%90%86%E9%A2%98/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>前端JS基础回顾2</title>
    <link href="http://example.com/2026/03/05/%E5%89%8D%E7%AB%AFJS%E5%9F%BA%E7%A1%80%E5%9B%9E%E9%A1%BE2/"/>
    <id>http://example.com/2026/03/05/%E5%89%8D%E7%AB%AFJS%E5%9F%BA%E7%A1%80%E5%9B%9E%E9%A1%BE2/</id>
    <published>2026-03-05T10:10:46.000Z</published>
    <updated>2026-03-05T12:00:20.289Z</updated>
    
    <content type="html"><![CDATA[<h3 id="三元运算符"><a href="#三元运算符" class="headerlink" title="三元运算符"></a>三元运算符</h3><p>表达式?A:B,即当表达式为true时执行A,反之执行B</p><h3 id="循环退出机制"><a href="#循环退出机制" class="headerlink" title="循环退出机制"></a>循环退出机制</h3><p><em><strong>continue</strong></em>:结束当前循环，进入下一循环<br><em><strong>break</strong></em>:结束循环</p><h3 id="数组删除"><a href="#数组删除" class="headerlink" title="数组删除"></a>数组删除</h3><p><em><strong>pop()</strong></em>:删除最后一个元素<br><em><strong>shift()</strong></em>:删除第一个元素<br><em><strong>splice(index,number)</strong></em>:删除下标为index开始的number个元素</p><h3 id="冒泡排序"><a href="#冒泡排序" class="headerlink" title="冒泡排序"></a>冒泡排序</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">sort</span>(<span class="hljs-params">arr</span>)&#123;<br>    <span class="hljs-keyword">let</span> len=arr.<span class="hljs-property">length</span><br>    <span class="hljs-keyword">let</span> newArr=[...arr]<br>    <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i=<span class="hljs-number">0</span>;i&lt;len-<span class="hljs-number">1</span>;i++)&#123;<br>        <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> j=<span class="hljs-number">0</span>;j&lt;len-<span class="hljs-number">1</span>-i;j++)&#123;<br>        <span class="hljs-keyword">if</span>(newArr[j]&gt;newArr[j+<span class="hljs-number">1</span>])&#123;<br>            <span class="hljs-keyword">let</span> temp=newArr[j]<br>            newArr[j]=newArr[j+<span class="hljs-number">1</span>]<br>            newArr[j+<span class="hljs-number">1</span>]=temp<br>        &#125;<br>        &#125;<br>    &#125;<br>    <span class="hljs-keyword">return</span> newArr<br>&#125;<br></code></pre></td></tr></table></figure><h3 id="对象的遍历"><a href="#对象的遍历" class="headerlink" title="对象的遍历"></a>对象的遍历</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">objForEach</span>(<span class="hljs-params">obj</span>)&#123;<br>    <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> k <span class="hljs-keyword">in</span> obj)&#123;<br>        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(obj[k])<br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><h3 id="字符删除"><a href="#字符删除" class="headerlink" title="字符删除"></a>字符删除</h3><p>对仅有abc输入的字符有如下要求：删除b字符以及连续的ac</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">removeChars</span>(<span class="hljs-params">input</span>) &#123;<br>  <span class="hljs-keyword">const</span> output=[]<br>  <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i=<span class="hljs-number">0</span>;i&lt;input.<span class="hljs-property">length</span>;i++)&#123;<br>    <span class="hljs-keyword">if</span>(output.<span class="hljs-property">length</span>&amp;&amp;input[i]===<span class="hljs-string">&#x27;c&#x27;</span>&amp;&amp;output[output.<span class="hljs-property">length</span>-<span class="hljs-number">1</span>]===<span class="hljs-string">&#x27;a&#x27;</span>)&#123;<br>        output.<span class="hljs-title function_">pop</span>()<br>    &#125;<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(input[i]!==<span class="hljs-string">&#x27;b&#x27;</span>)&#123;<br>        output.<span class="hljs-title function_">push</span>(input[i])<br>    &#125;<br>  &#125;<br>  <span class="hljs-keyword">return</span> output.<span class="hljs-title function_">join</span>(<span class="hljs-string">&#x27;&#x27;</span>)<br>&#125;<br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;三元运算符&quot;&gt;&lt;a href=&quot;#三元运算符&quot; class=&quot;headerlink&quot; title=&quot;三元运算符&quot;&gt;&lt;/a&gt;三元运算符&lt;/h3&gt;&lt;p&gt;表达式?A:B,即当表达式为true时执行A,反之执行B&lt;/p&gt;
&lt;h3 id=&quot;循环退出机制&quot;&gt;&lt;a href=&quot;</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
  <entry>
    <title>不定量参数柯里化处理</title>
    <link href="http://example.com/2026/03/05/%E4%B8%8D%E5%AE%9A%E9%87%8F%E5%8F%82%E6%95%B0%E6%9F%AF%E9%87%8C%E5%8C%96%E5%A4%84%E7%90%86/"/>
    <id>http://example.com/2026/03/05/%E4%B8%8D%E5%AE%9A%E9%87%8F%E5%8F%82%E6%95%B0%E6%9F%AF%E9%87%8C%E5%8C%96%E5%A4%84%E7%90%86/</id>
    <published>2026-03-05T02:34:04.000Z</published>
    <updated>2026-03-05T03:16:09.314Z</updated>
    
    <content type="html"><![CDATA[<h2 id="柯里化（currying）"><a href="#柯里化（currying）" class="headerlink" title="柯里化（currying）"></a>柯里化（currying）</h2><p>要理解柯里化，最直观的方式是先从一个非正式的定义入手，之后再将其拓展适配到各种不同的领域。首先，我们需要建立一些符号表示：符号X→Y表示所有从X到Y的函数。若f是这样一个函数，我们记作 f:X→Y。而 X×Y则表示 X和Y中元素的有序对集合，也就是X和Y的笛卡尔积。这里的 X和Y既可以是集合，也可以是类型，或是其他类型的对象。<br>给定一个函数<br><em><strong>f:(X×Y)→Z</strong></em><br>柯里化会构造出一个新函数<br><em><strong>g:X→(Y→Z)</strong></em><br>也就是说，g接收一个类型为 X的参数，并返回一个类型为Y→Z的函数。它的定义如下：<br><em><strong>g(x)(y)&#x3D;f(x,y)</strong></em><br>其中 x是类型 X的元素，y是类型Y的元素。我们也可以记作:<br><em><strong>curry(f)&#x3D;g</strong></em></p><h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">curry</span>(<span class="hljs-params">fn</span>)&#123;<br>    <span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">curried</span>(<span class="hljs-params">...args</span>)&#123;<br>        <span class="hljs-comment">//当参数数目与原函数参数数目一致时，将参数传入原函数执行</span><br>        <span class="hljs-keyword">if</span>(args.<span class="hljs-property">length</span>&gt;=fn.<span class="hljs-property">length</span>) <span class="hljs-keyword">return</span> <span class="hljs-title function_">fn</span>(...args) <br>        <span class="hljs-comment">//否则迭代执行，并传入原参数与新参数作为下一步迭代的参数</span><br>        <span class="hljs-keyword">return</span> <span class="hljs-function">(<span class="hljs-params">...args2</span>)=&gt;</span> <span class="hljs-title function_">curried</span>(...args,...args2)<br>    &#125;<br>&#125;<br></code></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>对于任何函数，使用curry函数后都能实现柯里化,举例如下：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><code class="hljs javascript"><span class="hljs-keyword">const</span> <span class="hljs-title function_">sum</span>=(<span class="hljs-params">a,b,c</span>)=&gt;&#123;<br>    <span class="hljs-keyword">return</span> a+b+c<br>&#125;<br><span class="hljs-keyword">const</span> curriedSum=<span class="hljs-title function_">curry</span>(sum)<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title function_">curriedSum</span>(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>)===<span class="hljs-title function_">curriedSum</span>(<span class="hljs-number">1</span>)(<span class="hljs-number">2</span>,<span class="hljs-number">3</span>),<br><span class="hljs-title function_">curriedSum</span>(<span class="hljs-number">1</span>)(<span class="hljs-number">2</span>,<span class="hljs-number">3</span>)===<span class="hljs-title function_">curriedSum</span>(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>)(<span class="hljs-number">3</span>),<br><span class="hljs-title function_">curriedSum</span>(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>)===<span class="hljs-title function_">curriedSum</span>(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>)(<span class="hljs-number">3</span>))<span class="hljs-comment">//true,true,true</span><br></code></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;柯里化（currying）&quot;&gt;&lt;a href=&quot;#柯里化（currying）&quot; class=&quot;headerlink&quot; title=&quot;柯里化（currying）&quot;&gt;&lt;/a&gt;柯里化（currying）&lt;/h2&gt;&lt;p&gt;要理解柯里化，最直观的方式是先从一个非正式的定义入手</summary>
      
    
    
    
    <category term="前端开发" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript原理题" scheme="http://example.com/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/Javascript%E5%8E%9F%E7%90%86%E9%A2%98/"/>
    
    
    <category term="前端开发" scheme="http://example.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="Javascript" scheme="http://example.com/tags/Javascript/"/>
    
  </entry>
  
</feed>
