Python入門
Python與其他語言相比的優勢
Python與C和Java相比,運行速度較慢。但隨着技術發展,CPU運行速度越來越快,性能的瓶頸往往不在CPU的運行速度,而在網絡和數據庫的調用上。這就和電瓶車與轎車在堵車時的運行速度一樣,與車本身的運行速度無關。
Python變量和數據類型
Python中的布爾類型
a = 'python'
print 'hello,', a or 'world' #hello, python
b = ''
print 'hello,', b or 'world' #hello, word
Python之創建tuple
- tuple和list非常類似,但是,tuple一旦創建完畢,就不能修改了。創建tuple和創建list唯一不同之處是用()替代了[]
t = ('Adam','Lisa','Bart')
- 單元素tuple要多加一個逗號,避免歧義
t=(1,)
Python中什麼是set
- 創建set的方式是調用set()並傳入一個list,list的元素將作爲set的元素
- set中的元素不重複且無序
- 用add()可以直接添加,而remove()前需要判斷。因爲remove()不存在的元素會報錯
Python之調用函數
- Python的函數返回多值其實就是返回一個tuple,但可以省略括號,寫起來更方便
第一個Python程序
輸入和輸出
- Python提供了一個input(),可以讓用戶輸入字符串,並存放到一個變量裏
>>> name = input()
Michael
Python基礎
數據類型和變量
- 整數的地板除//永遠是整數,即使除不盡。要做精確的除法,使用/就可以。
使用list和tuple
- 只有1個元素的tuple定義時必須加一個逗號,,來消除歧義
>>> t = (1,)
>>> t
(1,)
使用dict和set
- 要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除
- 對於不變對象來說,調用對象自身的任意方法,也不會改變該對象自身的內容。相反,這些方法會創建新的對象並返回,這樣,就保證了不可變對象本身永遠是不可變的。
函數
函數的參數
- *args是可變參數,args接收的是一個tuple;**kw是關鍵字參數,kw接收的是一個dict。
生成器
- 如果一個函數定義中包含yield關鍵字,那麼這個函數就不再是一個普通函數,而是一個generator
迭代器
- 凡是可作用於for循環的對象都是Iterable類型;凡是可作用於next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;集合數據類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。
返回函數
- 返回閉包時牢記的一點就是:返回函數不要引用任何循環變量,或者後續會發生變化的變量。如果一定要引用循環變量怎麼辦?方法是再創建一個函數,用該函數的參數綁定循環變量當前的值,無論該循環變量後續如何更改,已綁定到函數參數的值不變
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被執行,因此i的當前值被傳入f()
return fs
序列化
- Pytho語言特定的序列化模塊是pickle,但如果要把序列化搞得更通用、更符合Web標準,就可以使用json模塊
- json模塊的dumps()和laods()函數是定義得非常好的接口的典範。當我們使用時,只需要傳入一個必須的參數。
進程和線程
多進程
- 在Unix/Linux下,可以使用fork()調用實現多進程
- 要實現跨平臺的多進程,可以使用multiprocessing模塊
- 進程間的通信是通過Queue、Pipes等實現的
多線程
- 多線程編程,模型複雜,容易發生衝突,必須用鎖加以隔離,同時,又要小心死鎖的發生
- Python解釋器由於設計時有GIL全局鎖,導致了多線程無法利用多核。多線程的併發在Python中就是一個美麗的夢。但可以通過多進程實現多核任務。多個Python進程有各自獨立的GIL鎖
- 一個ThreadLocal變量雖然是全局變量,但每個線程都只能讀寫自己線程的獨立副本,互補干擾。ThreadLocal解決了參數在一個線程中各個函數之間互相傳遞的問題
- 在Thread和Porcess中,應當優先選擇Process,因爲Process更穩定