Effective python – 例29 在comprehensions中使用assignment expressions

stock = {
    'nails': 125,
    'screws': 35,
    'wingnuts': 8,
    'washers': 24,
}

def get_batches(count, size):
    return count // size

comprehensions是python常用的一個功能,可以快速生成list, dict, set等變數。但有時會出現一些重覆的計算…

order = ['screws', 'wingnuts', ' clips']

found = {name: get_batches(stock.get(name, 0), 8)
         for name in order
         if get_batches(stock.get(name, 0), 8)}
print(found)

{‘screws’: 4, ‘wingnuts’: 1}

現在我們可以用assignment expressions( :=,又稱walrus operator)來減少這些重覆語句的出現。

found = {name: batches for name in order
         if (batches := get_batches(stock.get(name, 0), 8))}

print(found)

不過要小心assignment expressions可能會汙染comprehensions外的scope,所以本書只建議在if的區域使用assignment expressions。

half = [(last := count // 2) for count in stock.values()]
print(last)
#12
print(batches)
#0

但實際上if區域的變數也是會汙染,書中的建議原因不太確定為何。

Effective Python – 例14 在排序時使用key參數

例如list之類有序的容器可以用sort這個方法來做排序,但若是其中的物件沒辨法比較時(沒有實作< operator)會產生Error,這時用用key傳入一個function回傳可比較的物件來代替。

class Tool:
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    def __repr__(self):
        return f'Tool({self.name!r}, {self.weight})'


tools = [
    Tool('level', 3.5),
    Tool('hammer', 1.25),
    Tool('screwdriver', 0.5),
]

tools.sort()

TypeError: ‘<‘ not supported between instances of ‘Tool’ and ‘Tool’

我們可以用一個lamda function來讓Tool物件以name元素來做排序。

tools.sort(key=lamda x: x.name)
print(tools)

[Tool(‘hammer’, 1.25), Tool(‘level’, 3.5), Tool(‘screwdriver’, 0.5)]

或是回傳一個tuple,sort會依照順序來做比較。

tools = [
    Tool('sander', 4),
    Tool('drill', 4),
    Tool('circular saw', 0.5),
]

tools.sort(key=lambda x: (x.weight, x.name))
print(tools)

Tool(‘circular saw’, 0.5), Tool(‘drill’, 4), Tool(‘sander’, 4)]

另外可以用reverse參數或是負號來做反向排序

tools.sort(key=lambda x: (x.weight, x.name), reverse=True)
print(tools)

[Tool(‘sander’, 4), Tool(‘drill’, 4), Tool(‘circular saw’, 0.5)]

tools.sort(key=lambda x: (-x.weight, x.name), reverse=True)
print(tools)

[Tool(‘circular saw’, 0.5), Tool(‘sander’, 4), Tool(‘drill’, 4)]

Effective PYTHON – 例16: 檢查dictionary key值存在時,使用get而非KeyError

Effective PYTHON 2rd

在使用dictionary時,若key值不存在時會產生KeyError,我們有四種方式可以處理。

counters = {
    'key1': 1,
    'key2': 2
}

key = 'key0'


#法一:
#先檢查key值是否存在
if key in counters:
    count = counters[key]
else:
    count = 0

counters[key] = count + 1


#法二:
#用try/except處理KeyError
try:
    count = counters[key]
except KeyError:
    count = 0

counters[key] = count+1


#法三:
#使用get
count = counters.get(key, 0)
counters[key] = count + 1


#法四:
#使用setdefault
counters.setdefault(key, 0)
counters[key] += 1

get會把第一個引數當作key回傳對應的value,若key不存在不會丟出KeyError而是會回傳第一個引數的值,在此例中就會回傳0。若是沒有第二個引數會回傳None,在此例中應該比較推薦用get的用法。

而setdefault則會把value直接用第二個引數修改。通常是適合用在value是container的狀況,但書中建議這種情況可能要考慮用defaultdic來代替一般的dictionary。

key = 'key0'
votes = {
    'key1': ['Bob', 'Alice'],
    'key2': ['Coco']
}

names = votes.get(key)
if names is None:
    votes[key] = names = []

#或是用 := (Walrus Operator, assignment expression)
if (names := votes.get(key)) is None:
    votes[key] = names = []

#這種情況用setdefault最簡潔
names = votes.setdefault(key, [])

DevOps Handbook中文版|打造世界級技術組織的實踐指南

這本書不如“鳳凰計畫”有名,但我認為就算看過“鳳凰計畫”的人也還是很值得一讀。這本書會把“鳳凰計畫”裡面提到的「三步工作法」詳盡說明,但這本書所提的devops並沒有明確指出要用的流程或是工具,比較偏概念還有各公司採用的devops元素作簡介。

再對本書內容介紹前,我先以自己的解讀做總結。

  1. 自動化開發——bug, feature, 需求的自動化管理。並非只有coding的流程,所有高層主管以及客戶提出的需求都要有自動化的紀錄與追蹤。這樣才能統計所有的意見實行的狀況與成果。
  2. 自動化測試與部署——這是大部分人所以為的devops,但只有這個部分是沒有辦法達成devops的精神
  3. 自動化監控——除了監控以外,還要能提供客觀的方式來做評估產品。
  4. 部署後自動化測試——這也可算是監控的一部分,但自動化的測試可以提供更可靠且客觀的評估。更激烈的手段如“搗亂猴”,甚至主動內部攻擊來做測試。
  5. 將上述步驟以程式化自動執行,反覆循環執行並改進。
  6. 創造由上而下的devops文化,而非只是任命或雇用devops工程師。

目前大部份的devops可能都只關注在第二點,但實際上要從一到五點重覆循環改進才是真正的devops精神。

三步工作法其實是有很多抽象的概念與文化,自動化也只是手段之一。所以我認為最最重要的點還是第六點,要達成的最好方法就是推薦你的同事或主管來閱讀這本書。

[讀書心得] 鳳凰專案-看IT部門如何讓公司從谷底翻身的傳奇故事

FullSizeRender-2

醜話說在前這本書的翻譯品質並不好,一來可能是譯者的翻譯問題二來可能是本書原文作者用字方式較特別。我本人並沒有看過原文,但看過原文的朋友曾表示這本書的英文並不好理解。

撇開翻譯品質的問題,這本書是以小說方式解譯devops,故當成小說來閱讀應該不會有太大問題。因為我只有在硬體系統廠工作的經驗,閱讀時對於這本書常碰到的「deploy」問題較沒有概念,一些專有名詞如ITIL, ITSM也就略過不研究。

這本書以「第一人稱」來描寫比爾這個中階經理在CIO被FIRE後被拉上公司技術總管理人,負責理管全公司約100名工程師。書中的公司雖為一家汽車零件公司,但有許多複雜的IT系統負責生產管理、庫存、零售、薪資、財務等功能。

閱讀更多

[讀書心得] 原來有錢人都這麼做 – The Millionaire Next Door

FullSizeRender-1

書名:原來有錢人都這麼做

作者:湯瑪斯.史丹利(Thomas J. Stanley) 威廉.丹柯(William D. Danko)

譯者:凌瑋

ISBM:978-986-93764-1-9

這本書的中心思想很簡單,就是「儲蓄」。作者認為美國許多高收入份子都過度消費,造成資產不足。作者統計了許多有錢人—-依照他定義是資產在100萬美元以上的家庭,發現大部份有錢人都很節儉。前半本書作者舉出了許多統計資料來幫讀者描繪出大部份有錢人消費方式。後半本書則是講述富二代問題,什麼樣父母容易養出敗家子—-那些愛花錢、且會拿錢資助子女的父母。

作者舉了一個有趣的公式來分別高收入的窮人(作者稱超遜理財族)與真正的有錢人(超優理財族)

淨資產 = 資產-負債 > 年齡÷10×年收入

    但我覺得這個公式非常差,假設一個30歲年收入50萬剛工作三年的年輕人,他要有150萬才能稱為超優理財族,必須工作三年都不吃不喝才能達到。而一個60歲年收100萬的屆退人士只要600萬就可算是有錢人,但這個錢買一棟自住的房子就沒剩多少,不夠退休使用。故我提出一個新公式來改進:

淨資產 > 年齡×工作年數÷100×年收入

     也就是說上述的年輕人只要有45萬淨資產就能算是超優理財族,雖然看起來不多但他得先把收入的30%存下來才能辦到,而那位屆退人士則需要1800萬淨資產才算是有錢人。

閱讀更多

PEOPELWARE 腦力密集產業的人才管理之道管理 – 人力資源 & 辦公室環境

第一部 管理人力資源

這本書初版於1987年,但所談的話題至今依舊是各公司還未能順利排除的問題。作者認為科技業所有管理者面臨的最重要問題不是「技術」而是「社會性」的問題。照理說管理者應該把「技術」問題交給真正專業的部屬,自己應該只需要「管理」與處理「人」的問題,但實務上管理者卻總是感覺非親自去做不可。造問題部份原因是在於管理者所受的訓練大多是如何做好工作,而非如何管理工作。

開發工作本質與產品製造不同,但經理人總是忽略這個問題。他們把員工視為可替換的零件,信奉一個簡單的公式—工作時間 x 投入人力 = 產出,在此一命題下提高產出最好的方式就是減少員工打混摸魚的時間。

閱讀更多

PEOPELWARE 腦力密集產業的人才管理之道管理 – 人力資源 & 辦公室環境

第一部 管理人力資源

這本書初版於1987年,但所談的話題至今依舊是各公司還未能順利排除的問題。作者認為科技業所有管理者面臨的最重要問題不是「技術」而是「社會性」的問題。照理說管理者應該把「技術」問題交給真正專業的部屬,自己應該只需要「管理」與處理「人」的問題,但實務上管理者卻總是感覺非親自去做不可。造問題部份原因是在於管理者所受的訓練大多是如何做好工作,而非如何管理工作。
開發工作本質與產品製造不同,但經理人總是忽略這個問題。他們把員工視為可替換的零件,信奉一個簡單的公式—工作時間 x 投入人力 = 產出,在此一命題下提高產出最好的方式就是減少員工打混摸魚的時間。

閱讀更多

從人到人工智慧,破解AI革命的68個核心概念

ISBN9789862355657

這是一本典型日本式書籍,用一到兩頁介紹一個topic並輔以一頁漫畫,目標就是讓讀者透過快速閱讀來吸收新知。

因為之前有學過資料探勘與機器學習,這本書裡68個題目一半以上算是我學過的東西。原本沒有打算要特別記錄這本書,但最終章討論「人工智慧辦得到與辦不到的事」讓我非常有感觸。

「人工智慧會讓工作消失嗎?」這類的話題最近頻繁出現在各類新聞媒體中,造成不小的恐慌。

但這本書的回答是「不會」,作者認為世上只有少數工作是僅靠單一作業就能完成,而這種單一作業的工作,也已經被機器人取代了。我同意這種說法,在工業革命以前大部人類都是以務農為生,現在各種農用機械發展下還是有不少務農為生的人。並不是說工業革命後十年所有的農夫都被機器取代,工業發展對農業的衝擊是必然只是影響總是漸漸發生。

閱讀更多

蘋果橘子經濟學

ISBN 9789867291936

蘋果橘子經濟學這本書極具知名度,許多沒念過經濟學的人也曾聽過或念過這本書。坦白講這本書離傳統經濟學有相當大的距離既不講供需平衡也不講GDP,不過我想這不影響本書作者原本的初衷以及此書的價值。

這本書有六個獨立章節,以統計資料與經濟的觀點來解釋人類行為。告訴我們很多視為理所當然的事情,實際研究起來卻又跟我們想得不一樣。

「怎樣才算理想的父母?」用統計告訴父母這些養育方式改變不了小孩成績:

  1. 家庭關係親密
  2. 最近搬到較好的社區
  3. 小孩參加過學前輔導
  4. 父母會定期帶小孩上博物館
  5. 小孩常挨打
  6. 小孩常看電視
  7. 父母幾乎天天唸書給小孩聽

而統計上真正有影響下孩成績是下面的因素:

  1. 父母教育程度高
  2. 父母社經地位高
  3. 母親生第一胎時三十歲以上(成績較好)
  4. 小孩出生時體重偏低(成績較差)
  5. 父母在家中說英語
  6. 小孩為領養(成績較差)
  7. 父母參與學校家長會
  8. 家裡有很多書

閱讀更多