标签为“你可能沒看過得Python”的页面如下
表示無限大。運算與比較(Python)
前言
在做LeetCode題目。然後因為我思考邏輯的關係,會需要使用到無限大(Inf)的概念,所以首先自幹的一個:
class Inf(numbers.Number):
def __gt__(self, n: numbers.Number):
return True
def __eq__(self, n: numbers.Number):
if isinstance(n, Inf): return True
else: return False
遺憾的是,這雖然可以處理Inf() > int(1),卻無法處理int(1) > Inf()的問題。無法輕易直接修改內置類型int,要是在多包一層感覺有些彆扭。所以找找看Python有沒有像EMCAScript內有Infinity的東西。可是…我第一個看的卻是日文內容。
Google中文第一個查到的也是簡體中文。要不就是Numpy的東西。
於是乎,這篇簡單的分享就出來了。
※ 最開始,我還有在numbers裡面找,無果。
關於Python Lambda那些可能不知道的三兩事
lambda本質和function無異
def f():
pass
type(lambda : None) # => <type 'function'>
type(f) # => <type 'function'>
lambda :None # => <function <lambda> at 0x7ffa6d343650>
f # => <function f at 0x7ffa6d349dd0>
lambda和function的型態都是function,並沒有區分開來。
一個是語句、一個是表達式
差別在於def是關鍵字形成的語句(statement),lambda是表達式(expression)。他們差別在於,能出現在程式碼的不同位置。
※ Note: 表達是(expression)也是一種語句(statement)。為了簡單來看,接下來都會區分開來。
內建有多個函式可以接受函式參數
因為lambda和function本質差無異,所以不會有函式只可以接受lambda,不可以接受function。
filter(lambda parameter: expression, iterable)
filter(function, iterable) # more correct
比起使用lambda描述filter,用function更正確。reduce等也是這樣。
lambda多行的寫法
通常看到lambda都只有一行,正常情況下也都是這樣。不過先來看看文件怎麼描述lambda的語法:
lambda_expr ::= "lambda" [parameter_list] ":" expression
lambda_expr_nocond ::= "lambda" [parameter_list] ":" expression_nocond
相當於:
def <lambda>(parameters):
return expression
【微更】你可能沒看過得Python - Callable(續)
【微更】Callable的實現
之前我實現了Callable Class,當時對於CallableWrapper的實現如下:
class CallableWrapper:
def __init__(self, wrap):
self.wrap = wrap
def __call__(self, f=None, *args):
if f == None:
return self.wrap
return CallableWrapper(f(self.wrap, *args))
這個實現有一些缺憾,CallableWrapper的__call__回傳值,也是CallableWrapper。而CallableWrapper本身預期被呼叫,這導致結果不能直接使用,需要多給一次空呼叫(result())。舉例來說:
arr = CallableWrapper([1,2,3,4,5,6,])
arr # => <__main__.CallableWrapper object at 0x7f2102f00668>
# arr(sum) + 10 # You can't do this, because CallableWrapper can't add integer
arr(sum)() + 10
上例中,並不能直接寫arr(sum) + 10,要寫arr(sum)() + 10。這感覺有點脫褲子放屁阿…
基於此想法,我改寫成:
Python的資料模型(Data Model)的特殊成員(Special Member)
上一篇寫到,覆寫Python操作子(Override Operator)。其中提到operator這個Package,並對類別實現特殊方法,來覆寫運算子的行為。不過這麼寫不完全正確,只是Operator Package的頁面清楚的多,而這覆寫的動作,實際更直接與Python資料模型中的特殊成員(特殊屬性&特殊方法)(Data Model - Special Member(Special Attribute & Special Method))相關。

用Python實現Callable Class,FP更好寫
This Article has English Version, please goto here to read.
前言
最近,和朋友們在解LeetCode的題目。看著不同人寫出來的程式,也讓我對於一個題目的解法,有更寬廣的視野。
938. Range Sum of BST
URL: https://leetcode.com/problems/range-sum-of-bst/
這篇文章與這個想法,也是受到朋友寫的一個Ruby寫法的啟發。我用同樣的邏輯去寫Python,如下圖:
當然,這題目有更好更快的寫法,但這樣寫更為有趣有意思。
但是,內部隱含的block函數,從函數型語言的設計原則來看,他是危險、骯髒的。這是因為每次他的執行,都會修改到外部變數s的的值。(這辦法不夠 純函數 )
因此,我修改成以下方式:

如此,你還可以改寫成一行:


