又LAG隨性筆記
  • 關於我
  • 作品集
  • 生活隨筆
  • 與我聯絡
  • 隨手扎

隨手扎

December 30, 2019

【心得筆記】「松本行弘的程序世界」讀書筆記

這是一本「不只是Ruby的Ruby技術書籍」,要我在下另一個註腳的話,應該會是「從Ruby看計算機概論」。內容涵蓋之廣,物件導向程式設計、動態程式語言、原形程式設計(Propotype-base programming)、鴨子型別(算是一種設計模式)、強大的元編程(Meta Programming)、設計模式、有趣的猴子補丁、文字編碼、Ajax網頁技術、正則表達式(Rege)、平行處理(多工)、資訊安全、資料持久化(Serialization)、函數型程式設計(Functional Programming)。儘管只有快400頁,但可以從一本書裡窺看不同角度的技術世界。自己升大學以前,曾經在暑假看了至少三本計算機概論,好了解自己未來所選的科系,大學更是又讀了一次,在我看來,這本「松本行弘的程序世界」簡直就是技術界的計算機概論。對於只學過一種編程想法(如結構化程式設計或是物件導向程式設計)的人來說,或許會有許多地方看不懂,就當做個入門。不過,我自己到是看的頗為愉快。之前就有人說:Ruby的開發者是語言學家、Python的開發者是數學家。我看完本書後,松本行弘的視野真的很多角度、很廣。研究學習程式語言也是我的興趣之一,看在本書的當下,真覺得我和松大哥很投緣。

上面順序主要照書內出現的順序,下面稍微歸類整理一下:

  • 程式語言設計思想
    • 動態程式語言
    • 物件導向程式設計(Object-oriented programming)
    • 原形程式設計(Propotype-base programming)
    • 函數型程式設計(Functional Programming)
  • 開發設計思想
    • 設計模式(Design Pattern)
    • 鴨子型別(算是一種設計模式)
    • 有趣的猴子補丁(Monkey Pitching)
    • 強大的元編程(Meta Programming)
  • 計算機概論常見內容
    • 文字編碼
    • 正則表達式(Rege)
    • Ajax網頁技術
    • 平行處理(多工)
    • 資訊安全
    • 資料持久化(Serialization)

這本書我在 2019/12/28 其實就看完了,不過跑去試了一些其他東西,到今天才來寫心得筆記。(看得當下其實就很想寫了🐰)

推薦指數:★★★★★

December 25, 2019

MyString委派(delegate)加法

之前擴展String的+方法。不過這樣的實現不是很彈性:

count = 10
"-"*10
# "Count: " + count # will rise exception
"Count: " + str(count) # allow string + string

class myString(str):
    def __add__(self, other):
        if other == None:
            return myString(str(self) + "None")
        elif type(other) == str:
            return myString(str(self) + other)
        elif type(other) == int or type(other) == float:
            return myString(str(self) + str(other))
        else:
            return myString(str(self) + str(other))


myString("Count: ") + count # success.  => 'Count: 10'
myString("Count: ") + count + " and " + count # => 'Count: 10 and 10'
myString("Count: ") + None # => 'Count: None'

這次來稍微修改,改用委派的方式。

December 25, 2019

Python的資料模型(Data Model)的特殊成員(Special Member)

上一篇寫到,覆寫Python操作子(Override Operator)。其中提到operator這個Package,並對類別實現特殊方法,來覆寫運算子的行為。不過這麼寫不完全正確,只是Operator Package的頁面清楚的多,而這覆寫的動作,實際更直接與Python資料模型中的特殊成員(特殊屬性&特殊方法)(Data Model - Special Member(Special Attribute & Special Method))相關。

December 22, 2019

覆寫Python操作子(Override Operator)

上一篇寫到Python裡的方法和函數。接著來看看 操作方法 。

Python的操作子

a < b 
a <= b
a == b
a != b
a >= b
a > b
a + b
a - b
a * b
a ** b
a / b
a // b
a and b
a or b

上面都是寫Python常見的形式。其實這些操作方法和C++一樣,可以覆寫(Override Operator)。要覆寫,只要在定義類別時,添加對應方法就好。

為String擴展+的方法

Python是偏強型別語言,雖然字串可以乘上數字(ex:"-"*10),但是不能加上數字。就來簡單的擴展作為範例看看吧!

December 22, 2019

Python的函數(Function)vs方法(method)

前言

※ 本段有些難度,略過並不影響後續理解。

在幾天前,我實現了一個可以傳入函數呼叫的類別(Callable Class),相關可以參考「用Python實現Callable Class」。

起初,我實現Meta-Class的方式,是在defineclz.__new__(clz, *args, **kwargs)實例(instance)後,將實例增加函數成員(Function Member)。不過這樣做並不太成功。會需要使用instance.__call__(f, *args, **kargs)去執行。而直接複寫defineclz.__call__的話,以會造成不斷呼叫的問題,而且無法讓後續繼承子孫,再進一步調整方法。這也是為什麼後來以內部類別實現,並且另擁有__call__能力的類別,後於defineclz,好讓自定義的__call__可以複寫掉預設行為。

※ Note: 本文寫到的函數成員(Function Member),主要是指實例屬性,但這個屬性是一個函數。更多時候,成員(Member)可能就包含方法(Method)和屬性(Attribute),而函數成員(Function Member)可能就直指方法(Method)。

定義方法(method)vs定義函數(function)

※ 尚為去翻找文件,可能有錯誤。

在Python,可以用def關鍵字去定義一個函數:

def f1():
    print("call f1")

f1()

而方法的定義也是使用def:

class C1:
    class_attr1 = {}
    def __init__(self):
        self.instance_attr1 = {}
    def _f1(self):
        print("C1: f1")
    def f1(self):
        self._f1() # if wrote `_f1()`, it will not found
    def f2(self):
        def _f2():
            print("C1.f2: _f2")
        _f2()

c1 = C1()
c1.f1()
c1.f2()

但其實這裡就可以看出一些行為的不同。上面_f1()和f1()看是在同一個scope,但是如果f1()需要呼叫_f1(),必須使用self._f1()或是C1._f1(self),如果直接寫_f1()會報錯說找不到。相對來說f2()是C1類別的方法,但是內部函式_f2不是,因此就不需要這樣寫。現在在把f1()移出類別外,變成一般函式看看:

December 20, 2019

用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的的值。(這辦法不夠 純函數 )

因此,我修改成以下方式:

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

  • ««
  • «
  • 1
  • 2
  • 3
  •  … 
  • 24
  • 25
  • 26
  •  … 
  • 34
  • »
  • »»
© 又LAG隨性筆記 2025