<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Effective Python on KbWen Blog</title>
    <link>https://www.kbwen.com/tags/effective-python/</link>
    <description>KbWen 的個人技術部落格，分享 Python、機器學習、深度學習、資料工程與 AI 開發的學習筆記與實作心得。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <image>
      <url>https://www.kbwen.com/images/og-default.png</url>
      <title>KbWen Blog</title>
      <link>https://www.kbwen.com/</link>
    </image>
    
    <lastBuildDate>Fri, 26 Nov 2021 16:57:07 +0800</lastBuildDate><atom:link href="https://www.kbwen.com/tags/effective-python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Python Chunks</title>
      <link>https://www.kbwen.com/python-chunks/</link>
      <pubDate>Fri, 26 Nov 2021 16:57:07 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-chunks/</guid>
      <description>Python 切割 list 成多個 chunk 的四種方法：使用 yield generator、列表推導式、itertools.islice 處理任意 iterable，以及 numpy.array_split。</description>
      <content:encoded><![CDATA[<p>當我們要把list分成好幾個chunk時的幾種做法</p>
<h2 id="yield">yield</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">chunks1</span><span class="p">(</span><span class="n">input_list</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">input_list</span><span class="p">),</span> <span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">yield</span> <span class="n">input_list</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span> <span class="o">+</span> <span class="n">n</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">input_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">15</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">chunks1</span><span class="p">(</span><span class="n">input_list</span><span class="p">,</span> <span class="mi">4</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14]]</span>
</span></span></code></pre></div><h2 id="一行for迴圈">一行for迴圈</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">input_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">15</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="n">output_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">input_list</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span> <span class="n">n</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">input_list</span><span class="p">),</span> <span class="n">n</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">output_list</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]</span>
</span></span></code></pre></div><h2 id="iterable">iterable</h2>
<p>針對任何iterable</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">islice</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">chunks2</span><span class="p">(</span><span class="n">input_iter</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">input_list</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">input_iter</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">input_list</span><span class="p">,</span> <span class="n">n</span><span class="p">)),</span> <span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">input_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">15</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">chunks2</span><span class="p">(</span><span class="n">input_list</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14)]</span>
</span></span></code></pre></div><h2 id="numpy">Numpy</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">input_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">15</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl"><span class="n">np</span><span class="o">.</span><span class="n">array_split</span><span class="p">(</span><span class="n">input_list</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## [array([0, 1, 2]),</span>
</span></span><span class="line"><span class="cl"><span class="c1">## array([3, 4, 5]),</span>
</span></span><span class="line"><span class="cl"><span class="c1">## array([6, 7, 8]),</span>
</span></span><span class="line"><span class="cl"><span class="c1">## array([ 9, 10, 11]),</span>
</span></span><span class="line"><span class="cl"><span class="c1">## array([12, 13, 14])]</span>
</span></span></code></pre></div><p>上述幾種簡單的方式皆可達成</p>
<p>幾個注意的地方</p>
<ol>
<li>針對的輸入類型是哪種，只能list還是也可以接受其他輸入格式?</li>
<li>每個例子都有用到n，n所控制的數字是甚麼?</li>
<li>一些特例處理</li>
</ol>
<blockquote>
<p>如果今天輸入檔案太大必須分批處理，試試panda的read_csv()</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Python Comments</title>
      <link>https://www.kbwen.com/python-comments/</link>
      <pubDate>Mon, 04 May 2020 15:47:56 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-comments/</guid>
      <description>Python 程式碼註釋的最佳實踐：單行 # 註釋、多行 # 和三引號 &amp;#34;&amp;#34;&amp;#34; 用法，以及如何寫出有效的程式碼文件，遵循 PEP8 規範。</description>
      <content:encoded><![CDATA[<p>開發時加入註釋有助於描述思考過程，並幫助自己和其他人了解意圖，可以更輕鬆地發現錯誤、改進程式，以及在其他地方做更多應用。</p>
<h2 id="單行註釋">單行註釋</h2>
<p>加入註釋以 <code>#</code> 開頭，</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># defining the start code</span>
</span></span><span class="line"><span class="cl"><span class="n">startCode</span> <span class="o">=</span> <span class="mi">50</span>
</span></span></code></pre></div><p>也可加在程式碼後方，會被忽略，</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">startCode</span> <span class="o">=</span> <span class="mi">50</span>    <span class="c1"># defining the start code</span>
</span></span></code></pre></div><blockquote>
<p>注意不要加入無用的描述，</p>
<p>如同變數命名時不要取沒意義的名稱。</p>
</blockquote>
<h2 id="多行註釋">多行註釋</h2>
<p>當要註釋的內容很多，或是撰寫文件、功能之類的，可以使用這種方式。</p>
<p><a href="https://www.python.org/dev/peps/pep-0008/#maximum-line-length">PEP8</a>中建議單行不要超過79個字，一般情況則是會照公司或是團隊的開發習慣決定。</p>
<p>多行<code>#</code>開頭，</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># PythonComments version 1.0.3</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -a (--all): show all features</span>
</span></span><span class="line"><span class="cl"><span class="c1"># -h (--help): show the help</span>
</span></span><span class="line"><span class="cl"><span class="c1"># .....</span>
</span></span></code></pre></div><p>或是用<code>&quot;&quot;&quot;</code> 包住</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">PythonComments version 1.0.3
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">-a (--all): show all features
</span></span></span><span class="line"><span class="cl"><span class="s2">-h (--help): show the help
</span></span></span><span class="line"><span class="cl"><span class="s2">.....
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span>
</span></span></code></pre></div><h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/python-pdb/">Python pdb</a></li>
<li><a href="/python-iterable/">Python Iterable</a></li>
<li><a href="/python-context-manager/">Python Context Manager</a></li>
<li><a href="/python-lambda/">Python Lambda</a></li>
<li><a href="/python-f-string/">Python f-string</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Python f-string</title>
      <link>https://www.kbwen.com/python-f-string/</link>
      <pubDate>Fri, 24 Apr 2020 20:03:01 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-f-string/</guid>
      <description>Python 3.6&#43; f-string 詳解：與 %-formatting、str.format() 的語法比較，以及 f-string 的進階操作，包含運算式、方法呼叫和格式化字串。</description>
      <content:encoded><![CDATA[<p>python 3.6後，字串多了個處理方法</p>
<p><a href="https://www.python.org/dev/peps/pep-0498/">PEP 498</a> &ndash; Literal String Interpolation</p>
<p>下面直接用例子來比較f-string和我們之前常用的 %-formatting、str.format()語法不同之處</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="c1"># %-formatting</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;Hello&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">number1</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">number2</span> <span class="o">=</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="si">%s</span><span class="s2">, test numbers are </span><span class="si">%s</span><span class="s2"> and </span><span class="si">%s</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">number1</span><span class="p">,</span> <span class="n">number2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">Hello</span><span class="p">,</span> <span class="n">test</span> <span class="n">numbers</span> <span class="n">are</span> <span class="mi">10</span> <span class="ow">and</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="c1"># str.format()</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;Hello&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">number1</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">number2</span> <span class="o">=</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="si">{}</span><span class="s2">, test numbers are </span><span class="si">{}</span><span class="s2"> and </span><span class="si">{}</span><span class="s2">&#34;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">number1</span><span class="p">,</span> <span class="n">number2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">Hello</span><span class="p">,</span> <span class="n">test</span> <span class="n">numbers</span> <span class="n">are</span> <span class="mi">10</span> <span class="ow">and</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="si">{0}</span><span class="s2">, test numbers are </span><span class="si">{2}</span><span class="s2"> and </span><span class="si">{1}</span><span class="s2">&#34;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">number1</span><span class="p">,</span> <span class="n">number2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">Hello</span><span class="p">,</span> <span class="n">test</span> <span class="n">numbers</span> <span class="n">are</span> <span class="mi">20</span> <span class="ow">and</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="c1"># f-string</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;Hello&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">number1</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">number2</span> <span class="o">=</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">text</span><span class="si">}</span><span class="s2">, test numbers are </span><span class="si">{</span><span class="n">number1</span><span class="si">}</span><span class="s2"> and </span><span class="si">{</span><span class="n">number2</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Hello</span><span class="p">,</span> <span class="n">test</span> <span class="n">numbers</span> <span class="n">are</span> <span class="mi">10</span> <span class="ow">and</span> <span class="mi">20</span>
</span></span></code></pre></div><p>F-string 看起來更python了，也解決了之前會遇到的問題；例如使用 %時的參數限制等等。</p>
<p>在變數變多的情況下更易讀也易改。</p>
<h2 id="嘗試做更多操作">嘗試做更多操作</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="mi">3</span> <span class="o">+</span> <span class="mi">8</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s1">&#39;11&#39;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">text</span> <span class="o">=</span> <span class="s2">&#34;Literal String Interpolation&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s1">&#39;LITERAL STRING INTERPOLATION&#39;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="mi">1</span><span class="o">/</span><span class="mi">3</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="s1">&#39;0.33&#39;</span>
</span></span></code></pre></div><p>也可以放入lambda表達式。</p>
<p>有機會多使用看看吧！</p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/python-pdb/">Python pdb</a></li>
<li><a href="/python-iterable/">Python Iterable</a></li>
<li><a href="/python-context-manager/">Python Context Manager</a></li>
<li><a href="/python-lambda/">Python Lambda</a></li>
<li><a href="/python-comments/">Python Comments</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Python lambda</title>
      <link>https://www.kbwen.com/python-lambda/</link>
      <pubDate>Thu, 23 Apr 2020 18:51:14 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-lambda/</guid>
      <description>Python lambda 匿名函式完整介紹：基本語法、與一般 def 函式的比較，以及什麼情況適合使用 lambda，包含 sorted、map、filter 的應用場景。</description>
      <content:encoded><![CDATA[<h2 id="lambda-function匿名函式">lambda function（匿名函式）</h2>
<h3 id="基本語法">基本語法</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">lambda arg1, arg2,... : expression
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">fun</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">fun</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&gt;&gt;&gt; 6
</span></span></code></pre></div><p>lambda function可以看做是一個簡單的function，</p>
<p>有好幾個輸入，但是只能有一個運算式。</p>
<h2 id="適合的使用時機">適合的使用時機</h2>
<p>有幾個時機適合使用lambda function</p>
<ul>
<li><strong>無法重複使用</strong>：&ldquo;don&rsquo;t repeat yourself&rdquo;，因此若知道這個功能簡單且不會在類似的地方重複使用，那這是個好時機。</li>
<li><strong>不想去想變數名稱</strong>：在實作功能時，會希望變數名稱就能知道這個東西可能會是甚麼，而不是只有x,y,i,j等等看不出意義或是會搞混的名稱；要注意情況，大多還是乖乖想名字吧。</li>
</ul>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/python-pdb/">Python pdb</a></li>
<li><a href="/python-iterable/">Python Iterable</a></li>
<li><a href="/python-context-manager/">Python Context Manager</a></li>
<li><a href="/python-f-string/">Python f-string</a></li>
<li><a href="/python-comments/">Python Comments</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Python context manager</title>
      <link>https://www.kbwen.com/python-context-manager/</link>
      <pubDate>Tue, 14 Apr 2020 17:05:33 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-context-manager/</guid>
      <description>學習 Python with 語句與 context manager：如何用 __enter__ 和 __exit__ 管理資源，確保文件、連線等資源被正確釋放，避免資源洩漏。</description>
      <content:encoded><![CDATA[<p>內文管理器</p>
<p>python <code>with</code> 語句，能讓我們更輕易的實行資源管理，例如數據、開啟文件，或是各種會lock的行為。</p>
<p>要保證處理完相關事情，資源有被釋放。</p>
<p>簡單行為中，我們會這樣去開啟文件</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">test_file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;test.txt&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">test_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;line one&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">finally</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">test_file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span></code></pre></div><p>上述行為除了是非慣用以外，</p>
<p>若try-finally裡面邏輯複雜，還面臨著維護的困難。</p>
<p>這裡有著使用 <code>with</code> 的簡單用法</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;test.txt&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">test_file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">test_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;line one&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>上述程式碼中，當 <code>with</code> 內的語句執行結束後，會自動關閉該資源，且變數test_file也會結束。</p>
<h2 id="實現context-manager">實現context manager</h2>
<p>若想實現 context manager的功能，則要定義好<code>__enter__</code> 與 <code>__exit__</code> 兩個函式，分別管理<code>with</code>的進入行為和結束行為。</p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/python-pdb/">Python pdb</a></li>
<li><a href="/python-iterable/">Python Iterable</a></li>
<li><a href="/python-lambda/">Python Lambda</a></li>
<li><a href="/python-f-string/">Python f-string</a></li>
<li><a href="/python-comments/">Python Comments</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Python Iterable</title>
      <link>https://www.kbwen.com/python-iterable/</link>
      <pubDate>Sat, 11 Apr 2020 16:08:13 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-iterable/</guid>
      <description>深入了解 Python 中 Iterable 與 Iterator 的差異：什麼物件可以被迭代、iter() 和 next() 的運作方式，以及 Generator 的前置概念。</description>
      <content:encoded><![CDATA[<p>要了解python 哪些對象是可以迭代的，</p>
<p>可以先了解兩個相似的名詞</p>
<ol>
<li>Iterable</li>
<li>Iterator</li>
</ol>
<h2 id="iterable">Iterable</h2>
<p>可以被迭代、遍歷(loop, iteration)的物件對象可以被稱為iterable，</p>
<p>從官方文件得知，要實現<code>__iter__</code>或是<code>__getitem__</code>的方法即可。</p>
<p>包含了常見的list、tuple、set、dict、str、range，</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="nb">dir</span><span class="p">(</span><span class="nb">str</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="s1">&#39;__add__&#39;</span><span class="p">,</span> <span class="s1">&#39;__class__&#39;</span><span class="p">,</span> <span class="s1">&#39;__contains__&#39;</span><span class="p">,</span> <span class="s1">&#39;__delattr__&#39;</span><span class="p">,</span> <span class="s1">&#39;__dir__&#39;</span><span class="p">,</span> <span class="s1">&#39;__doc__&#39;</span><span class="p">,</span> <span class="s1">&#39;__eq__&#39;</span><span class="p">,</span> <span class="s1">&#39;__format__&#39;</span><span class="p">,</span> <span class="s1">&#39;__ge__&#39;</span><span class="p">,</span> <span class="s1">&#39;__getattribute__&#39;</span><span class="p">,</span> <span class="s1">&#39;__getitem__&#39;</span><span class="p">,</span> <span class="s1">&#39;__getnewargs__&#39;</span><span class="p">,</span> <span class="s1">&#39;__gt__&#39;</span><span class="p">,</span> <span class="s1">&#39;__hash__&#39;</span><span class="p">,</span> <span class="s1">&#39;__init__&#39;</span><span class="p">,</span> <span class="s1">&#39;__init_subclass__&#39;</span><span class="p">,</span> <span class="s1">&#39;__iter__&#39;</span><span class="p">,</span> <span class="o">......</span><span class="p">]</span>
</span></span></code></pre></div><blockquote>
<p>但若是使用collection去檢查是否是iterable</p>
<p>只有實現<code>__getitem__</code>的對象可以被迭代但不會是iterable</p>
</blockquote>
<h2 id="iterator">Iterator</h2>
<p><a href="https://docs.python.org/3.7/c-api/iter.html">https://docs.python.org/3.7/c-api/iter.html</a></p>
<p>從官方文件看出，含有<code>__iter__</code>和<code>__next__</code>的對象可稱為iterator，</p>
<p>iterator是iterable的子集合，</p>
<p>上述提到的幾種方式是iterable但都不是iterator，可以使用上面用到的<code>isinstance</code>或是<code>dir</code>來確認，</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">collections.abc</span> <span class="kn">import</span> <span class="n">Iterable</span><span class="p">,</span> <span class="n">Iterator</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span> <span class="s2">&#34;123&#34;</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>     <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2"> is iterable: </span><span class="si">{</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>     <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2"> is iterator: </span><span class="si">{</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">Iterator</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span> <span class="ow">is</span> <span class="n">iterable</span><span class="p">:</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span> <span class="ow">is</span> <span class="n">iterator</span><span class="p">:</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl"><span class="mi">123</span> <span class="ow">is</span> <span class="n">iterable</span><span class="p">:</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl"><span class="mi">123</span> <span class="ow">is</span> <span class="n">iterator</span><span class="p">:</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="ow">is</span> <span class="n">iterable</span><span class="p">:</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="ow">is</span> <span class="n">iterator</span><span class="p">:</span> <span class="kc">False</span>
</span></span></code></pre></div><p>而文件則是iterator</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="s2">&#34;test.py&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">ifile</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>     <span class="nb">isinstance</span><span class="p">(</span><span class="n">ifile</span><span class="p">,</span> <span class="n">Iterator</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="kc">True</span>
</span></span></code></pre></div><h2 id="結語">結語</h2>
<p>了解了iterable和iterator，以後開發時，</p>
<p>若想創造出可以被迭代的對象或是迭代器，</p>
<p>則要知道必須要包含哪些基礎功能</p>
<p>那麼Generator呢?</p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/python-pdb/">Python pdb</a></li>
<li><a href="/python-context-manager/">Python Context Manager</a></li>
<li><a href="/python-lambda/">Python Lambda</a></li>
<li><a href="/python-f-string/">Python f-string</a></li>
<li><a href="/python-comments/">Python Comments</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>python pdb</title>
      <link>https://www.kbwen.com/python-pdb/</link>
      <pubDate>Fri, 10 Apr 2020 19:04:03 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-pdb/</guid>
      <description>介紹 Python 內建除錯工具 pdb 的三種使用方式：命令列直接執行、設定斷點以及 Python shell 中使用 pdb.pm()，讓你告別 print 除錯法。</description>
      <content:encoded><![CDATA[<p><a href="https://docs.python.org/3/library/pdb.html#module-pdb"><code>pdb</code></a> — The Python Debugger</p>
<p>一段簡單的程式碼</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;file = </span><span class="si">{</span><span class="vm">__file__</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>常見pdb幾種使用方式</p>
<h2 id="1-直接使用">1. 直接使用</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m pdb file.py
</span></span></code></pre></div><p>執行上面指令會讓整個檔案進入pdb模式操作</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&gt; /home/src/test.py(1)&lt;module&gt;()
</span></span><span class="line"><span class="cl">-&gt; file = __file__
</span></span><span class="line"><span class="cl">(Pdb)
</span></span></code></pre></div><h2 id="2-設斷點">2. 設斷點</h2>
<p>把上面程式碼改成</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">file</span> <span class="o">=</span> <span class="vm">__file__</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pdb</span><span class="p">;</span> <span class="n">pdb</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;file = </span><span class="si">{</span><span class="n">file</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>執行後則會在第二行進入pdb</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&gt; /home/src/test.py(3)&lt;module&gt;()
</span></span><span class="line"><span class="cl">-&gt; print(f&#39;file = {file}&#39;)
</span></span><span class="line"><span class="cl">(Pdb)
</span></span></code></pre></div><p>結果如同上方，此時進入操作。</p>
<p><strong>在python3.7之後版本，可以使用 breakpoint() 指令</strong></p>
<p>詳見<a href="https://www.python.org/dev/peps/pep-0553/">pep553</a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">file</span> <span class="o">=</span> <span class="vm">__file__</span>
</span></span><span class="line"><span class="cl"><span class="n">breakpoint</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;file = </span><span class="si">{</span><span class="n">file</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span></code></pre></div><h2 id="3-python-shell-中使用">3. python shell 中使用</h2>
<p>如果使用中遇到一些function的錯誤，可以這樣使用</p>
<p>創造一個測試function：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">a</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="n">b</span> <span class="o">=</span> <span class="s1">&#39;b&#39;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span></span></code></pre></div><p>這個function會出現錯誤：數字和字串的操作</p>
<p>再進入python</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">test</span> <span class="kn">import</span> <span class="n">test</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="kn">import</span> <span class="nn">pdb</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">test</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">  <span class="n">File</span> <span class="s2">&#34;&lt;stdin&gt;&#34;</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">module</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="n">File</span> <span class="s2">&#34;/home/src/test.py&#34;</span><span class="p">,</span> <span class="n">line</span> <span class="mi">4</span><span class="p">,</span> <span class="ow">in</span> <span class="n">test</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="ne">TypeError</span><span class="p">:</span> <span class="n">unsupported</span> <span class="n">operand</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="o">+</span><span class="p">:</span> <span class="s1">&#39;int&#39;</span> <span class="ow">and</span> <span class="s1">&#39;str&#39;</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;&gt;</span> <span class="n">pdb</span><span class="o">.</span><span class="n">pm</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="n">test</span><span class="o">.</span><span class="n">py</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="n">test</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">-&gt;</span> <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="n">Pdb</span><span class="p">)</span>
</span></span></code></pre></div><p>一樣也會進入pdb操作</p>
<h2 id="結語">結語</h2>
<p>上面提供了python debug的幾個方式，</p>
<p>可以加速我們遇到困難時的解決方法，</p>
<p>並且不要用print找錯誤</p>
<p>再來就是要習慣常用的快捷鍵操作~</p>
<h2 id="系列文章">系列文章</h2>
<ul>
<li><a href="/python-iterable/">Python Iterable</a></li>
<li><a href="/python-context-manager/">Python Context Manager</a></li>
<li><a href="/python-lambda/">Python Lambda</a></li>
<li><a href="/python-f-string/">Python f-string</a></li>
<li><a href="/python-comments/">Python Comments</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Python reminder</title>
      <link>https://www.kbwen.com/python-reminder/</link>
      <pubDate>Fri, 14 Apr 2017 18:41:23 +0800</pubDate><dc:creator>KbWen</dc:creator>
      <guid>https://www.kbwen.com/python-reminder/</guid>
      <description>Python 基礎筆記：變數宣告、字串 Escape 字元、Raw string，以及 %-formatting 與 str.format() 兩種輸出方式的比較與使用場景。</description>
      <content:encoded><![CDATA[<h2 id="變數">變數</h2>
<ul>
<li>不用宣告變數的型態</li>
<li>可以直接用 <code>x, y = y, x</code> 對調</li>
</ul>
<p>同時宣告多個變數的方法：</p>
<p><img
  src="/images/2017/04/er-r3.png"
  alt="ER.R3"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="328" height="438"
>
</p>
<p>上下兩類方法會得到兩種結果 (前者數字，後者字串)；注意變數數量和迭代的數量要相同。</p>
<h2 id="string-表示">String 表示</h2>
<h3 id="escape-">Escape \</h3>
<ul>
<li>Python 中 <code>\</code> 代表著脫離字串，常見如下：</li>
</ul>
<p><img
  src="/images/2017/04/ep_r11.png"
  alt="EP_R1"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="239" height="307"
>
</p>
<p>要讓「脫離字串」回到字串型式，前面要再加 <code>\</code>；例如倒數第二個用 Raw string 也是相同意思：<code>r'****'</code>。</p>
<ul>
<li>字串可以迭代。</li>
<li>字串也有像基本 list 的取值、讀值方式；代表可以使用非物件專屬的函式，例如：<code>len()</code>。</li>
</ul>
<p><img
  src="/images/2017/04/ep_r21.png"
  alt="EP_R2"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="328" height="504"
>
</p>
<p>範例，可以注意 <code>find</code> 指令的回傳值：</p>
<p><img
  src="/images/2017/04/ep_r4.png"
  alt="EP_R4"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="242" height="439"
>
</p>
<h3 id="format-與-s">&lsquo;&rsquo;.format() 與 %s</h3>
<p>這兩種輸出方式會得到類似的結果：</p>
<p><img
  src="/images/2017/04/ep_r51.png"
  alt="EP_R5"
  loading="lazy"
  fetchpriority="auto"
  decoding="async" width="553" height="415"
>
</p>
<p>目前看到在 tuple 下，<code>%</code> 會有問題，我想我會多習慣用 <code>''.format()</code> 格式。</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
