2008年11月24日

[讀書筆記] Python 核心編程 (Ch1~5)

洗版文,第二版「Core Python Programming」及其簡中版「Python 核心編程」的讀書筆記流水帳。總算定下心開始啃蛇文本瞭......

本書主要是針對 Python 2.5 所寫;至於 Python 3.0 的新特性,可以看 Python 官方的 What’s New In Python 3.0

以下不保證筆記內容的正確性。

前四章算是 Introduction,快速掃過一些 Python 的特色與特性。第五章來插花的,數值類型,沒啥難度。

那麼,開始洗版吧 (>ω<)♪♪

Chapter 1 ~ 4

  • Case sensitive
  • Python Enhancement Proposal 8 是重要的 Python code 風格指南。
  • import this 可印出 The Zen of Python
  • Everything in Python is an object.
  • variable 在第一次被 assign 時自動宣告,且為 dynamic typing。
  • 基本運算元和 C 類似,支援 bitwise operator 和 +=、*= 等,但不支援 ++、- - ( 會以 unary operator 處理 )。
  • 可以使用 2 < 3 < 4 != 5 這樣的述句,由多個隱式 and 連接。
  • andor 有 short-circuit evaluation。
  • 連續程式碼換行的方法:backslash \、連續字串之間 ( 自動串接 )、三引號的跨行字串、小中大括號之間 () [] {}。
  • 基本的分支:if elif else。想用其它語言 switch 那樣的功能,可以把測試值們塞進 list 並用 for 跑它。
  • 基本的迴圈:for while
  • 基本的資料結構:immutable 的 str 和 tuple,以及 mutable 的 list 和 dict。slice 所產生副本其 mutability 也與原先的相同。
  • immutable 是為了效率考量。數字型別也是 immutable 的,i = i + 1 會令 i 指向另一個 object。
  • Python 3.0 的 string 將會全部 unicode 化。
  • 函式定義時可給 default arguments。沒有給定 return value 的函式,會自動返回 None。
  • assignment statement 不會傳回值,但可以 chain。
  • variable 的 reference count 降到 0 或發生無意義的循環引用時,會被 garbage collector 清掉。
  • 增加變數引用計數的方式如:賦值、做為函式參數、容器元素等。trace / debug 時也會增加 object 的引用數。
  • 減少引用計數:離開 scope、原變量名被賦予其它 reference、del statement、從容器 remove 等。
  • 在 Python 的 object 模型中,每個 object 都像一個盒子,引用計數如上面貼的標籤。標籤被撕光的無主物,就會被丟進拉雞車。
  • module 被 import 時,__name__ 的值為 module name。若 module 被直接執行,__name__ 為 "__main__"。
  • 對於 mutable 型別,function argument 以 pass by reference 方式傳遞。immutable type 則是 pass by value。
  • 用 local variable 取代 module variable 除了方便性考量以外,還可以提升性能。
  • print 會自動換行。加個逗號可以扼止這項悲劇。一次丟一堆參數給 print 會在之間自動加入空格。更精細的排版可以用 "%s%d%f" % (str, 10, 3.0) 這樣的方式控制。
  • Python 3.0 中的 print 會全面改為 function 型式以提供更多功能。
  • None、值為 0 的數字、empty container 的 boolean value 都是 False (0)。
  • type 是 Python 所有 class 的 metaclass。
  • == 測試 value equality,而 is 則測試 memorywise equality。
    a is b 等同於 id(a) == id(b)
    例如:print(True is 1) 得到 False
    print(True == 1) 得到 True
    可能的話使用 is 可迴避求值過程的開銷。
  • repr(obj) 取得 obj 的代表字串,適合給 python 看。
    str(obj) 取得 obj 的可讀性較佳的字串,適合給人看 ( print 對物件調用這個函式 )。
    通常 obj == eval(repr(obj)) 是成立的。
  • 有事沒事可以 help(obj) 一下。

Chapter 5: Numbers

  • 數值型別包括整數 int、無限位長整數 long、雙精度 float、複數 complex。摻在一起運算時會自動晉級。
  • int 和 long 未來將合併,不必再煩惱其區別和整數溢位瞭。
  • decimal module 中的 Decimal 可用來表示精確的十進制小數,以免被 IEEE 754 痛整。
  • 目前以運算符 / 對 int 做除法會執行 floor division;未來將改為 real quotient。
  • 運算符 // 總是做 floor division ( 包括對 float 型別也是 )。

沒有留言:

張貼留言