Python 入門學習筆記3
八、切片
8-1 對list進行切片
>>> L[0:3] ['Adam', 'Lisa', 'Bart']L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。
如果第一個索引是0,還可以省略:
>>> L[:3] ['Adam', 'Lisa', 'Bart']
也可以從索引1開始,取出2個元素出來:
>>> L[1:3] ['Lisa', 'Bart']
只用一個 : ,表示從頭到尾:
>>> L[:] ['Adam', 'Lisa', 'Bart', 'Paul']
切片操作還可以指定第三個引數:
>>> L[::2] ['Adam', 'Bart']第三個引數表示每N個取一個,上面的 L[::2] 會每兩個元素取出一個來,也就是隔一個取一個。
把list換成tuple,切片操作完全相同,只是切片的結果也變成了tuple。
8-2 倒序切片
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] >>> L[-2:] ['Bart', 'Paul'] >>> L[:-2] ['Adam', 'Lisa'] >>> L[-3:-1] ['Lisa', 'Bart'] >>> L[-4:-1:2] ['Adam', 'Bart']
8-3 對字串切片
字串 'xxx'和 Unicode字串 u'xxx'也可以看成是一種list,每個元素就是一個字元。因此,字串也可以用切片操作,只是操作結果仍是字串:>>> 'ABCDEFG'[:3] 'ABC' >>> 'ABCDEFG'[-3:] 'EFG' >>> 'ABCDEFG'[::2] 'ACEG'
九、迭代
9-1 什麼是迭代
迭代操作就是對於一個集合,無論該集合是有序還是無序,我們用 for 迴圈總是可以依次取出集合的每一個元素。注意: 集合是指包含一組元素的資料結構,我們已經介紹的包括: 1. 有序集合迭代與按下標訪問陣列最大的不同是,後者是一種具體的迭代實現方式,而前者只關心迭代結果,根本不關心迭代內部是如何實現的。:list,tuple,str和unicode; 2. 無序集合:set 3. 無序集合並且具有 key-value 對:dict
9-2 索引迭代
Python中,迭代永遠是取出元素本身,而非元素的索引。對於有序集合,元素確實是有索引的。有的時候,我們確實想在 for 迴圈中拿到索引,怎麼辦?
方法是使用 enumerate() 函式:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] >>> for index, name in enumerate(L): ... print index, '-', name ... 0 - Adam 1 - Lisa 2 - Bart 3 - Paul實際上,enumerate() 函式把:
['Adam', 'Lisa', 'Bart', 'Paul']變成了類似:
[(0, 'Adam'), (1, 'Lisa'), (2, 'Bart'), (3, 'Paul')]因此,迭代的每一個元素實際上是一個tuple。
可見,索引迭代也不是真的按索引訪問,而是由 enumerate() 函式自動把每個元素變成 (index, element) 這樣的tuple,再迭代,就同時獲得了索引和元素本身。
9-3 迭代dict的value
我們已經瞭解了dict物件本身就是可迭代物件,用 for 迴圈直接迭代 dict,可以每次拿到dict的一個key。
如果我們希望迭代 dict 物件的value,應該怎麼做?
dict 物件有一個 values() 方法,這個方法把dict轉換成一個包含所有value的list,這樣,我們迭代的就是 dict的每一個 value:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } print d.values() # [85, 95, 59] for v in d.values(): print v# 85 # 95 # 59
如果仔細閱讀Python的文件,還可以發現,dict除了values()方法外,還有一個 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一樣:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } print d.itervalues() # <dictionary-valueiterator object at 0x106adbb50> for v in d.itervalues(): print v # 85 # 95 # 59
那這兩個方法有何不同之處呢?
1. values() 方法實際上把一個 dict 轉換成了包含 value 的list。
2. 但是 itervalues() 方法不會轉換,它會在迭代過程中依次從 dict 中取出 value,所以 itervalues() 方法比 values() 方法節省了生成 list 所需的記憶體。
3. 列印 itervalues() 發現它返回一個 <dictionary-valueiterator> 物件,這說明在Python中,for 迴圈可作用的迭代物件遠不止 list,tuple,str,unicode,dict等,任何可迭代物件都可以作用於for迴圈,而內部如何迭代我們通常並不用關心。
如果一個物件說自己可迭代,那我們就直接用 for 迴圈去迭代它,可見,迭代是一種抽象的資料操作,它不對迭代物件內部的資料有任何要求。
9-4 迭代dict的key和value
>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } >>> print d.items() [('Lisa', 85), ('Adam', 95), ('Bart', 59)]可以看到,items() 方法把dict物件轉換成了包含tuple的list,我們對這個list進行迭代,可以同時獲得key和value:
>>> for key, value in d.items(): ... print key, ':', value ... Lisa : 85 Adam : 95 Bart : 59和 values() 有一個 itervalues() 類似, items() 也有一個對應的 iteritems(),iteritems() 不把dict轉換成list,而是在迭代過程中不斷給出 tuple,所以, iteritems() 不佔用額外的記憶體。
十、列表生成式
10-1 生成列表
要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我們可以用range(1, 11):>>> range(1, 11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]另外range(1, 100, 2) 可以生成list [1, 3, 5, 7, 9,...] 如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎麼做?迴圈太繁瑣,而列表生成式則可以用一行語句代替迴圈生成上面的list:
>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]這種寫法就是Python特有的列表生成式。利用列表生成式,可以以非常簡潔的程式碼生成 list。
寫列表生成式時,把要生成的元素 x * x 放到前面,後面跟 for 迴圈,就可以把list創建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。
10-2 複雜表示式
使用for迴圈的迭代不僅可以迭代普通的list,還可以迭代dict。
假設有如下的dict:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
完全可以通過一個複雜的列表生成式把它變成一個 HTML 表格:
tds = ['<tr><td>%s</td><td>%s</td></tr>' % (name, score) for name, score in d.iteritems()] print '<table>' print '<tr><th>Name</th><th>Score</th><tr>' print '\n'.join(tds) print '</table>'
注:字串可以通過 % 進行格式化,用指定的引數替代%s。字串的join()方法可以把一個 list 拼接成一個字串。
10-3 條件過濾
列表生成式的 for 迴圈後面還可以加上 if 判斷。例如:>>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100]有了 if 條件,只有 if 判斷為 True 的時候,才把迴圈的當前元素新增到列表中。
10-4 多層表示式
for迴圈可以巢狀,因此,在列表生成式中,也可以用多層 for 迴圈來生成列表。對於字串 'ABC' 和 '123',可以使用兩層迴圈,生成全排列:
>>> [m + n for m in 'ABC' for n in '123'] ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
斷斷續續學完了該入門課程,筆記也簡單記錄完了。很多內容直接複製老師的課件,請見諒。不過對有程式設計經驗的人,儘快上手Python還是挺推薦該課程的。下面是對該課程的評價。 個人覺得課程還是不錯的,對於入門或者初學者來說,也就是有C或java程式設計經驗的人。
對有程式設計經驗的人來說,快速過一遍該課程,有動手實踐,能夠快速過一遍Python的語法,印象深刻些,不像看書會枯燥和內容多。
課程邏輯清晰,比如怎樣遍歷、訪問、更新dict和set,這樣,當不記得時,有了個印象就可以快速回頭翻這裡。
總體來說,能夠幫助有程式設計經驗的人快速上手。
Python 檔案型別
Hello.py 是如何被執行的?.pyc檔案相比於源程式,可以提高載入速率;不能提高執行速率。
.pyo檔案是優化編譯的.pyc檔案