1. 程式人生 > >python基礎教程(第三版)學習筆記(十)

python基礎教程(第三版)學習筆記(十)

第十章 開箱即用
本章簡要介紹模組的工作原理以及如何探索模組以獲悉其提供的功能,然後概述標準庫,重點是幾個很有用的模組。

10.1 模組
使用import將函式從外部模組匯入到程式中。
'''

import math as ma
Pi=3.1415926
v=ma.sin(Pi/6)
print(v)

'''

0.49999999226497965


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


10.1.1 模組就是程式
建立模組很簡單,只要新建一個檔案把它定義為xx.py儲存。在另一個檔案中加入import xx(明示檔案地址)即可呼叫這個檔案中的內容,這個xx.py就是模組。檔案的儲存位置也很重要,地址不對也不能呼叫此模組。
另外還可以把作為模組檔案的地址設定到系統path的引數,這樣在呼叫時就不需要明示模組地址了。
在一個檔案中呼叫模組,只需呼叫以此。
10.1.2 模組是用來下定義的
在模組中定義的類和函式以及對其進行賦值的變數都將成為模組的屬性。
1. 在模組中定義函式
在程式中訪問模組中的函式格式為:模組名.函式名
在模組的全域性作用域內定義的名稱都可像上面這樣訪問。
2. 在模組中新增測試程式碼
模組是為了重用程式碼,其中只能定義類、函式和變數及常量,不能把例項化的類和呼叫函式作為模組的引入內容。
在主程式中(包括直譯器的互動式提示符),變數__name__的值是'__main__',而在匯入的模組中,這個變數被設定為該模組的名稱。因此,要讓模組中測試程式碼的行為更合理,可將其放在一條if語句中,
如把xx.py檔案作為模組:
'''

#xx.py
def hello():
    pass
def test():
    hello()
if __name__=='__main__':test()

'''
10.1.3 讓模組可用
1. 將模組放在正確的位置
可在模組sys的變數path中找到目錄列表(即搜尋路徑)。
'''

import sys,pprint   #引入sys和pprint兩個模組
pprint.pprint(sys.path)

'''

