<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>你可能沒看過得Python on 又LAG隨性筆記</title><link>https://www.lagagain.com/categories/%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%92%E7%9C%8B%E9%81%8E%E5%BE%97python/</link><description>Recent content in 你可能沒看過得Python on 又LAG隨性筆記</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><lastBuildDate>Sun, 05 Jan 2020 06:52:16 +0800</lastBuildDate><atom:link href="https://www.lagagain.com/categories/%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%92%E7%9C%8B%E9%81%8E%E5%BE%97python/index.xml" rel="self" type="application/rss+xml"/><item><title>表示無限大。運算與比較(Python)</title><link>https://www.lagagain.com/post/%E8%A1%A8%E7%A4%BA%E7%84%A1%E9%99%90%E5%A4%A7%E9%81%8B%E7%AE%97%E8%88%87%E6%AF%94%E8%BC%83python/</link><pubDate>Sun, 05 Jan 2020 06:52:16 +0800</pubDate><guid>https://www.lagagain.com/post/%E8%A1%A8%E7%A4%BA%E7%84%A1%E9%99%90%E5%A4%A7%E9%81%8B%E7%AE%97%E8%88%87%E6%AF%94%E8%BC%83python/</guid><description>&lt;h1 id="前言-">前言&lt;/h1>
&lt;p>在做&lt;a href="https://leetcode.com/problems/merge-two-sorted-lists/">LeetCode&lt;/a>題目。然後因為我思考邏輯的關係，會需要使用到無限大(&lt;code>Inf&lt;/code>)的概念，所以首先自幹的一個：&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Inf&lt;/span>(numbers&lt;span style="color:#f92672">.&lt;/span>Number):
&lt;span style="color:#66d9ef">def&lt;/span> __gt__(self, n: numbers&lt;span style="color:#f92672">.&lt;/span>Number):
&lt;span style="color:#66d9ef">return&lt;/span> True
&lt;span style="color:#66d9ef">def&lt;/span> __eq__(self, n: numbers&lt;span style="color:#f92672">.&lt;/span>Number):
&lt;span style="color:#66d9ef">if&lt;/span> isinstance(n, Inf): &lt;span style="color:#66d9ef">return&lt;/span> True
&lt;span style="color:#66d9ef">else&lt;/span>: &lt;span style="color:#66d9ef">return&lt;/span> False
&lt;/code>&lt;/pre>&lt;/div>&lt;p>遺憾的是，這雖然可以處理&lt;code>Inf() &amp;gt; int(1)&lt;/code>，卻無法處理&lt;code>int(1) &amp;gt; Inf()&lt;/code>的問題。無法輕易直接修改內置類型&lt;code>int&lt;/code>，要是在多包一層感覺有些彆扭。所以找找看Python有沒有像EMCAScript內有&lt;code>Infinity&lt;/code>的東西。可是&amp;hellip;我第一個看的卻是日文內容。&lt;/p>
&lt;p>&lt;a href="https://i.postimg.cc/wvdtc3dv/image.png">&lt;img src="https://i.postimg.cc/wvdtc3dv/image.png" alt="image.png">&lt;/a>&lt;/p>
&lt;p>Google中文第一個查到的也是簡體中文。要不就是&lt;code>Numpy&lt;/code>的東西。&lt;/p>
&lt;p>&lt;a href="https://i.postimg.cc/FKSdL388/image.png">&lt;img src="https://i.postimg.cc/FKSdL388/image.png" alt="image.png">&lt;/a>&lt;/p>
&lt;p>於是乎，這篇簡單的分享就出來了。&lt;/p>
&lt;p>※ 最開始，我還有在&lt;a href="https://docs.python.org/3.8/library/numbers.html?highlight=numbers">numbers&lt;/a>裡面找，無果。&lt;/p></description></item><item><title>關於Python Lambda那些可能不知道的三兩事</title><link>https://www.lagagain.com/post/%E9%97%9C%E6%96%BCpython-lambda%E9%82%A3%E4%BA%9B%E5%8F%AF%E8%83%BD%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84%E4%B8%89%E5%85%A9%E4%BA%8B/</link><pubDate>Tue, 31 Dec 2019 13:20:57 +0800</pubDate><guid>https://www.lagagain.com/post/%E9%97%9C%E6%96%BCpython-lambda%E9%82%A3%E4%BA%9B%E5%8F%AF%E8%83%BD%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84%E4%B8%89%E5%85%A9%E4%BA%8B/</guid><description>&lt;h1 id="lambda本質和function無異">lambda本質和function無異&lt;/h1>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">f&lt;/span>():
&lt;span style="color:#66d9ef">pass&lt;/span>
type(&lt;span style="color:#66d9ef">lambda&lt;/span> : None) &lt;span style="color:#75715e"># =&amp;gt; &amp;lt;type &amp;#39;function&amp;#39;&amp;gt;&lt;/span>
type(f) &lt;span style="color:#75715e"># =&amp;gt; &amp;lt;type &amp;#39;function&amp;#39;&amp;gt;&lt;/span>
&lt;span style="color:#66d9ef">lambda&lt;/span> :None &lt;span style="color:#75715e"># =&amp;gt; &amp;lt;function &amp;lt;lambda&amp;gt; at 0x7ffa6d343650&amp;gt;&lt;/span>
f &lt;span style="color:#75715e"># =&amp;gt; &amp;lt;function f at 0x7ffa6d349dd0&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>lambda和function的型態都是&lt;code>function&lt;/code>，並沒有區分開來。&lt;/p>
&lt;h2 id="一個是語句一個是表達式">一個是語句、一個是表達式&lt;/h2>
&lt;p>差別在於&lt;code>def&lt;/code>是關鍵字形成的語句(statement)，&lt;code>lambda&lt;/code>是表達式(expression)。他們差別在於，能出現在程式碼的不同位置。&lt;/p>
&lt;p>※ Note: 表達是(expression)也是一種語句(statement)。為了簡單來看，接下來都會區分開來。&lt;/p>
&lt;h1 id="內建有多個函式可以接受函式參數">內建有多個函式可以接受函式參數&lt;/h1>
&lt;p>因為lambda和function本質差無異，所以不會有函式只可以接受lambda，不可以接受function。&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">filter(&lt;span style="color:#66d9ef">lambda&lt;/span> parameter: expression, iterable)
filter(function, iterable) &lt;span style="color:#75715e"># more correct&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>比起使用lambda描述&lt;a href="https://docs.python.org/3.5/library/functions.html#filter">filter&lt;/a>，用function更正確。&lt;a href="https://docs.python.org/3/library/functools.html#functools.reduce">reduce&lt;/a>等也是這樣。&lt;/p>
&lt;h1 id="lambda多行的寫法">lambda多行的寫法&lt;/h1>
&lt;p>通常看到&lt;code>lambda&lt;/code>都只有一行，正常情況下也都是這樣。不過先來看看文件怎麼描述&lt;a href="https://docs.python.org/3/reference/expressions.html?highlight=lambda#lambda">lambda的語法&lt;/a>：&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bnf" data-lang="bnf">lambda_expr &lt;span style="color:#f92672">::=&lt;/span> &amp;#34;lambda&amp;#34; [parameter_list] &amp;#34;:&amp;#34; expression
lambda_expr_nocond &lt;span style="color:#f92672">::=&lt;/span> &amp;#34;lambda&amp;#34; [parameter_list] &amp;#34;:&amp;#34; expression_nocond
&lt;/code>&lt;/pre>&lt;/div>&lt;p>相當於：&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#66d9ef">lambda&lt;/span>&lt;span style="color:#f92672">&amp;gt;&lt;/span>(parameters):
&lt;span style="color:#66d9ef">return&lt;/span> expression
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>【微更】你可能沒看過得Python - Callable(續)</title><link>https://www.lagagain.com/post/%E5%BE%AE%E6%9B%B4%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%92%E7%9C%8B%E9%81%8E%E5%BE%97python_callable%E7%BA%8C/</link><pubDate>Tue, 31 Dec 2019 07:45:44 +0800</pubDate><guid>https://www.lagagain.com/post/%E5%BE%AE%E6%9B%B4%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%92%E7%9C%8B%E9%81%8E%E5%BE%97python_callable%E7%BA%8C/</guid><description>&lt;h1 id="微更callable的實現">【微更】Callable的實現&lt;/h1>
&lt;p>之前我實現了&lt;a href="https://www.lagagain.com/post/%E7%94%A8python%E5%AF%A6%E7%8F%BEcallable-classfp%E6%9B%B4%E5%A5%BD%E5%AF%AB/">Callable Class&lt;/a>，當時對於&lt;code>CallableWrapper&lt;/code>的實現如下：&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">CallableWrapper&lt;/span>:
&lt;span style="color:#66d9ef">def&lt;/span> __init__(self, wrap):
self&lt;span style="color:#f92672">.&lt;/span>wrap &lt;span style="color:#f92672">=&lt;/span> wrap
&lt;span style="color:#66d9ef">def&lt;/span> __call__(self, f&lt;span style="color:#f92672">=&lt;/span>None, &lt;span style="color:#f92672">*&lt;/span>args):
&lt;span style="color:#66d9ef">if&lt;/span> f &lt;span style="color:#f92672">==&lt;/span> None:
&lt;span style="color:#66d9ef">return&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>wrap
&lt;span style="color:#66d9ef">return&lt;/span> CallableWrapper(f(self&lt;span style="color:#f92672">.&lt;/span>wrap, &lt;span style="color:#f92672">*&lt;/span>args))
&lt;/code>&lt;/pre>&lt;/div>&lt;p>這個實現有一些缺憾，&lt;code>CallableWrapper&lt;/code>的&lt;code>__call__&lt;/code>回傳值，也是&lt;code>CallableWrapper&lt;/code>。而&lt;code>CallableWrapper&lt;/code>本身預期被呼叫，這導致結果不能直接使用，需要多給一次空呼叫（&lt;code>result()&lt;/code>）。舉例來說：&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-python" data-lang="python">arr &lt;span style="color:#f92672">=&lt;/span> CallableWrapper([&lt;span style="color:#ae81ff">1&lt;/span>,&lt;span style="color:#ae81ff">2&lt;/span>,&lt;span style="color:#ae81ff">3&lt;/span>,&lt;span style="color:#ae81ff">4&lt;/span>,&lt;span style="color:#ae81ff">5&lt;/span>,&lt;span style="color:#ae81ff">6&lt;/span>,])
arr &lt;span style="color:#75715e"># =&amp;gt; &amp;lt;__main__.CallableWrapper object at 0x7f2102f00668&amp;gt;&lt;/span>
&lt;span style="color:#75715e"># arr(sum) + 10 # You can&amp;#39;t do this, because CallableWrapper can&amp;#39;t add integer&lt;/span>
arr(sum)() &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>上例中，並不能直接寫&lt;code>arr(sum) + 10&lt;/code>，要寫&lt;code>arr(sum)() + 10&lt;/code>。這感覺有點脫褲子放屁阿&amp;hellip;&lt;/p>
&lt;p>基於此想法，我改寫成：&lt;/p></description></item><item><title>Python的資料模型(Data Model)的特殊成員(Special Member)</title><link>https://www.lagagain.com/post/python%E7%9A%84%E8%B3%87%E6%96%99%E6%A8%A1%E5%9E%8Bdata-model%E7%9A%84%E7%89%B9%E6%AE%8A%E6%88%90%E5%93%A1special-member/</link><pubDate>Wed, 25 Dec 2019 14:00:33 +0800</pubDate><guid>https://www.lagagain.com/post/python%E7%9A%84%E8%B3%87%E6%96%99%E6%A8%A1%E5%9E%8Bdata-model%E7%9A%84%E7%89%B9%E6%AE%8A%E6%88%90%E5%93%A1special-member/</guid><description>&lt;p>上一篇寫到，&lt;a href="https://www.lagagain.com/post/%E8%A6%86%E5%AF%ABpython%E6%93%8D%E4%BD%9C%E5%AD%90override-operator/">覆寫Python操作子(Override Operator)&lt;/a>。其中提到&lt;a href="https://docs.python.org/3/library/operator.html">operator&lt;/a>這個Package，並對類別實現特殊方法，來覆寫運算子的行為。不過這麼寫不完全正確，只是Operator Package的頁面清楚的多，而這覆寫的動作，實際更直接與&lt;a href="https://docs.python.org/3/reference/datamodel.html?#emulating-numeric-types">Python資料模型中的特殊成員(特殊屬性&amp;amp;特殊方法)&lt;/a>(Data Model - Special Member(&lt;a href="https://docs.python.org/3/reference/datamodel.html?highlight=special%20attributes">Special Attribute&lt;/a> &amp;amp; &lt;a href="https://docs.python.org/3/reference/datamodel.html?highlight=special%20method#special-method-names">Special Method&lt;/a>))相關。&lt;/p>
&lt;p>&lt;img src="https://i.postimg.cc/WpSJtbRV/image.png" alt="">&lt;/p></description></item><item><title>用Python實現Callable Class，FP更好寫</title><link>https://www.lagagain.com/post/%E7%94%A8python%E5%AF%A6%E7%8F%BEcallable-classfp%E6%9B%B4%E5%A5%BD%E5%AF%AB/</link><pubDate>Fri, 20 Dec 2019 21:14:41 +0800</pubDate><guid>https://www.lagagain.com/post/%E7%94%A8python%E5%AF%A6%E7%8F%BEcallable-classfp%E6%9B%B4%E5%A5%BD%E5%AF%AB/</guid><description>&lt;blockquote>
&lt;p>This Article has English Version, please goto &lt;a href="https://medium.com/@Lagagain/implement-callablemeta-and-callablecalss-in-python-38632d922679?sk=f922feff4c2cbc9bc9a840620a1b9c8e">here&lt;/a> to read.&lt;/p>
&lt;/blockquote>
&lt;h1 id="前言">前言&lt;/h1>
&lt;p>最近，和朋友們在解LeetCode的題目。看著不同人寫出來的程式，也讓我對於一個題目的解法，有更寬廣的視野。&lt;/p>
&lt;h2 id="938-range-sum-of-bst">938. Range Sum of BST&lt;/h2>
&lt;p>URL: &lt;a href="https://leetcode.com/problems/range-sum-of-bst/">https://leetcode.com/problems/range-sum-of-bst/&lt;/a>&lt;/p>
&lt;p>這篇文章與這個想法，也是受到朋友寫的一個Ruby寫法的啟發。我用同樣的邏輯去寫Python，如下圖：&lt;/p>
&lt;p>&lt;a href="https://i.postimg.cc/5ygt3R7X/image.png">&lt;img src="https://i.postimg.cc/5ygt3R7X/image.png" alt="">&lt;/a>&lt;/p>
&lt;p>當然，這題目有更好更快的寫法，但這樣寫更為有趣有意思。&lt;br>
但是，內部隱含的&lt;code>block&lt;/code>函數，從函數型語言的設計原則來看，他是危險、骯髒的。這是因為每次他的執行，都會修改到外部變數&lt;code>s&lt;/code>的的值。(這辦法不夠 &lt;strong>純函數&lt;/strong> )&lt;/p>
&lt;p>因此，我修改成以下方式：&lt;/p>
&lt;p>&lt;img src="https://i.postimg.cc/W1rBckVn/image.png" alt="">&lt;/p>
&lt;p>如此，你還可以改寫成一行：&lt;/p></description></item></channel></rss>