Thursday, December 20, 2012

Yukuan's Blog: Be Pythonic -- 字正腔圓說 Python

From Yukuan's Blog: Be Pythonic -- 字正腔圓說 Python


Be Pythonic -- 字正腔圓說 Python

學任一種語言,要說得道地,關鍵是融入語言的風格特色中,體會語言社群的風土,知道他們的慣用法。
既然 Python 寫的 code 有 executable pseudo code 的美稱,想寫出 Pythonic 的 code ,當然要站在一定的高度,讓寫出來的 code 夠 pseudo...

Pythonic 一詞被用來形容合於 Python 慣用法的 code 。Pythonic 的 code 除了讓人們更好理解外,機器執行時,也往往更具效率--語言設計者會絞盡腦汁最佳化語言慣用法的執行效率。這在 Python 這類高階、動態的語言,尤其明顯 :)
幾個 Pythonic 的準則:
  • 讓程式結構盡量扁平(flat)
  • 降低 Loops 的複雜度
    • 少用 counter ,偶爾用一下 iterator
    • 改採 Functional Programming
      • 利用 map, reduce, filter 等 functions
    • 能用 List Comprehensions 更好
  • function 是第一級物件,可以不必定義在 class 裡。
    • 如果只是要為一群公用的 function 分組,應該使用 module
    • 分類複雜時再追加使用 package
    • 需要用到多個 instance 時,才要定義 class
  • 向 getters 及 setters 說「不」
    • 以 keyword parameters 及 default parameters 取代一部分 getters/setters 的需求
    • 或者直接存取 object 的成員變數
    • 必要時,追加使用 property,而不必改到 client code
  • 以 Duck typing 取代不必要的繼承
  • 以 tuple assignment 同時 assign 多個變數
  • 以 tuple assignment 讓 function 傳回多個值
  • 以 Generator Function 達成 Continuation
  • 不要多次叫用 + 或 += 來串接字串
  • 以 eval 來 parsing 字串
  • 只被單一 function 呼叫的 functions ,考慮使用 Closure
  • ……
更詳盡的說明,請參考以下的收集及摘要:
  • Be Pythonic
    • You need counters rarely, and iterators only occasionally
    • You may not need that for loop
    • Tuples are not read-only lists
    • Classes are not for grouping utility functions
    • Say no to getters and setters
    • Functions are objects
  • Python isn't Java without the compile
    • First-class functions
    • Keyword parameters
    • Default parameters
    • Tuples
    • Parallel assignment
    • Efficient multiple return values
    • Continuations
    • User-defined operators
    • Closures
    • Meta-programming
  • Python is Not Java
    • Flat is better than nested
    • Got a switch statement? The Python translation is a hash table, not a bunch of if-then statments.
    • XML is not the answer.
    • Code is easier to write than XML.
    • Getters and setters are evil.
    • Stop Writing So much code
其他相關 links:

Sunday, December 16, 2012

同樣打自傷拳 為何星巴克贏、華碩輸? - Yahoo!奇摩新聞

同樣打自傷拳 為何星巴克贏、華碩輸? - Yahoo!奇摩新聞

Reload 

在戰場上,有一種戰略:原弱勢的競爭者,以表面上可能傷己的行動,爭取反轉契機,靠「拿到的比輸得多」,贏得戰爭;商場上,這樣的戰略也很常見,原本市占率排名居後的競爭者,推出低價產品,發動價格攻勢,務求在最短時間內反轉競爭態勢。這,就是「自蝕策略」。又是什麼情況下,才夠有資格發動「自蝕」戰略呢?

自蝕成功要件一:不能只看市占,還要獲利最大化
二○○七年十月,華碩Eee PC700小筆電推出上市,體積小,功能恰恰好,然而新台幣一萬到一萬五千元售價,僅有傳統筆電的三分之一到二分之一,僅僅二○○八年上半年,華碩Eee PC出貨量超過兩百萬台,遠超過前一年五十萬台的出貨量三倍,華碩在筆電市場的全球市占率,也由第九名提升為第五名。
看來勢頭大好的市場,卻在同年七月市場老二宏碁推出八‧九吋小筆電AspireOne之後,一夕反轉,那一年第四季EeePC因為庫存過多,華碩出現成立十九年以來首次的季虧損。
換句話說,企業在盤算是否發動自蝕策略時,心裡要想的不只是,「我自蝕本身現有產品可以贏得市占率,」還要算算, 一、價格破壞可以做到什麼程度?邊際利潤下降空間有多少?二、如果想要增加總獲利,手上必須還有什麼要件,可以一搏最終勝局。
看看另一個大家都很熟悉的品牌星巴克,在二○○九年三月,所推出的即溶咖啡品牌「VIA Ready Brew」。
自蝕成功要件二:不會影響主力商品,另添動能
即溶咖啡?還有比它更容易侵蝕星巴克既有高價品牌形象的產品嗎?消費者會不會買了星巴克即溶咖啡,就不會去星巴克的店裡消費了?
事實上,在美國每年六百五十億杯咖啡消耗量中,星巴克店裡消費的咖啡量只有四%,即溶咖啡占全部咖啡消耗量的70%,雖然星巴克的即溶咖啡,會降低顧客的來店消費量,但卻可以吸收其他96%的消費者,來購買星巴克即溶咖啡。上市之後,不到八個月時間,就搶下高價即溶咖啡30%市場,而且本業營收繼續成長,並沒有受到侵蝕,也就是說,自蝕並沒有發生,反而搶下了新市場。
講到這裡,讀者一定會說,從華碩或是星巴克的例子來看,自蝕策略是強者越強的戰略,規模不夠大、不能深度掌握市場的玩家,打自蝕價格戰根本不聰明,這答案,可以說對,也可以說不對。
1999年初,台灣行動通訊市場被三家龍頭業者占據:台灣大哥大、中華電信與遠傳共拿下90%市占率,排行市場老四的和信電訊,不僅市占率低,掌握的用戶四成以上都是低貢獻度的預付卡客戶。前三名的業者為了進一步搶占市占率,紛紛推出低於百元的低月租費方案,這個舉動壓縮了和信電訊預付卡業務再成長的空間。
自蝕成功要件三:敢出險招,讓對手不敢跟進
怎麼辦?毫無競爭資源的和信電訊出了險招,推出了針對高貢獻度客戶資費方案「哈啦900」,標榜網內互打五分鐘免費,網外一分鐘通話費率大幅下降。這個對於每個月通話量大的用戶很有價格競爭力的方案,成功讓和信從其他業者手中吸引了高貢獻度的用戶。
和信為什麼敢推?因為它的高貢獻度用戶本來就少,它知道,我從競爭者身上吸收到的,將多於我本身的損失。和信市占率只有10%,其他業者大約都是30%,規模大的業者打算盤,無論如何推出高資費方案都可能得不償失,只會產生價格戰,因此沒有動機去模仿和信的策略,做價格破壞。
自蝕策略能做,前提是你的對手無法或沒有誘因仿效。不管是自身累積的競爭優勢,或是因為市場情勢足以阻絕對手跟進。任何的策略選擇,都是精密的計算與心理戰,在棋盤上衡量對手,也衡量自己的對應能耐,只算下一手是絕對不夠的。
§

##HIDEME##