['E:\\pythonProjects',
 'C:\\Users\\xx\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip',
 'C:\\Users\\xx\\AppData\\Local\\Programs\\Python\\Python37\\DLLs',
 'C:\\Users\\xx\\AppData\\Local\\Programs\\Python\\Python37\\lib',
 'C:\\Users\\xx\\AppData\\Local\\Programs\\Python\\Python37',
 'C:\\Users\\xx\\AppData\\Roaming\\Python\\Python37\\site-packages',
 'C:\\Users\\xx\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages
']


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


注:如果要列印的資料結構太大,一行容納不下,可使用模組pprint中的函式pprint(而不是普通print語句)。pprint是個卓越的列印函式,能夠更妥善地列印輸出。
只要模組位於類似於site-packages這樣的地方並在檔名前加入another_字首,所有的程式就都能夠匯入它。
2. 告訴直譯器到哪裡去查詢
標準做法是設定系統變數PYTHONPATH,並把模組所在的目錄包含在系統環境變數PYTHONPATH中。
10.1.4 包
為組織模組,可將其編組為包(package)。包其實就是另一種模組,但有趣的是它們可包含其他模組。模組儲存在副檔名為.py的檔案中,而包則是一個目錄。在成為包的目錄中必須包含__init__.py檔案,無論此檔案中有沒有內容。
要將模組加入包中,只需將模組檔案放在包目錄中即可。在包中巢狀其他包。
假如檔案的包結構如下:
~/python/ PYTHONPATH中的目錄
~/python/drawing/ 包目錄(包drawing)
~/python/drawing/__init__.py 包程式碼(模組drawing)
~/python/drawing/colors.py 模組colors
~/python/drawing/shapes.py 模組shapes
引入程式碼如下:
'''
'''

import drawing             # (1) 匯入drawing包
import drawing.colors      # (2) 匯入drawing包中的模組colors
from drawing import shapes # (3) 匯入模組shapes


'''

'''
那麼,執行第1條語句後,便可使用目錄drawing中檔案__init__.py的內容,但不能使用模組shapes和colors的內容。執行第2條語句後,便可使用模組colors,但只能通過全限定名drawing.colors來使用。執行第3條語句後,便可使用簡化名(即shapes)來使用模組shapes。請注意,這些語句只是示例,並不用像這裡做的那樣,先匯入包再匯入其中的模組。換而言之,完全可以只使用第2條語句,第3條語句亦如此。

10.2 探索模組
如何探索模組。這是一種很有用的技能。
10.2.1 模組包含什麼
要探索模組,最直接的方式是使用Python直譯器進行研究。
i、將模組匯入
ii、要查明模組包含哪些東西,可使用函式dir,它列出物件的所有屬性(對於模組,它列出所有的函式、類、變數等)。dir(包名)。用[n for n in dir(包名) if not n.startswith('_')] 過濾下劃線。
1、__all__屬性
這個變數包含一個列表,它與前面使用列表推導建立的列表類似,但是在模組內部設定的。
下面以copy這個包為例來看看這個列表包含的內容:
'''

import copy
li_copy=dir(copy)
pprint.pprint(li_copy)
print('*'*80)
li=[n for n in dir(li_copy) if not n.startswith('_')]
print(li)
print('&'*80)
al=copy.__all__
print(al)

'''

['Error',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_copy_dispatch',
 '_copy_immutable',
 '_deepcopy_atomic',
 '_deepcopy_dict',
 '_deepcopy_dispatch',
 '_deepcopy_list',
 '_deepcopy_method',
 '_deepcopy_tuple',
 '_keep_alive',
 '_reconstruct',
 'copy',
 'deepcopy',
 'dispatch_table',
 'error']
********************************************************************************

['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove
', 'reverse', 'sort']
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

['Error', 'copy', 'deepcopy']


------------------
(program exited with code: 0)

請按任意鍵繼續. . .

__all__的原始檔是這樣的(檢視原始檔可以到原始檔存在的目錄中查詢。也可以根據使用的編輯器的功能查詢。比如有的編譯器是Ctrl+滑鼠左鍵點選相應的變數或函式,也可以檢視官網文件,地址:https://docs.python.org/3/)。
'''

__all__= ["Error", "copy", "deepcopy"]


'''
__all__的作用旨在定義模組的公有介面。它告訴直譯器從這個模組匯入所有的名稱意味著什麼。因此,如果你使用如下程式碼:
from copy import *
將只能得到變數__all__中列出的4個函式。要匯入PyStringMap,必須顯式地:匯入copy並使用copy.PyStringMap;或者使用from copy import PyStringMap。
編寫模組時,像這樣設定__all__也很有用。因為模組可能包含大量其他程式不需要的變數、函式和類,比較周全的做法是將它們過濾掉。如果不設定__all__,則會在以import *方式匯入時,匯入所有不以下劃線打頭的全域性名稱。
10.2.2 使用 help 獲取幫助
畢竟以上探索變數和函式的方法是有限的,它侷限於對python語言掌握的程度。有一個標準函式可提供你通常需要的所有資訊,它就是help
格式是help(包名.變數——或函式名)這種獲取幫助的文件,實際上用包名.函式名.__doc__也可以得到一些資訊,這就是模組文件。相比於直接檢視文件字串,使用help的優點是可獲取更多的資訊。
10.2.3 文件
文件是有關模組資訊的自然來源。檢視模組本身比其它獲得有關資訊的方法要快得多。例如,你可能想知道range的引數是什麼?在這種情況下,與其在Python圖書或標準Python文件中查詢對range的描述,不如直接檢查這個函式。
'''

print(range.__doc__)

'''

range(stop) -> range object
range(start, stop[, step]) -> range object

Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


然而,並非每個模組和函式都有詳盡的文件字串(雖然應該如此),且有時需要有關工作原理的更詳盡描述。從網上下載的大多數模組都有配套文件。
10.2.4 使用原始碼
在大多數情況下,前面討論的探索技巧都夠用了。但要真正理解Python語言,可能需要了解一些不閱讀原始碼就無法瞭解的事情。
檢視原始碼所在的位置可以用__file__變數,例如:
'''

print(copy.__file__)

'''

C:\\Users\\xx\\AppData\\Local\\Programs\\Python\\Python37\\lib\\copy.py


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


10.3 標準庫:一些深受歡迎的模組
10.3.1 sys
模組sys讓你能夠訪問與Python直譯器緊密相關的變數和函式如:
argv        傳遞給Python直譯器的引數,命令列引數,包括指令碼名
exit([arg]) 退出當前程式,可通過可選引數指定返回值或錯誤訊息
modules     一個字典,將模組名對映到載入的模組
path        一個列表,包含要在其中查詢模組的目錄的名稱
platform    一個平臺識別符號--執行直譯器的“平臺”名稱,如sunos5或win32
stdin       標準輸入流——一個類似於檔案的物件
stdout      標準輸出流——一個類似於檔案的物件
stderr      標準錯誤流——一個類似於檔案的物件
10.3.2 os
模組os功能是能夠訪問多個作業系統服務。它包含的內容很多,以下列出部分函式和變數。
environ 包含環境變數的對映
system(command) 在子shell中執行作業系統命令,用於執行外部程式。用Windows系統os還特有一個同功能函式os.startfile
sep 路徑中使用的分隔符
pathsep 分隔不同路徑的分隔符
linesep 行分隔符('\n'、'\r'或'\r\n')
urandom(n) 返回n個位元組的強加密隨機資料
例如顯示環境變數:
'''

import os
os_en=os.environ['PYTHONPATH']
print('^'*80)
print(os_en)


'''

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

C:\\Users\\xx\\AppData\\Local\\Programs\\Python\\Python37\\python.exe;C:\\Users\\xx\AppD
ata\\Local\\Programs\\Python\\Python37\\Scripts\\;C:\\Users\\xx\\AppData\\Local\\Programs\\
Python\\Python37


------------------
(program exited with code: 0)

請按任意鍵繼續. . .
如果出現錯誤提示,有可能沒有設定環境變數的PYTHONPATH引數,可以把PYTHONPATH改為PATH或者設定環境變數新增PYTHONPATH並重啟。
在python的程式中路徑要用雙反斜槓 \\ 表示且要用引號括起來,。如果不這樣做,底層shell將受阻於空白處。
在Windows中,使用os.system或os.startfile啟動外部程式後,當前Python程式將繼續執行;而在UNIX中,當前Python程式將等待命令os.system結束。
函式os.system可用於完成很多工,但就啟動Web瀏覽器這項任務而言,有一種更佳的解決方案:使用模組webbrowser。這個模組包含一個名為open的函式,讓你能夠啟動啟動Web瀏覽器並開啟指定的URL
'''

import webbrowser as we
we.open('http://www.python.org')

'''
將用預設瀏覽器開啟http://www.python.org網頁。
10.3.3 fileinput
模組fileinput能夠輕鬆地迭代一系列文字檔案中的所有行。
在fileinput模組提供了大量的函式和變數最重要的函式有如下幾種:
input([files[, inplace[, backup]]]) 幫助迭代多個輸入流中的行
filename()                          返回當前檔案的名稱
lineno()                            返回(累計的)當前行號
filelineno()                        返回在當前檔案中的行號
isfirstline()                       檢查當前行是否是檔案中的第一行
isstdin()                           檢查最後一行是否來自sys.stdin(標準輸出)
nextfile()                          關閉當前檔案並移到下一個檔案
close()                             關閉序列
其中input([files[, inplace[, backup]]])函式:
預設格式為:
fileinput.input (files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
其中:
files:                  #檔案的路徑列表,預設是stdin方式,多檔案['1.txt','2.txt',...]
inplace:                #是否將標準輸出的結果寫回檔案,預設不取代
backup:                 #備份檔案的副檔名,只指定副檔名,如.bak。如果該檔案的備份檔案已存在,則會自動覆蓋。
bufsize:                #緩衝區大小,預設為0,如果檔案很大,可以修改此引數,一般預設即可
mode:                   #讀寫模式,預設為只讀
openhook:               #該鉤子用於控制開啟的所有檔案,比如說編碼方式等;
'''

import fileinput as fp
fl=fp.input('xx.txt')
for line in fl:
    print(line)

'''

a,

b,

c

d.

ss

and for in

------------------
(program exited with code: 0)

請按任意鍵繼續. . .


10.3.4 集合、堆和雙端佇列
Python除支援一些較常用的,其中的字典(散列表)和列表(動態陣列)之外。還支援一些雖然不那麼重要,但有時也能派上用場的資料結構。
1. 集合
集合是由內建類set實現的,這意味著你可直接建立集合,而無需匯入模組sets。
'''

s=set(range(10))
print(s)


'''

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


可使用序列(或其他可迭代物件)來建立集合,也可使用花括號顯式地指定。請注意,不能僅使用花括號來建立空集合,因為這將建立一個空字典。因此建立集合必須用set()。
'''

ss=set()
sd={}
print(type(s))
print(type(ss))
print(type(sd))


'''

<class 'set'>
<class 'set'>
<class 'dict'>


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


集合主要用於成員資格檢查,因此將忽略重複的元素。

'''

s1={1,2,3,3,4,5,6,6,7,6,5,4,3,2,1}
print(s1)

'''

{1, 2, 3, 4, 5, 6, 7}


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


與字典一樣,集合中元素的排列順序是不確定的,因此不能依賴於這一點。
除成員資格檢查外,還可執行各種標準集合操作(你可能在數學課上學過),如並集和交集,為此可使用對整數執行按位操作的運算子。例如要計算兩個集合的並集,可對其中一個集合呼叫方法union,也可使用按位或運算子|。
'''

a={'a','c','d','e','f'}
b={'a','b','c','g'}
print(a-b) #a中去掉b中與a共有元素
print(a|b) #或(a、b中的所有元素)
print(a&b) #交集集合a和b中都包含了的元素
print(a^b) #異或,不同時包含於a和b的元素

'''

{'f', 'd', 'e'}
{'e', 'f', 'c', 'g', 'b', 'a', 'd'}
{'c', 'a'}
{'e', 'f', 'g', 'b', 'd'}


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


集合是可變的,因此不能用作字典中的鍵。另一個問題是,集合只能包含不可變(可雜湊)的值,因此不能包含其他集合。
如遇合並集合問題不能簡單的用add函式而是要先把被合併的集合用frozenset函式轉化為不可變,然後再用add函式。
啊。
'''

x=set()
y=set()
x.add(y)

'''

Traceback (most recent call last):
  File "xx.py", line 8, in <module>
    x.add(y)
TypeError: unhashable type: 'set'


------------------
(program exited with code: 1)

請按任意鍵繼續. . .


'''

y1=frozenset(y)
x1=x.add(y1)
print('@'*80)
print(x1)

'''

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

None


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


2. 堆
另一種著名的資料結構是堆(heap),它是一種優先佇列。優先佇列讓你能夠以任意順序新增物件,並隨時(可能是在兩次新增物件之間)找出(並刪除)最小的元素。相比於列表方法min,這樣做的效率要高得多。
實際上,Python沒有獨立的堆型別,而只有一個包含一些堆操作函式的模組。這個模組名為heapq(其中的q表示佇列),它包含6個函式,其中前4個與堆操作直接相關。必須使用列表來表示堆物件本身。
heappush(heap, x)    將x壓入堆中
heappop(heap)        從堆中彈出最小的元素
heapify(heap)        讓列表具備堆特徵
heapreplace(heap, x) 彈出最小的元素,並將x壓入堆中
nlargest(n, iter)    返回iter中n個最大的元素
nsmallest(n, iter)   返回iter中n個最小的元素
看書中例子:
'''

from heapq import *
from random import shuffle   #引入random模組
data = list(range(10))
shuffle(data)                #將序列的所有元素隨機排序。
heap = []
for n in data:
    heappush(heap, n) 
print(heap)
heappush(heap, 0.5) 
print(heap)

'''

[0, 1, 4, 2, 3, 8, 5, 6, 7, 9]
[0, 0.5, 4, 2, 1, 8, 5, 6, 7, 9, 3]


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


元素的排列順序並不像看起來那麼隨意。它們雖然不是嚴格排序的,但必須保證一點:位置i處的元素總是大於位置i // 2處的元素(反過來說就是小於位置2 * i和2 * i + 1處的元素)。這是底層堆演算法的基礎,稱為堆特徵(heap property)。
函式heappop彈出最小的元素(總是位於索引0處),並確保剩餘元素中最小的那個位於索引0處(保持堆特徵)。雖然彈出列表中第一個元素的效率通常不是很高,但這不是問題,因為heappop會在幕後做些巧妙的移位操作。
還是書上的:
'''

print(heappop(heap))
print(heappop(heap))
print(heappop(heap))
print(heap)

'''

0
0.5
1
[2, 3, 5, 4, 6, 9, 7, 8]


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


函式heapify通過執行儘可能少的移位操作將列表變成合法的堆(即具備堆特徵)。如果你的堆並不是使用heappush建立的,應在使用heappush和heappop之前使用這個函式。
繼續看:
'''

hea=[100,18,16,17,19,11,22] 
heapify(hea)
print(hea)

'''

[11, 17, 16, 18, 19, 100, 22]


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


函式heapreplace用得沒有其他函式那麼多。它從堆中彈出最小的元素,再壓入一個新元素。相比於依次執行函式heappop和heappush,這個函式的效率更高。
'''

heapreplace(hea,0.5)
print(hea)

'''

[0.5, 17, 16, 18, 19, 100, 22]


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


'''

heapreplace(hea,200)
print(hea)

'''

[16, 17, 22, 18, 19, 100, 200]


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


3. 雙端佇列(及其他集合)
雙端佇列是指允許兩端都可以進行入隊和出隊操作的佇列,其元素的邏輯結構仍是線性結構。將佇列的兩端分別稱為前端和後端,兩端都可以入隊和出隊。
在需要按新增元素的順序進行刪除時,雙端佇列很有用。在模組collections中,包含型別deque以及其他幾個集合(collection)型別。
與集合(set)一樣,雙端佇列也是從可迭代物件建立的,它包含多個很有用的方法。
'''

from collections import deque
q = deque(range(5))               #建立雙端序列
q.append(5)                       #後端新增5
q.appendleft(6)                   #前端新增6
print(q) 

'''

deque([6, 0, 1, 2, 3, 4, 5])


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


雙端佇列物件還包含方法extend和extendleft,其中extend類似於相應的列表方法,而extendleft類似於appendleft。請注意,用於extendleft的可迭代物件中的元素將按相反的順序出現在雙端佇列中。
10.3.5 time
模組time包含用於獲取當前時間、操作時間和日期、從字串中讀取日期、將日期格式化為字串的函式。也可表示為包含9個整數的元組。在元組中的索引順序為年、月、日、時、分、秒、星期、儒略日、夏令時(0或1)。
秒的取值範圍為0~61,這考慮到了閏一秒和閏兩秒的情況。
模組time中一些最重要的函式如下:
asctime([tuple])          將時間元組轉換為字串
localtime([secs])         將秒數轉換為表示當地時間的日期元組
mktime(tuple)             將時間元組轉換為當地時間
sleep(secs)               休眠(什麼都不做)secs秒
strptime(string[, format])將字串轉換為時間元組
time()                    當前時間(從新紀元開始後的秒數,以UTC為準)
(有的是時間討論時間,先到此為止)
10.3.6 random
模組random包含生成偽隨機數的函式,有助於編寫模擬程式或生成隨機輸出的程式。模組中一些重要的函式如下:
random()                         返回一個0~1(含)的隨機實數
getrandbits(n)                   以長整數方式返回n個隨機的二進位制位
uniform(a, b)                    返回一個a~b(含)的隨機實數
randrange([start], stop, [step]) 從range(start, stop, step)中隨機地選擇一個數
choice(seq)                      從序列seq中隨機地選擇一個元素
shuffle(seq[, random])           就地打亂序列seq
sample(seq, n)                   從序列seq中隨機地選擇n個值不同的元素
看書:
'''

from random import *
from time import *
date1 = (2016, 1, 1, 0, 0, 0, -1, -1, -1)
time1 = mktime(date1)
date2 = (2017, 1, 1, 0, 0, 0, -1, -1, -1)
time2 = mktime(date2)
random_time = uniform(time1, time2) 
print(asctime(localtime(random_time))) 

'''

Wed Jun  1 05:27:52 2016


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


再看一個時間的例子:
'''

present=time()          #獲取當前時間
tuple_time=localtime(present)
                        #在這裡不能直接輸入漢字,用format插入
str_time=strftime('%Y{y}%m{m}%d{d}%H{h}%M{f}%S{s}',tuple_time).format(y='年',m='月',d='日',h='時',f='分',s='秒')
print(str_time)

'''

2018年11月05日08時55分21秒


------------------
(program exited with code: 0)

請按任意鍵繼續. . .


10.3.7 shelve 和 json
將物件轉換為可通過網路傳輸或可以儲存到本地磁碟的資料格式(如:XML、JSON或特定格式的位元組串)的過程稱為序列(編碼、調解);反之,則稱為反序列化(解碼、解調)。shelve 和 json就是用於進行資料序列化的模組,它們提供了幾個經常用到的函式:
1、shelve專門用於將Python資料型別的持久化到磁碟,shelf是一個類似dict的物件,操作十分便捷。
提供的常用函式:
open 用於開啟一個檔案,建立一個 file 物件,相關的方法才可以呼叫它進行讀寫。操作完畢(並將所做的修改存檔)時,可呼叫其方法close關閉檔案。
2、json用於實現Python資料型別與通用(json)字串之間的轉換。
提供的常用函式:
i、 dumps()將一個Python資料型別列表進行json格式的編碼解析,返回一個str物件。
ii、 dump()將Python內建型別序列化為json物件後寫入檔案。
iii、 loads()將已編碼的JSON字串編碼為Python物件。
iv、 load()將讀取json資訊。
dump(),load()處理的是json檔案,dumps(),loads()處理的是字串。dump\dumps和load\loads一個是多json檔案解碼一個是編碼。
以上函式引數略。這一節書上介紹的例子與下一章有關,就以後遇到再說吧!
10.3.8 re
模組re提供了對正則表示式的支援。
要掌握正則表示式有點難。關鍵是每次學習一點點:只考慮完成特定任務所需的知識。預先將所有的知識牢記在心毫無意義。
這裡不是介紹正則表示式地方,re模組是用於處理正則表示式的模組,因此只指出re模組中一些重要的函式:
compile(pattern[, flags])               根據包含正則表示式的字串建立模式物件
search(pattern, string[, flags])      在字串中查詢模式
match(pattern, string[, flags])       在字串開頭匹配模式
split(pattern, string[, maxsplit=0]) 根據模式來分割字串
findall(pattern, string)                    返回一個列表,其中包含字串中所有與模式匹配的子串
sub(pat, repl, string[, count=0])    將字串中與模式pat匹配的子串都替換為repl
escape(string)                              對字串中所有的正則表示式特殊字元都進行轉義
group([group1, ...])                       獲取與給定子模式(編組)匹配的子串
start([group])                               返回與給定編組匹配的子串的起始位置
end([group])                                 返回與給定編組匹配的子串的終止位置(與切片一樣,不包含終止位置)
span([group])                               返回與給定編組匹配的子串的起始和終止位置

學好章不容易有的老鳥也要不斷學習這章羅列的內容,學習的方法只有一條,多看多練,如果想更深入地學習這章——模組,再次建議瀏覽“Python庫參考手冊”(它讀起來真的很有趣)然後自己琢磨著多練習,這比看書收穫更大!!
'''

(待續)