{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021-12-03-python-note/","result":{"data":{"site":{"siteMetadata":{"title":"Howard's Note","disqusShortname":""}},"markdownRemark":{"id":"3dea1f19-b453-5c81-867c-7f6943870e93","html":"<p>筆記 <a href=\"https://en.wikibooks.org/wiki/Python_Programming/Idioms\">https://en.wikibooks.org/wiki/Python_Programming/Idioms</a></p>\n<h2>http.client</h2>\n<p>封裝過的http (https) 請求。</p>\n<p>基本使用方式：</p>\n<p>下例是請求台灣證交所的API</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"> url <span class=\"token operator\">=</span> <span class=\"token string\">'openapi.twse.com.tw'</span>\nmi_index <span class=\"token operator\">=</span> <span class=\"token string\">'/v1/exchangeReport/MI_INDEX'</span>\nclient <span class=\"token operator\">=</span> http<span class=\"token punctuation\">.</span>client<span class=\"token punctuation\">.</span>HTTPSConnection<span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f'</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>url<span class=\"token punctuation\">}</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">443</span><span class=\"token punctuation\">,</span> timeout<span class=\"token operator\">=</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># 呼叫request後才會實際請求。</span>\nclient<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">(</span><span class=\"token string\">'GET'</span><span class=\"token punctuation\">,</span> <span class=\"token string-interpolation\"><span class=\"token string\">f'</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>mi_index<span class=\"token punctuation\">}</span></span><span class=\"token string\">'</span></span><span class=\"token punctuation\">)</span>\nres <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>getresponse<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\ndata <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>loads<span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> </code></pre></div>\n<blockquote>\n<p>note: url不用加入協定（http, https)，由使用的物件決定協定（<code class=\"language-text\">http.client.HTTPSConnection</code> vs <code class=\"language-text\">https.client.HTTPConnection</code>)。</p>\n<p>注意 request 的port，需要當作參數指定。預設http使用 80 port，https 使用443 port。</p>\n</blockquote>\n<h2>python idiom</h2>\n<p>記錄python的貫用寫法加深印象。</p>\n<h3>錯誤處理</h3>\n<p>盡量使用 <code class=\"language-text\">try ... except</code> 的方式處理錯誤。</p>\n<p>python 的哲學以 EAFP (its Easier to Ask Forgiveness then Permission) 取代 LBYL (Look Before You Leap)。</p>\n<p>將有可能會發生錯誤的程式碼片段放在 <code class=\"language-text\">try ... except</code> 區塊內。</p>\n<h3>屬性使用方式</h3>\n<p>直接使用屬性，不使用 getter / setter 封裝。</p>\n<blockquote>\n<p>屬性是否為private，使用前綴底線(_prop)區分，依賴約定。</p>\n</blockquote>\n<h3>dictionary vs class</h3>\n<p>變值是動態時使用 dictiory，靜態時使用 class。</p>\n<h3>discard variable</h3>\n<p>使用底線代表要被捨棄的變數。如使用tuple接回傳值時、或是指示忽略函式參數。</p>\n<p>也可以使用 <code class=\"language-text\">*_</code>, <code class=\"language-text\">**_</code> 搭棄 positional / keyword 拾棄傳進函式的印數。</p>\n<p>對應可變參數<a href=\"##%20%E5%8F%AF%E8%AE%8A%E5%8F%83%E6%95%B8%20*args,%20**kwargs\"><code class=\"language-text\">*args</code>, <code class=\"language-text\">**kwargs</code></a></p>\n<h3>使用 else</h3>\n<p>可以在 try, for, while, if 後使用 else。</p>\n<h2>import 原則</h2>\n<p>impmort 模組，盡量避免引入 name ( function, class etc)。</p>\n<p>若直接引入名稱 ，將會產生新的名稱綁定。而這個命名綁定會跟模組底下的原命名不同（如果兩個名稱任一個被重新賦值）。</p>\n<p>可使用 <code class=\"language-text\">import &lt;module> as &lt;alias></code> 取個簡單的別名。</p>\n<p>若是使用<code class=\"language-text\">from &lt;module> import &lt;sub-module></code> 引入子模組，則不太會有問題。</p>\n<h2>運算</h2>\n<h3>交換值</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">b<span class=\"token punctuation\">,</span> a <span class=\"token operator\">=</span> a<span class=\"token punctuation\">,</span> b</code></pre></div>\n<h3>使用nullable 屬性</h3>\n<p>使用<code class=\"language-text\">and</code>：</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">a <span class=\"token keyword\">and</span> a<span class=\"token punctuation\">.</span>x\na <span class=\"token keyword\">and</span> a<span class=\"token punctuation\">.</span>f<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># regular expression 尤其常用</span>\n<span class=\"token keyword\">match</span> <span class=\"token keyword\">and</span> <span class=\"token keyword\">match</span><span class=\"token punctuation\">.</span>group<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3>子字串比對</h3>\n<p>使用 <code class=\"language-text\">in</code>關鍵字。</p>\n<h3>next</h3>\n<p>使用 next 搭配 for 表達示，可以取得集合內特定條件的第一個index或值（find first)。</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n    x <span class=\"token operator\">=</span> <span class=\"token builtin\">next</span><span class=\"token punctuation\">(</span>n <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> l <span class=\"token keyword\">if</span> n <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">except</span> StopIteration<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'No positive numbers'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The first positive number is'</span><span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span></code></pre></div>\n<blockquote>\n<p>else 用法可以將關注點分離。</p>\n</blockquote>\n<h3>截斷</h3>\n<p>使用 <code class=\"language-text\">del</code>，不用使用重新賦值的方式。</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">del</span> l<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">del</span> l<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span>i<span class=\"token punctuation\">]</span>\n\n<span class=\"token comment\"># anti pattern</span>\nl <span class=\"token operator\">=</span> l<span class=\"token punctuation\">[</span><span class=\"token punctuation\">:</span>j<span class=\"token punctuation\">]</span>\nl <span class=\"token operator\">=</span> l<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>del 可以直接回收資源。</p>\n<h2>建構string</h2>\n<p><strong>很常用的感覺</strong></p>\n<p>善用 join()</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># ...</span>\n<span class=\"token comment\"># l.append(x)</span>\ns <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span>l<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 也可使用 generactor expressiotns</span>\ns <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span>f<span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> l<span class=\"token punctuation\">)</span></code></pre></div>\n<blockquote>\n<p>使用 + 串接字串的話，每次都會產生新的字串（字串在python內是不可變變數）</p>\n</blockquote>\n<h2>可變參數 *args, **kwargs</h2>\n<p><code class=\"language-text\">*args</code> 跟 positional variable相關。\n<code class=\"language-text\">**kargs</code> 與 keyword variable 相關。</p>\n<blockquote>\n<p>ref: <a href=\"https://blog.maxkit.com.tw/2018/12/python-args-kwargs.html\">https://blog.maxkit.com.tw/2018/12/python-args-kwargs.html</a></p>\n</blockquote>","frontmatter":{"title":"Python Note","date":"December 03, 2021","description":null,"tags":["python"],"template":"post"}}},"pageContext":{"slug":"/2021-12-03-python-note/","previous":{"node":{"fields":{"slug":"/2021-11-20-gatsby-js-config/"},"frontmatter":{"date":"20 November, 2021","title":"gatsby config api","tags":["gatsby"]}}},"next":{"node":{"fields":{"slug":"/2021-12-05-python-notebook-nbextensions-issue/"},"frontmatter":{"date":"05 December, 2021","title":"jupyter notebook nbextensiions 404 issue.","tags":["python"]}}}}},"staticQueryHashes":["2841359383","3810545343","916993862"]}