1 深入條件控制
小記:程式設計風格
- 使用 4 空格縮排,而非 TAB:在小縮排(可以巢狀更深)和大縮排(更易讀)之間,4空格是一個很好的折中。TAB 引發了一些混亂,
- 使用空行分隔函式和類,以及函式中的大塊程式碼,可能的話,註釋獨佔一行
- 把空格放到操作符兩邊,以及逗號後面,但是括號裡側不加空格:a = f(1, 2) + g(3, 4)
- 統一函式和類命名:推薦類名用 駝峰命名, 函式和方法名用 小寫_和_下劃線。
- Python 的預設情況下,UTF-8最好
while 和 if 語句中使用:比較和包含。
比較操作符 in 和 not in 稽核值是否在一個區間之內。
比較操作可以傳遞。例如 a < b == c 稽核是否 a 小於 b 並且 b 等於 c。
邏輯操作符 and 和 or 組合,not 具有最高的優先順序, or 優先順序最低,所以 A and not B or C 等於 (A and (notB)) or C。
邏輯操作符 and 和 or 引數從左向右解析,結果確定就停止。例如,如果 A 和 C 為真而 B 為假, A and B and C 不會解析 C。
可以把比較或其它邏輯表示式的返回值賦給一個變數,例如:
1
2
3
4
|
>>> string1, string2, string3 = '' , 'Trondheim' , 'Hammer Dance' >>> non_null = string1 or string2 or string3 >>> non_null 'Trondheim' |
解釋:and 和 or 引數從左向右解析,結果確定就停止。string1 or string2 為True,列印string2是值,後面忽略即string3。
比較序列和其它型別:序列物件可以與相同型別的其它物件比較。
首先比較前兩個元素,如果不同,就決定了比較的結果;如果相同,就比較後兩個元素,依此類推,直到所有序列都完成比較。
1
2
3
4
5
6
|
>>> (1,3,67)<(1,4,2) True >>> (1,3,67)>(1,4,2) False >>> [1, 2, 3] < [1, 2, 4] True |
如果兩個元素本身就是同樣型別的序列,就遞迴字典序比較。如果兩個序列的所有子項都相等,就認為序列相等。
1
2
|
>>> (1, 2, 3) == (1.0, 2.0, 3.0) True |
如果一個序列是另一個序列的初始子序列,較短的一個序列就小於另一個。字串的字典序按照單字元的 ASCII 順序。
1
2
3
4
|
>>> (1, 2) < (1, 2, -1) True >>> (1, 2, ( 'aa' , 'ab' )) < (1, 2, ( 'abc' , 'a' ), 4) True |
2 基本的列表物件方法
List列表基本操作概要:
list.append(x):元素新增到連結串列的結尾,相當於 a[len(a):] = [x]。
list.extend(L):給定列表所有元素新增,相當於 a[len(a):] = L。
list.insert(i, x):指定位置插入。其中list.insert(0, x)=插入連結串列首,list.insert(len(a), x)=list.append(x)=插入連結串列尾
list.remove(x):刪除連結串列指定元素。
list.pop([i]):指定索引下刪除元素,a.pop() 返回最後一個元素。
list.clear():刪除所有元素。相當於 del a[:]。
list.index(x):返回連結串列首個值 x 的索引。
list.count(x):統計元素 x出現的次數。
list.sort():排序。
list.reverse():倒排連結串列。
list.copy():淺拷貝。等同於 a[:]。
操作執行程式碼:
1
2
3
4
5
6
7
8
9
10
11
|
a = [66.25, 333, 333, 1, 1234.5] print(a.count(333), a.count(66.25), a.count( 'x' )) a.insert(2, -1) a.append(333) [66.25, 333, -1, 333, 1, 1234.5, 333] a.index(333) a.remove(333) a.reverse() [333, 1234.5, 1, 333, -1, 66.25] a.sort() a.pop() |
List連結串列的多重共用
連結串列當作堆疊用:連結串列特性先進後出跟堆疊性質一致,進:append,出:pop:
程式例項演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> stack = [3, 4, 5] >>> stack.append(6) >>> stack.append(7) >>> stack [3, 4, 5, 6, 7] >>> stack.pop() 7 >>> stack [3, 4, 5, 6] >>> stack.pop() 6 >>> stack [3, 4,5] |
連結串列當作佇列使用:如上演示,知道連結串列具備先進後出的性質,即符合堆疊性質。大家記得否連結串列索引可以為負數,如此你是不是想到先進先出啦?對嘍,這就是佇列的性質我們完全可以當著佇列用。列表這樣用效率不高。在頭部插入和彈出很慢,因為一個元素出隊,要移動整個列表中的所有元素。要實現佇列,使用 集合collections.deque,它為在首尾兩端快速插入和刪除而設計。例如:
程式執行例項:
1
2
3
4
5
6
7
8
9
10
|
>>> from collections import deque >>> queue = deque([ "Eric" , "John" , "Michael" ]) >>> queue.append( "Terry" ) # Terry arrives >>> queue.append( "Graham" ) # Graham arrives >>> queue.popleft() # The first to arrive now leaves 'Eric' >>> queue.popleft() # The second to arrive now leaves 'John' >>> queue # Remaining queue in order of arrival deque([ 'Michael' , 'Terry' , 'Graham' ]) |
列表推導:如下例項快速解析理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>>> [(user,name) for user in [ 'bnc' , 'ad' , 'admin' ] for name in [ 'boy' , 'xiaoming' , 'bnc' , 'admin' ] if user==name] [( 'bnc' , 'bnc' ), ( 'admin' , 'admin' )] 等同 >>> combs = [] >>> for user in [ 'bnc' , 'ad' , 'admin' ]: ... for name in [ 'boy' , 'xiaoming' , 'bnc' , 'admin' ]: ... if user == name: ... combs.append((user, name)) ... >>> combs [( 'bnc' , 'bnc' ), ( 'admin' , 'admin' )] >>> # call a method on each element >>> freshfruit = [ ' banana' , ' loganberry ' , 'passion fruit ' ] >>> [weapon.strip() for weapon in freshfruit] [ 'banana' , 'loganberry' , 'passion fruit' ] |
連結串列做文字處理矩陣計算:交換行列
#由三個長度為 4 的列表組成的 3x4 矩陣,交換行列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> matrix = [ ... [1, 2, 3, 4], ... [5, 6, 7, 8], ... [9, 10, 11, 12], ... ] >>> [[row[i] for row in matrix] for i in range(4)] [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 等於 >>> transposed = [] >>> for i in range(4): ... transposed.append([row[i] for row in matrix]) ... >>> transposed [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] |
3 del語句
del語句:不同於有返回值的 pop() 方法,其按索引來刪除子項
1
2
3
4
5
6
7
8
9
10
|
>>> a = [-1, 1, 66.25, 333, 333, 1234.5] >>> del a[0] >>> a [1, 66.25, 333, 333, 1234.5] >>> del a[2:4] # 切片 >>> a [1, 66.25, 1234.5] >>> del a[:] >>> a [] |
4 元組、序列、集合和字典
元組和列表的區別:
元組:不同種類元素,不可變;
列表:相同種類的元素,可變
1
2
3
4
5
6
7
8
9
|
>>> t = 12345, 54321, 'hello!' >>> t[0] 12345 >>> t (12345, 54321, 'hello!' ) >>> # Tuples may be nested: ... u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, 'hello!' ), (1, 2, 3, 4, 5)) |
set集合
特點:set集合是無序不重複元素的集。
基本功能:關係測試和消除重複元素。還支援 union(聯合),intersection(交),difference(差)和 sysmmetric difference(對稱差集)等數學運算。
集合建立:大括號或 set() 函式。注意:空集合的建立必須使用 set() 而不是 {}。{}可以用於建立空字典。
集合例項演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
>>> basket = { 'apple' , 'orange' , 'apple' , 'pear' , 'orange' , 'banana' } >>> print(basket) # show that duplicates have been removed { 'orange' , 'banana' , 'pear' , 'apple' } >>> 'orange' in basket # fast membership testing True >>> 'crabgrass' in basket False >>> # Demonstrate set operations on unique letters from two words >>> a = set ( 'abracadabra' ) >>> b = set ( 'alacazam' ) >>> a # unique letters in a { 'a' , 'r' , 'b' , 'c' , 'd' } >>> a - b # letters in a but not in b { 'r' , 'd' , 'b' } >>> a | b # letters in either a or b { 'a' , 'c' , 'r' , 'd' , 'b' , 'm' , 'z' , 'l' } >>> a & b # letters in both a and b { 'a' , 'c' } >>> a ^ b # letters in a or b but not both { 'r' , 'd' , 'b' , 'm' , 'z' , 'l' } |
類似 列表推導式,這裡有一種集合推導式語法:
1
2
3
|
>>> a = {x for x in 'abracadabra' if x not in 'abc' } >>> a { 'r' , 'd' } |
字典
字典以 關鍵字 為索引,關鍵字可以是任意不可變型別,通常用字串或數值。字典本質是無序鍵值對 (key:value 對)集合,同一字典內鍵必須是互不相同的。
字典建立: {} 。
主要操作:據鍵儲存和析取值。可用 del 來刪除鍵:值對(key:value)。
排序: sorted(d.keys()) )。
檢查字典:用 in 關鍵字檢查字典中是否存在某個關鍵字。
字典例項演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
>>> tel = { 'jack' : 4098, 'sape' : 4139} >>> tel[ 'guido' ] = 4127 >>> tel { 'sape' : 4139, 'guido' : 4127, 'jack' : 4098} >>> tel[ 'jack' ] 4098 >>> del tel[ 'sape' ] >>> tel[ 'irv' ] = 4127 >>> tel { 'guido' : 4127, 'irv' : 4127, 'jack' : 4098} >>> list(tel.keys()) [ 'irv' , 'guido' , 'jack' ] >>> sorted(tel.keys()) [ 'guido' , 'irv' , 'jack' ] >>> 'guido' in tel True >>> 'jack' not in tel False |
dict() 建構函式可以直接從 key-value 對中建立字典:
1
2
3
4
5
6
7
8
9
10
|
>>> dict([( 'sape' , 4139), ( 'guido' , 4127), ( 'jack' , 4098)]) { 'sape' : 4139, 'jack' : 4098, 'guido' : 4127} >>> dict(sape=4139, guido=4127, jack=4098) { 'sape' : 4139, 'jack' : 4098, 'guido' : 4127} >>> tel={x:x**2 for x in range(2,12,3)} >>> list(tel.keys()) [8, 2, 11, 5] >>> sorted(tel.keys()) [2, 5, 8, 11] |
5 迴圈技巧
字典迴圈,關鍵字和對應的值可以使用 items() 方法同時解讀出來:
1
2
3
4
5
6
|
>>> knights = { 'gallahad' : 'the pure' , 'robin' : 'the brave' } >>> for k, v in knights.items(): ... print(k, v) ... gallahad the pure robin the brave |
在序列中迴圈時,索引位置和對應值可以使用 enumerate() 函式同時得到:
1
2
3
4
5
|
>>> for i, v in enumerate([ 'tic' , 'tac' , 'toe' ]): print(i, v) 0 tic 1 tac 2 toe |
同時迴圈兩個或更多的序列,可以使用 zip() 整體打包:
1
2
3
4
5
6
7
|
>>> questions = [ 'name' , 'quest' , 'favorite color' ] >>> answers = [ 'lancelot' , 'the holy grail' , 'blue' ] >>> for q, a in zip(questions, answers): print( 'What is your {0}? It is {1}.' .format(q, a)) What is your name? It is lancelot. What is your quest? It is the holy grail. What is your favorite color? It is blue. |
需要逆向迴圈序列的話,先正向定位序列,然後呼叫 reversed() 函式:
1
2
3
4
5
6
7
|
>>> for i in reversed(range(1, 10, 2)): print(i) 9 7 5 3 1 |
要按排序後的順序迴圈序列的話,使用 sorted() 函式,它不改動原序列,而是生成一個新的已排序的序列:
1
2
3
4
5
6
7
|
>>> basket = [ 'apple' , 'orange' , 'apple' , 'pear' , 'orange' , 'banana' ] >>> for f in sorted( set (basket)): print(f) apple banana orange pear |
若要在迴圈內部修改正在遍歷的序列(例如複製某些元素),建議您首先製作副本。在序列上迴圈不會隱式地建立副本。切片表示法使這尤其方便:
1
2
3
4
5
6
7
|
>>> words = [ 'cat' , 'window' , 'defenestrate' ] # Loop over a slice copy of the entire list. >>> for w in words[:]: if len(w) > 6: words.insert(0, w) >>> words [ 'defenestrate' , 'cat' , 'window' , 'defenestrate' ] |
6 參考文獻和推薦資料
- Python 官方網站 :包含程式碼、文件和 Web 上與 Python 有關的頁面連結該網站映象於全世界的幾處其它問題,類似歐洲、日本和澳大利亞。映象可能會比主站快,這取決於你的地理位置
- 快速訪問 Python 的文件
- Python 包索引 :索引了可供下載的,使用者建立的 Python 模組。如果你釋出了程式碼,可以註冊到這裡,這樣別人可以找到它
- The Scientific Python : 專案包括陣列快速計算和處理模組,和大量線性代數、傅立葉變換、非線性solvers、隨機數分佈,統計分析以及類似的包
- 官方python學習文件
- 簡明Python教程
- 廖雪峰:python教程
- Python官網文件
- 【51cto學院,入門課程】Python零基礎入門學習視訊教程
- 【個人部落格:案例】GitHub資料提取與分析
- 【csdn】python知識庫
- 【社群】python中文學習大本營
- 【個人部落格】老王python
-
【51cto學院】如何用python開發跨平臺的記事本視訊課程
-
【51cto學院,網站開發】臺灣輔仁大學:Python Django基礎視訊課程
-
【51cto學院,網站開發】用Python Django快速做出高大上的BBS論壇網站