Practical Programming-An Introduction to Computer Science Using Python 這本書是Jennifer Campbell等著,唐學韜(汕頭大學)譯,全書300頁,雖內容很少,但我的認爲譯者比較負責,如未統一的專有詞都給出英文原詞,全書風格一致。 python
Python以簡單爲美,本書也相似風格,是一本實踐型入門讀物,不是參考手冊。因不是第一次接觸Python,因此本筆記較粗糙,只記錄應該注意的地方。 算法
Jeannette Wing教授認爲計算型思惟主要包括如下內容: sql
注意浮點數的數值精度問題,不然可能冷不丁地出錯,數值分析(numerical analysis,研究近似數學算法的學科)自己就是計算機科學和數學領域的最大分支。 數據庫
round() 內置的四捨五入函數。 編程
形參(parameter,函數定義時的)與實參(argument,函數調用時傳入的)的區別。 api
pass app
Python不容許「凍結」變量,即沒有常量。 ide
內置函數位於__builtin__模塊中,能夠用dir函數查看。Python 2.5 有135個成員,Python 2.7.3有146個成員。 函數
字符串方法 capitalize() 返回字符串的首字母大寫副本。 oop
Nose測試庫,及面向對象的unittest測試庫
#calc.py #encoding: UTF-8 def adds(a, b): return a + b
#test_calc.py #coding: UTF-8 import nose import calc def test_adds(): assert calc.adds(1, 2) == 4 if __name__ == '__main__': nose.runmodule()
列表是異構的,能夠包含任何類型的數據。
id() 函數查看對象地址。
[:] 建立列表完整副本。
別名(alias)機制,兩個變量引用同一個值時,就互爲別名。
一個元素的元組是(e,) 而不是(e)
元組不可變(immutable)。不該該說某種東西"位於"元組中,這是不嚴謹的,應該說:「元組在建立後,其所包含的引用就不能再修改了」,而這些引用所指向的對象自己則仍然是能夠修改的。
「兼容或」(inclusive or, 即通常意義上的「或」),「互斥或」(exclusive or, 即「異或」)
運算符串聯:3 < x < 5 實際上是這樣執行的 (3 < x) and (x < 5) 強烈建議只按照數學上看起來正常的方式去連接比較運算。
0, None, 空字符串, [], {}都被看作False
多值賦值(multivalued assignment) a, b = b, a
enumerate() 返回「值對」組成的列表
Python經過運行時棧(runtime stack)去跟蹤全部正在運行的函數。能夠將運行時棧想象成一級記錄序列,稱爲幀。當調用函數時,就會放入該序列的頂端。只有最頂部的那一幀是活動的。不屬於任何函數的那些代碼都是在一個特殊的幀內執行的,它位於運行時棧的最底部,該幀叫着<module>,由於它是在模塊級別上執行的。
若是文件每行的列是固定的,又想提取各列,能夠定義一個各列寬度的元組,方便後面使用列表切割每行
fields = (2, 3, 4)若想轉換成各類格式,能夠這樣
fileds = ((2, int), (3, int), (4, float)) for line in f: start = 0 record = [] for (width, target_type) in fileds: text = line[start: start + width] filed = target_type(text) record.append(filed) start += width
read_block() 函數能夠返回多值,以吐出它讀進的行
block, line = read_block(f, line)
set(集合)對象有不少數學集合運算的函數
Python集合是以散列碼存元素的位置,因此集合中的元素必需爲不可變(immutable)值。實際上,元組存在的理由之一便是讓咱們可以將('Albert', 160)之類的複合值添加到集合中去。
字典dict也稱爲映射map。
判斷某個鍵是否在字典中能夠直接使用 k in d。
dict.get(k [,d]) 若指定鍵不存在,則返回用戶設定的d,經過這個能夠直接實現統計元素:
d[k] = d.get(k, 0) + 1
找出列表中最小兩個值的3種算法:
看起來簡單,實現中有不少細節。
實現了幾個簡單的搜索與排序算法,內置的list.sort(),list.index()函數效率不低。
默認參數值,可變參數列表(*)((**)這個沒講到),命名參數。
異常對象,Python會維護一個異常處理器棧,相似於函數調用棧。當異常發生引起以後,依次從這個棧中取出異常處理器,直到找到匹配爲止,因此except有順序的。
引起異常 raise 異常類型(說明具體問題的錯誤消息),如:raise ValueError('divisor is zero')
測試與測試驅動開發。
模式:其中之一就是變量,變量一般都是以某種固有方式使用的:
特殊方法__init__()
dir() 與help()函數
oo的一點理論知識:
model-view-controller
事件驅動編程(enent-driven programming)可以隨時對輸入進行響應。
有趣的lambda理解:
>>> lambda:2 <function <lambda> at 0x01DA9E70> >>> (lambda: 2)() 2
上面代碼中,第一行中的表達式lambda: 2 建立了一個匿名函數,該函數的功能就是返回3。第二個表達式建立並當即執行了一樣的函數。
lamdba函數用在事件點擊函數。
#!/usr/bin/env python #encoding: utf-8 import Tkinter as tk window = tk.Tk() # the module counter = tk.IntVar() counter.set(0) # general controller def click(var, value): var.set(var.get() + value) # the views frame = tk.Frame(window) frame.pack() button = tk.Button(frame, text='up', command=lambda: click(counter, 1)) button.pack() button = tk.Button(frame, text='down', command=lambda: click(counter, -1)) button.pack() label = tk.Label(frame, textvariable=counter) label.pack() windos.mainloop()
#encoding: UTF-8 import Tkinter as tk class Counter(object): """docstring for Counter""" def __init__(self, parent): super(Counter, self).__init__() # framework self.parent = parent self.frame = tk.Frame(parent) self.frame.pack() # model self.state = tk.IntVar() self.state.set(1) # Label displaying current state self.label = tk.Label(self.frame, textvariable=self.state) self.label.pack() # button to control application self.up = tk.Button(self.frame, text='up', command=self.upClick) self.up.pack(side='left') self.right = tk.Button(self.frame, text='quit', command=self.quitClick) self.right.pack(side='left') def upClick(self): self.state.set(self.state.get() + 1) def quitClick(self): self.parent.destroy() if __name__ == '__main__': window = tk.Tk() myapp = Counter(window) window.mainloop()
事務(transaction)
import sqlite3 as dbapi con = dbapi.connect('database.db') # 建立遊標 cur = con.cursor() # 執行建立命令 cur.execute('create table tablename(id INTERGER, name TEXT') # 提交 cur.commit() # 獲取數據 cur.execute('select name from tablename') # 打印查詢 print cur.fetchone()
不建議用NULL來處理缺失的數據。
鍵和約束。
高級功能:聚合,分組,自鏈接,嵌套查詢