- 1. Python基礎
1.1. 概述
Python是一個腳本解釋器, 可以從命令行運行腳本, 也可以在腳本上雙擊, 象運行其他應用程序一樣。它還是一個交互 shell, 可以執行任意的語句和表達式。
Python 的交互 shell 可以計算任意的 Python 表達式, 包括任何基本的數學表達式。交互 shell 可以執行任意的 Python 語句, 包括 print 語句。也可以給變量賦值, 並且變量值在 shell 打開時一直有效(一旦關畢交互 Sheel , 變量值將丟失)。
表格 1 編程語言數據類型的比較
靜態類型定義語言 | 一種在編譯期間數據類型固定的語言。大多數靜態類型定義語言是通過要求在使用所有變量之前聲明它們的數據類型來保證這一點的。 Java 和 C 是靜態類型定義語言。 |
動態類型定義語言 | 一種在運行期間才去確定數據類型的語言, 與靜態類型定義相反。 VBScript 和 Python 是動態類型定義的, 因為它們確定一個變量的類型是在您第一次給它賦值的時候。 |
強類型定義語言 | 一種總是強制類型定義的語言。 Java 和 Python 是強制類型定義的。您有一個整數, 如果不明確地進行轉換 , 不能將把它當成一個字符串。 |
弱類型定義語言 | 一種類型可以被忽略的語言, 與強類型定義相反。 VBScript 是弱類型定義的。在 VBScript 中, 您可以將字符串 ’12′ 和整數 3 進行連接得到字符串’123′, 然后可以把它看成整數 123 , 所有這些都不需要任何的顯示轉換。 |
1.2. 函數聲明
def function_name([arguments]):
‘optional documentation string’
function_suite
a. arguments參數之間用逗號隔開。Python函數定義中不需要提定返回值的數據類型,也不需要指定是否有返回值。每個 Python 函數都返回一個值;如果函數執行過 return 語句, 它將返回指定的值, 否則將返回 None ( Python 的空值) 。Python 中沒有子程序,只有函數, 所有的函數都有返回值,並且所有的函數都以 def 開始。
b. 文檔化函數:函數聲明后第一個沒有賦值的字符串,也可使用三引號括起。使用函數的屬性__doc__來調用這個字符串。
def buildConnectionString(params):
“””Build a connection string from a dictionary of parameters.
Returns string.“””
c. print語句實用規則是print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout),Python的print語句調用str()函數顯示對象,交互式解釋器則調用repr()函數來顯示對象。
表格 2 對新Python程序員有用的內建函數
函數 | 描述 |
dir([obj]) | 顯示對象的屬性,如果沒有提供參數,這顯示全局變量 |
help([obj]) | 以一種整齊美觀的形式,顯示對象的文檔字符串,如果沒有提供任何參數,則會進入交互式幫助 |
int(obj) | 將一個對象轉換為整型 |
len(obj) | 返回對象的長度 |
open(fn,mode) | 以mode方式打開一個文件名為fn的文件 |
range([[start,]stop[,step]]) | 返回一個整型列表。起始值為start,結束值為stop-1,start默認值為0,step默認值為1 |
raw_input(str) | 等待用戶輸入一個字符串,可以提供一個可選的參數str用作提示信息。 |
str(obj) | 將一個對象轉換為字符串 |
type(obj) | 返回對象的類型(返回值本身是一個type對象) |
1.3. Python常用習慣
a. 反斜杠(\)繼續上一行,Python文件以模塊形式組織。下划線(_)返回最后一個表達式的值。
b. 命令行選項:
-d 提供調試輸出
-o生成優化字節碼(pyo文件)
-s 不導入site模塊以啟動時查找Python路徑
-v 冗余輸出(導入語句詳細追蹤)
-m mod 將一個模塊以腳本形式輸出
-Q opt 除法選項
-c cmd 運行時以命令行字符串形式提交的Python腳本
file 從給定的文件運行Python腳本
c. raw_input()內建函數:讀取標准輸入,並將讀取到的數據賦值給指定的對象,鍵入EOF字符則引發EOFError。可以加在腳本最后一行,用來使程序執行時保持窗口開着。Python中函數input和raw_input可以看做是def input(prompt):return eval(raw_input(prompt)) 即調用eval函數來看輸入是什么,實際上你甚至可以輸入表達式,Python會計算表達式的值來返回。
d. Python 函數沒有明顯的 begin 和 end, 沒有花括號, 用於標函數的開始和結束。 唯一的分隔符是一個冒號 (:), 接着代碼本身是縮進的。Python 使用硬回車來分割語句, 冒號和縮進來分割代碼塊。C++ 和 Java 使用分號來分割語句, 花括號來分割代碼塊。
e. 可使用help(函數名)來查詢相應函數幫主信息。
1.4. 標識符
a. 任何時刻只有一個名字綁定,不支持重載標識符。內建(built-in)是__builtins__模塊的成員,由解釋器自動導入,可看作是任何一級的Pythong代碼的全局變量。
b. 專用下划線標識符:_xxx不用‘form modules import *’導入,_xxx_系統定義的名字,_類中私有變量名。
c. 系統變量__name__決定運行是的模塊是被導入還是直接執行:為模塊名則導入,為‘__main__’則直接運行。
d. “Pythonic”:以Python的方式去編寫代碼、組織、邏輯和對象行為。
表格 3 Python關鍵字
and | as | assert | break |
class | continue | def | del |
elif | else | except | exec |
finally | for | from | global |
if | import | in | is |
lambda | not | or | pass |
raise | return | try | |
while | with | yield | None |
1.5. 變量聲明
myParams = <表達式>
a. 命名規則:以字母或下划線開頭,其他字符可以是數字、字母或下划線。大小寫敏感。Python是動態類型語言,不需要預先聲明變量類型,變量值和類型在賦值時被初始化。
b. Python賦值語句不返回值,不支持類似x++或—x這樣的單目雙重運算符,允許符合賦值(*=)、多重賦值和“多元”賦值
c. 變量的賦值可以是一條被分成了多行的命令, 用反斜線 (“\”) 作為續行符,當一條命令用續行符 (“\”) 分割成多行時, 后續的行可以以任何方式縮近, 此時 Python 通常的嚴格的縮近規則無需遵守。
d. Python 有局部變量和全局變量之分, 但沒有明顯的變量聲明。變量通過首次賦值產生, 當超出作用范圍時自動消亡。Python 不允許引用一個未被賦值的變量, 試圖這樣做會引發一個異常。
e. Python的一種編程簡寫是一次使用序列來給多個變量賦值。Python 中,可以使用內置的 range 函數和多變量賦值的方法來快速進行賦值,與C++中的枚舉相似。如:
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
1.6. 注釋
a. 使用#符號標示注釋;
b. 在模塊、類或者函數起始添加一個字符串起文檔作用;
c. 使用三引號標示注釋。
- 2. 數據類型
2.1. 基本數據類型
有符號整型、長整型(僅受限於用戶計算機的虛擬內存總數,可由整型自動轉換)、布爾值、浮點值、復數(a+bj或a+bJ)
△ 引入decimal模塊使用decimal類型(十進制浮點型)
?二進制表示中有一個無限循環:1.1 → 1.10000……1
a. 復數擁有real、imag、conjugete()屬性,coerce()內建函數實現強制類型轉換。
b. 除法引入指令from __future__ import division使整型除法保留小數部分,//操作符執行“地板除”。浮點數取余表達式:x-(math.floor(x/y)*y);復數取余表達式:x-(math.floor((x/y).real)*y)
c. 冥運算比其左側操作數的一元操作符優先級高,比其右側操作數的一元操作符的優先級低。?4xx-1報錯
d. Python支持標准位運算(僅適用於整型):取反(~),按位與(&),或(|)和異或(^)、左移(<<)、右移(>>)
△ 復數當成正數的2進制補碼處理;
△ 左移好右移N位等同於無溢出檢查2的N次冪運算:2**N;
△ 對長整形,位操作符使用一種未修改的2進制補碼形式,使得符號位無限向左擴展。
數字類型相關模塊:decimal(十進制浮點運算類Decimal)、array(高級數字數組)、math/cmath(標准C庫數學運算函數,復數在cmath中)、operator(數字操作符的函數實現)、random(各種偽隨機數生成器)
表格 4 數值工廠函數
類(工廠函數) | 操作 |
boll(obj) | 返回obj對象的布爾值,即obj.__nonzero__方法的返回值 |
int(obj,base=10) | 返回一個字符串或數值對象的整型表示,類似string.atoi() |
long(obj,base=10) | 返回一個字符或數據對象的長整型表示,類似string.atol() |
float(obj) | 返回一個字符串或數據對象的浮點型表示,類似string.atof() |
complex(str) or
complex(real,inag=0.0) |
返回一個字符串的復數標識,或者根據給定的實數(及一個可選的虛數部分)生成一個復數對象 |
表格 5 數值運算內建函數
函數 | 功能 |
abs(num) | 返回num的絕對值 |
coerce(num1,num2) | 將num1和num2轉換為同一類型,然后以一個元組的形式返回 |
divmod(num1,num2) | 除法-取余運算的結合。返回一個元組(num1/num2,num1%num2),對浮點數和復數的商進行下舍入 |
pow(num1,num2, mod=1) | 取num1的num2次方,如果提供mod參數,則計算結果再對mod進行取余運算 |
round(flt,ndig=1) | 接受一個浮點型flt並對其四舍五入,保存ndig位小數,不提供ndig則默認為0位 |
表格 6 僅適用於整型的內建函數
函數 | 操作 |
hex(num) | 將數字轉換成十六進制數並以字符串形式返回 |
oct(num) | 將數字轉換成八進制數並以字符串形式返回 |
chr(num) | 將ASCII值的數字轉換成ASCII字符,范圍只能是0<=nuum<=255 |
ord(chr) | 接受一個ASCII或Unicode字符,返回相應的ASCII值或Unicode值 |
unichr(num) | 接受Unicode碼值,返回其對應的Unicode字符,接受碼值返回由Python構建於UCS-2還是UCS-4決定 |
2.2. 映射和集合類型
字典(Dictionary):Python中唯一映射類型,作為可變的哈希表實現。
dictionaryName = {“key1“:”value1“, “key2“:”value2“……}
- Dictionary定義了鍵和值之間一對一的關系,變量可以任意取名,Python在內部會記錄下其數據類型。value可以為任意的數據類型,key的要求較為苛刻一些。
- 重復賦值, 將簡單覆蓋原有的值。Dictionary 的 key 是大小寫敏感的。可以通過key來引用value,不能通過value引用key。
- 字典相關函數:type()、str()、cmp();映射類型相關函數:dict()、len()、hash()。del dictionaryName["key"]刪除dictionary中獨立元素;dictionaryName.clear() 刪除dictionary中所有元素。例7.1、7.2
表格 7 映射類型內建方法
方法名字 | 操作 |
dict.clear() | 刪除字典中所有元素 |
dict clear() | 返回字典(淺復制)的一個副本 |
dict.fromkeys(seq,val=None) | 創建並返回一個新字典,以seq中的元素做該字典的鍵,val做該字典中所有鍵對應的初始值 |
dict.get(key,default=None) | 對字典dict中的鍵key,返回它對應的值value,如果字典中不存在此鍵,則返回default值 |
dict.has_key(key) | 如果鍵在字典中存在,返回True,否則返回False,由in和not in代替 |
dict.items() | 返回一個包含字典中鍵、值對元組的列表 |
dict.keys() | 返回一個包含字典中鍵的列表 |
dict.iter() | 方法iteritems()、iterkeys()、itervaluse()與它們對應的非迭代方法一樣,不同的是它們返回一個迭代子,而不是一個列表 |
dict.pop(key[,default]) | 和方法get()相似,如果字典中key鍵存在,刪除並返回dict[key];如果key鍵不存在,且沒有給出default值,則引發KeyError異常 |
dict.setdefault(key,default = None) | 和方法set()相似,如果字典中不存在key鍵,由dict[key]=default為它賦值 |
dict.update(dict2) | 將字典dict2的鍵-值對添加到字典dict |
dict.values() | 返回一個包含字典中所有值的列表 |
- d. 集合對象(Set)是一組無序排列的可哈希的值。集合類型操作符:in,not in,布爾操作符,聯合(|)、交集(&)、差補()、相對補集(-)、對稱差分(^)(=、&=、-=、^=)
表格 8 集合類型的操作符、函數和方法
函數/方法名 | 等價操作符 | 說明 |
所有集合類型 | ||
len(s) | 集合基數:集合s中元素個數 | |
set([obj]) | 可變集合工廠函數:ojb必須是支持迭代的,由obj中的元素創建集合,否則創建一個空集合 | |
frozenset([obj]) | 不可變集合工廠函數:執行方式好set()方法相同,但它返回的是不可變集合 | |
obj in s | 成員測試 | |
obj not in s | 非成員測試 | |
s == t | 等價測試 | |
s != t | 不等價測試 | |
s < t | (嚴格意義上)子集測試 | |
s.issubset(t) | s <= t | 子集測試 |
s > t | (嚴格意義上)超集測試 | |
s.issuperset(t) | s >= t | 超集測試 |
s.union(t) | s | t | 合並操作 |
s.intersec-tion(t) | s & t | 交集操作 |
s.difference(t) | s – t | 差分操作 |
s.symmetric_fifference(t) | s ^ t | 對稱差分操作 |
s.copy() | 賦值操作:返回s的(淺復制)副本 | |
僅適用於可變集合 | ||
s.update(t) | s |= t | (Union)修改操作:將t中的成員添加s |
s.intersection_update(t) | s &= t | 交集修改操作:s中僅包括s和t中共有的成員 |
s.difference_update(t) | s -= t | 差修改操作:s中僅包括屬於s但不屬於t的成員 |
s.symmetric_difference_ update(t) | s ^= t | 對稱差分修改操作:s中包括僅屬於s或僅屬於t的成員 |
s.add(obj) | 加操作:將obj添加到s | |
s.remove(obj) | 刪除操作 | |
s.discard(obj) | 丟棄操作:remove()的友好版本,如果s中存在ojb,從s中刪除它 | |
s.pop() | Pop操作:移除並返回s中的任意一個值 | |
s.clear() | 清除操作:移除s中的所有元素 |
2.3. 序列
序列類型操作符:成員關系操作符(in、not in)、連接操作符(+)、重復操作符(*)、切片操作符([],[:],[::])、切片索引的更多內容
序列類型函數(有返回值):cmp(), len(), max(), min(), sorted(), reversed(), enumerate(), zip(), reduce(), sum(), list()和tuple()
表格 9 序列類型轉換工廠函數
函數 | 含義 |
list(iter) | 把迭代對象轉換為列表 |
str(obj) | 把obj對象轉換成字符串(對象的字符串表示法) |
unicode(obj) | 把對象轉換成Unicode字符串(使用默認編碼) |
basestring() | 抽象工廠函數,其作用僅僅是為str和unicode函數提供父類,所以不能被實例化,也不能被調用 |
tuple(iter) | 把一個迭代對象轉換為一個元組對象 |
表格 10 序列類型可用的內建函數
函數名 | 功能 |
enumerate(iter) | 接受一個可迭代對象作為參數,返回一個enumerate對象(同時也是一個迭代器),該對象生成由iter每個元素的index值和item值組成的元組 |
len(seq) | 返回seq的長度 |
max(iter,key=None)or max(arg0,arg1…,key=None) | 返回iter或(arg0,arg1,…)中的最大值,如果指定了key,這個key必須是一個可以傳給sort()方法的,用於比較的回調函數 |
min(iter,key=None)or min(arg0,arg1…,key=None) | 返回iter或(arg0,arg1,…)里面的最小值,如果指定了key,這個key必須是一個可以傳給sort()方法的,用於比較的回調函數 |
reversed(seq) | 接受一個序列作為參數,返回一個可逆序訪問的迭代器 |
sorted(iter,func=None, key=None,reverse=False) | 接受一個可迭代對象作為參數,返回一個有序的列表;可選參數func、key和reverse的含義跟list.sort()內建函數的參數定義一樣 |
sum(seq,init=0) | 返回seq和可選參數init的總和,其效果等同於reduce(
operator.add,seq,init) |
zip([it0,it1,…itN]) | 返回一個列表,其第一個元素是it0、it1…這些元素的第一個元素組成一個元組,第二個…依此類推 |
2.3.1. 字符串(不可改變,比較操作中按照ASCII值的大小來比較)
a. 把重復操作z作為參數放在循環中進行是非常低效的;
b. Python語法允許在源碼中把幾個字符串連在一起寫,來構建新字符串,使用分號隔開,可加入注釋;
c. 如果把一個普通字符串和一個Unicode字符串作連接處理,Python會在連接操作前先將普通字符串轉換為Unicode字符串。
d. 字符串模板:原始字符串操作符(r/R)(原始字符串對每個字符都使用原意);Unicode字符串操作符(u/U)。
e. 字符串類型函數(有返回值):raw_input(), str(), unicode(), chr(), unichr(), ord()
f. Python中允許使用三引號使一個字符串跨多行,並且可以包含換行符、制表符和其他特殊符號。
Unicode:P127
字符串內建函數:…………
表格 11 反斜杠開頭的轉義字符
八進制 | 十進制 | 十六進制 | 字符 | 說明 | |
\0 | 000 | 0 | 0×00 | NUL | 空字符NUL |
\a | 007 | 7 | 0×07 | BEL | 響鈴字符 |
\b | 010 | 8 | 0×08 | BS | 退格 |
\t | 011 | 9 | 0×09 | HT | 橫向制表符 |
\n | 012 | 10 | 0x0A | LF | 換行 |
\v | 013 | 11 | 0x0B | VT | 縱向制表符 |
\f | 014 | 12 | 0x0C | FF | 換頁 |
\r | 015 | 13 | 0x0D | CR | 回車 |
\e | 033 | 27 | 0x1B | ESC | 轉義 |
\” | 042 | 34 | 0×22 | “ | 雙引號 |
\’ | 047 | 39 | 0×27 | ‘ | 單引號 |
\\ | 134 | 92 | 0x5C | \ | 反斜杠 |
表格 12 與字符串類型有關的模塊
模塊 | 描述 | 模塊 | 描述 |
string | 字符串操作相關函數和工具 | re | 正則表達式 |
struct | 字符串和二進制之間的轉換 | c/StringIO | 字符串緩沖對象類似file |
base64 | Base16、32和64數據編解碼 | codecs | 解碼器注冊和基類 |
crypt | 進行單方面加密 | difflib | 找出序列間的不同 |
hashlib | 多種不同安全哈希算法和信息摘要算法是API | hma | HMAC信息鑒權算法的Python實現 |
md5 | RSA的MD5信息摘要鑒權 | rotor | 提供多平台的加解密服務 |
sha | NIAT的安全哈希算法SHA | stringprep | 提供用於IP協議的Unicode字符 |
textwrap | 文本包裝和填充 | unicodedata | Unicode數據庫 |
2.3.2. 列表(List):(P145用列表模擬堆棧(stack.py);P148用列表用作隊列(queue.py))
listName = ["value1", "value2", "value3", "value4", ……]
- List 是一個用方括號包括起來的有序元素的集合,可以類比Java中的ArrayList,保存任意對象, 並且可以在增加新元素時動態擴展。可以使用負的索引,它從數據序列的最后一個-1向前數起。
- 可以通過指定2個索引得到 list 的子集,叫做一個“slice”。返回值是一個新的list,它包含了list中按順序從第一個slice索引開始, 直到不包括第二個slice索引的所有元素。
- List支持+、+=、*運算符和布爾運算符。
列表類型函數(無返回值):
listName.append(“value“) 向 list 的末尾追加單個元素,不論什么數據類型。
listName.insert(<索引>, “value“) 將單個元素插入到 list 中。
listName.extend(["value1", "value2"……]) 用來連接 list。
listName.count(value) 返回value在listName中出現的次數
listName.sort(func=None,key=None,reverse=None) func和key表示以指定方式比較各個元素,reverse為True則以反序排列。默認歸並排序,復雜度為O(lg(n!))
listName.reverse() 原地翻轉列表
listName.index(“value“) 返回value在listName中首次出現的索引,若無引發異常。
“value” in listName 測試value是否在 listname內,返回True或False。
listName.remove(“value“) 刪除value在listName中首次出現的值。
listName.pop() 返回listName最后一個元素,並刪除。
△ Python 在布爾環境 (如 if 語句) 中幾乎接受所有東西:0 為 false,其它所有數值皆為 true。空串 (“”) 為 false;其它所有字符串皆為 true。空list([])為 false;其它所有list皆為true。空tuple(())為false;其它所有tuple皆為true。空dictionary ({})為 false;其它所有dictionary皆為true;non-empty、non-zero為false。
△ 總結上面一條得出,下列對象的布爾值是False:None、False(布爾類型)、所有值為零的數、0(整數)、0.0(浮點型)、0L(長整型)、0.0+0j(復數)、””空字符串、[]空列表、()(空元組)、{}(空字典)
2.3.3. 元組(Tuple)
tupleName = (“value1“, “value2“, “value3“……)
- Tuple 是用小括號包括起來的有序元素的集合,一旦創建就不能以任何方式改變。只有一個元素的元組需要在元組分隔符里加上一個逗號(,)。可“hash”的對象?
- Tuple 比 list 操作速度快,可以定義為常量集,作為程序的運行中不斷地遍歷它。
- 對不需要修改的數據進行“寫保護”, 可使代碼更安全,也可以使用turple,如同擁有隱含的assert語句, 說明數據是常量。Tuple可以作為Dictionary中Key的參數。
- Tuple只有in方法,用於判斷Tuple中是否存在某元素。
- 如果必須要改變這些值, 則需要執行 tuple 到 list 的轉換 (需要使用一個特殊的函數),Tuple 可以轉換成 list, 反之亦然。
△ 拷貝Python對象:淺拷貝和深拷貝
默認拷貝類型(淺拷貝):
1.完全切片操作;2.利用工廠函數;3.使用copy模塊的copy函數。
深拷貝:創建一個新的容器對象,包含原有對象元素(引用)全新拷貝的引用,使用copy.deepcopy()函數。
表格 13 與序列類型相關的模塊
模塊 | 內容 |
array | 一種受限制的可變序列類型,要求所有的元素必須都是相同的類型 |
copy | 提供淺拷貝和深拷貝的能力 |
operator | 包含函數調用形式的序列操作符,比如operator.concat(m,n)就相當於連接操作(m+n) |
re | Perl風格的正則表達式查找(和匹配) |
cStringIO/ | 把長字符串作為文件來操作,比如read()、seek()函數等 |
cStringIO | 把長字符串作為文件來操作,比如read()、seek()函數等,C版的更快一些,但是它不能被繼承 |
textwrap | 把作包裝/填充文本的函數,也有一個類 |
types | 包含Python支持的所有類型 |
collections | 高性能容器數據類型 |
2.4. 格式化字符串
“%s…%s” % (value1,value2)
- Python 支持格式化字符串的輸出,使用方法和C語言中的sprintf 函數一樣,最基本的用法是:對於字符串使用%s 的字符串中,對於整數類型使用%d,十進制浮點數類型使用%f,+%.xf表示有正負號的小數點后x位的十進制浮點數,默認情況下是6位精度。
- Python中,字符串連接只能在被連接的每一個都是字符串時起作用,試圖將一個字符串同一個非字符串連接會引發一個異常。
表格 14 字符串格式化符號
格式化字符 | 轉換方式 |
%c | 轉換成字符(ASCII碼值,或者長度為一的字符串) |
%r | 優先用repr()函數進行字符串轉換 |
%s | 優先用str()函數進行字符串轉換 |
%d/%i | 轉成有符號十進制數 |
%u | 轉成無符號十進制數 |
%o | 轉成無符號八進制數 |
%x/%X | 轉成無符號十六進制數(x/X代表轉換后的十六進制字符的大小寫) |
%e/%E | 轉成科學計算法(e/E控制輸出e/E) |
%f/%F | 轉成浮點型(小數部分自然截斷) |
%g/%G | %e和%f/%E和%F的簡寫 |
%% | 輸出% |
表格 15 格式化操作符輔助指令
符號 | 作用 |
* | 定義寬度或者小數點精度 |
- | 用作左對齊 |
+ | 在正數前面顯示加號(+) |
<sp> | 在正數前面顯示空格 |
# | 在八進制數前面顯示零(0),在十六進制前面顯示0x或者0X(取決於用的是x還是X) |
0 | 顯示的數字前面填充0而不是默認的空格 |
% | %%輸出一個單一的% |
(var) | 映射變量(字典參數) |
m.n | m是顯示的最小總寬度,n是小數點后的位數(如果可用的話) |
2.5. 映射list
[<關於value的表達式> for value in listName]
a. 可以通過對list中的每個元素應用一個函數, 從而將一個list映射為另一個list。
b. 對list的解析並不改變原始的 list。
dictionaryName.keys() 返回一個無序的所有鍵的 list。
dictionaryName.values() 返回一個所有值的list,以 keys 返回的 list 順序輸出dictionaryName.items() 返回一個形如 (key, value) 的 tuple 的 list。
2.6. 連接list與分割字符串
(*).join(listName) 連接一個list中的元素為一個字符串,*表示各元素間連接的符號。
anystring.split(delimiter,num) 分隔一個字符串,其中delimiter為字符串分隔符,num為可選參數,表示分割的次數。不帶參數的 split 按照空格進行分割。
- 3. Python過程語句
3.1. if語句
if expression:
if_suite
elif expression2:
elif_suite
……
else:
else_suite
條件表達式(“三元操作符”):X if C else Y
避免“懸掛”else:P191
C語言中,else與最近的if搭配,屬於內部的if,C編譯器編譯時會忽略額外的空白;而Python使用縮進使用強制使代碼正確對齊,讓程序員來決定else屬於哪一個if。但是在大塊的代碼嵌入到類似的框架中時,會產生很多錯誤。
3.2. while循環
while expression:
suite_to_repeat
3.3. for循環
for iter_var in iterable:
suite_to_repeat
- 迭代字符串是,迭代變量只會包含一個字符。迭代序列的三種方法:序列項、序列索引、使用項和索引。while和for語句中可以使用else語句。
break語句、continue語句、pass語句
- 迭代器和iter()函數:返回一個迭代器
Python中可迭代的對象:列表、字典、文件。新的三個內建字典方法定義迭代:~.iterkeys(),~.itervalues(),~.iteritems()。一個實現了__iter__()和next()方法的類可作為迭代器。
- 列表解析(P206矩陣樣例,磁盤文件樣例)
[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]
- 生成器表達式
特定的函數,允許返回一個值,然后“暫停”代碼的執行,稍后恢復。並不真正創建數字列表,而是返回一個生成器,在每次計算出一個條目后,將它“產生”(yield)出來。使用了“延遲計算”(lazy evaluation),在使用內存上更有效。(P207例子)
- range(start,end,step=1) 返回值為一個列表
簡略形式:range(end) start默認為0
range(start,end)
xrange類似range()不在內存中創建列表完整拷貝,大范圍列表是用在for循環中。
與序列相關的內建函數:sorted(),reversed(),enumerate(),zip(),P198例子
- 4. 文件對象
4.1. 文件內建函數(open()和file())
fileObject = open(file_name, access_mode=‘r’,buffering=-1)
a. open 方法可以接收三個參數:文件名,模式,和緩沖區參數。如果沒有指定,文件以文本方式打開。(print open.__doc__ 會給出所有可能模式的很好的解釋。)文件的打開主要有三種模式:”Append”(打開模式簡寫a)模式在寫入數據時追加到文件尾,”write”(打開模式簡寫w)模式在寫入數據時將覆蓋文件的原有內容,”Read_Only”(打開模式簡寫r)模式僅用於讀取文件內容。
b. open 函數返回一個對象,對象mode屬性返回文件打開模式,name屬性返回打開的文件名。
c. 工廠函數file()同open()。
d. 文件對象的newlines屬性會記錄文件的行結束符。UNS(Universal NEWLINE Support通用換行符)
表格 16 文件對象的訪問模式
文件模式 | 操作 | 文件模式 | 操作 |
r | 讀模式 | rU或U | 讀模式打開,同時提供通用換行符 |
w | 寫模式(必須清空) | a | 追加模式(從EOF開始,必要時創建新文件) |
r+ | 讀寫模式 | w+ | 讀寫模式(參見w) |
a+ | 讀寫模式(參見a) | rb | 二進制讀模式 |
wb | 二進制寫模式 | ab | 二進制追加模式 |
rb+ | 二進制讀寫模式(參見r+) | wb+ | 二進制讀寫模式(參見w+) |
ab+ | 二進制讀寫模式(參見a+) |
4.2. 文件對象內建方法
4.2.1. 輸入
read() 直接讀取字節到字符串中
readline() 讀取打開文件的一行,返回包含行結束符的字符串
readlines() 讀取所有(剩下的)行,把它們作為一個字符串列表返回
△ 保留行結束符:使用輸入方法從文件讀取行時,需要手動刪除行結束符;使用輸出方法時需要手動加入行結束符。
△ 行分隔符和其他文件系統的差異:在POSIX系統上,行分隔符是換行符NEWLINE(\n)字符,舊的MacOS下是RETURN(\r),DOS和Wind32系統下結合使用了兩者(\r\n)。路徑分隔符(POSIX使用“/”;DOS和Windows使用“\”;舊版的MacOS使用“:”)用來分隔文件路徑名、標記當前目錄和父目錄。
表格 17 跨平台開發的os模塊
os模塊屬性 | 描述 |
linesep | 用於在文件中分隔行的字符串 |
sep | 用來分隔文件路徑名的字符串 |
pathsep | 用於分隔文件路徑的字符串 |
curdir | 當前工作目錄的字符串名稱 |
pardir | (當前工作目錄的)父目錄字符串名稱 |
4.2.2. 輸出
write() 把含有文本數據或二進制數據塊的字符串寫入文件中
4.2.3. 文件內移動
seek() 移動文件指針到不同位置,0從文件頭,1從當前位置,2從文件尾
tell() 返回當前文件指針位置,從文件起始算起,單位為字節
文件迭代:for eachLine in f:
4.2.4. 其他
close() 關閉文件,結束訪問
fileon() 返回打開文件的描述符,整形數據
flush() 直接把內部緩沖區中數據立刻寫入文件
isatty() 布爾函數,文件是類atty設備時返回True
truncate() 將文件截取到當前文件指針位置,或者給定size以字節為單位
4.3. 標准文件sys模塊中stdin,stdout,stderr
4.4. sys模塊通過sys.argv屬性提供了對命令行參數的訪問,命令行參數是調用某個程序是除程序名以外的其他參數。C語言中argv是從命令行上輸入的各個參數組成的字符串數組,argc是輸入的參數的個數。Python中:sys.argv是命令行參數的列表,len(sys.argv)是命令行參數的個數。相關模塊getopt,optparse
4.5. 文件系統
表格 18 os模塊的文件/目錄訪問函數
函數 | 描述 |
文件處理 | |
mkfifo()/mknod( | 創建命名管道/創建文件系統節點 |
remove()/unlink() | 刪除文件 |
rename()/renames() | 重命名文件 |
stat() | 返回文件信息 |
symlink() | 創建符號鏈接 |
utime() | 更新時間戳 |
tmpfile() | 創建並打開(‘w+b’)一個新的臨時文件 |
walk() | 生成一個目錄樹下的所有文件名 |
目錄/文件夾 | |
chdir()/fchdir() | 改變當前工作目錄/通過一個文件描述符改變當前工作目錄 |
chroot() | 改變當前進程的根目錄 |
listdir() | 列出指定目錄的文件 |
getcwd()/getcwdu() | 返回當前工作目錄/功能相同,但返回一個Unicode對象 |
mkdir()/removedirs() | 創建目錄/創建多層目錄 |
rmdir()/removedirs() | 刪除目錄/刪除多層目錄 |
訪問/權限 | |
access() | 檢驗權限模式 |
chmod() | 改變權限模式 |
chown()/lchown() | 改變owner和group ID/功能相同,但不會跟蹤鏈接 |
umask() | 設置默認權限模式 |
文件描述符操作 | |
open() | 底層的操作系統open(對於文件,使用標准的內建open()函數 |
read()/write() | 根據文件描述符讀取/寫入數據 |
dup()/dup2() | 復制文件描述符號/功能相同,但是是復制到另一個文件描述符 |
設備號 | |
makedev() | 從major和minor設備號創建一個原始設備號 |
major()/minor() | 從原始設備號獲得major/minor設備號 |
表格 19 os.path模塊中的路徑名訪問函數
函數 | 描述 |
分隔 | |
basename() | 去掉目錄路徑,返回文件名 |
dirname() | 去掉文件名,返回目錄路徑 |
join() | 將分離的各部分組合成一個路徑名 |
split() | 返回(dirname(),basename())元組 |
splitdrive() | 返回(drivename,pathname)元組 |
splitext | 返回(filename,extension)元組 |
信息 | |
getatime() | 返回最近訪問時間 |
getctime() | 返回文件創建時間 |
getmtime() | 返回最近文件修改時間 |
getsize() | 返回文件大小(以字節為單位) |
查詢 | |
exists() | 指定路徑(文件或目錄)是否存在 |
isabs() | 指定路徑是否為絕對路徑 |
isdir() | 指定路徑是否存在且為一個目錄 |
isfile() | 指定路徑是否存在且為一個文件 |
islink() | 指定路徑是否存在且為一個符號鏈接 |
ismount() | 指定路徑是否存在且為一個掛載點 |
samefile() | 兩個路徑名是否指向同一個文件 |
4.6. 永久存儲模塊
將比基本類型復雜的對象轉換為一個二進制數據集合,marshall模塊只能處理簡單的Python對象,pickle可以處理遞歸對象,被不同地方多次引用的對象,以及用類自定義的類和實例。shelve模塊
相關模塊P229表9.7
文件相關模塊如下表:
表格 20 文件相關模塊
模塊 | 內容 |
base64 | 提供二進制字符串和文本字符串間的編碼/解碼操作 |
binascii | 提供二進制和ASCII編碼的二進制字符串間的編碼/解碼操作 |
bz2 | 訪問BZ2格式的壓縮文件 |
csv | 訪問csv文件(逗號分隔文件) |
filecmp | 用於比較目錄和文件 |
fileinput | 提供多個文本文件的行迭代器 |
getopt/optparse | 提供了命令行參數的解析/處理 |
glob/fnmatch | 提供UNIX樣式的通配符匹配的功能 |
gzip/zlib | 讀寫GUN zip(gzip)文件(壓縮需要zlib模塊) |
shutil | 提供高級文件訪問功能 |
c/StringIO | 對字符串對象提供類文件接口 |
tarfile | 讀寫tar歸檔文件,支持壓縮文件 |
tempfile | 創建一個臨時文件(名) |
uu | uu格式的編碼和解碼 |
zipfile | 用於讀取ZIP歸檔文件的工具 |
- 5. 異常處理
異常是因為程序出現了錯誤而在正常控制流以外采取的行為。
5.1. try-except-else-finally語句
try:
try_suite
except Exception1:
suite_for_Exception1
……
else:
no_exceptions_detected_suite
finally:
always_execute_suite
a. Python 使用 try…except 來處理異常,使用 raise 來引發異常。 Java 和 C++ 使用 try…catch 來處理異常,使用 throw 來引發異常。
b. 使用不存在的字典關鍵字將引發 KeyError 異常,搜索列表中不存在的值將引發 ValueError異常,調用不存在的方法將引發AttributeError 異常。引用不存在的變量 將引發 NameError 異常。未強制轉換就混用數據類型 將引發 TypeError 異常。
c. 一旦異常被處理了,處理通常在 try…except 塊之后的第一行繼續進行。注意這一行將總是打印出來,無論異常是否發生。
5.2. 觸發異常
raise語句:raise [SomeException [, args[, traceback]]]
- 參數一,是觸發異常的名字,必須是一個字符串、類或實例;若有其他參數,則須提供SomeException.Python所有標准異常。見附錄…………
- 參數二,單一字符串來指示錯誤原因,元組則組成是一個錯誤字符串,一個錯誤編號,還可能是一個錯誤的地址。
- 參數三,當異常觸發時新生成的一個用於異常-正常化(exception-normally)的跟蹤記錄對象)。
5.3. 斷言
assert expression [, arguments]
5.4. sys模塊中exc_info()函數可以獲取異常信息,返回一個三元組(3-tuple)的信息。
exc_type:異常類
exc_value:異常類的實例
ex_traceback:跟蹤記錄對象
- 6. 函數和函數式編程
6.1. Python函數詳解
declaration /definition def foo():print ‘bar’
function object /reference foo
function cal /invocation foo()
△ P269參數組
a. Python函數可以返回一個值或者對象,默認為元組,若加括號則為列表
b. 存儲元組返回值的方式3種
c. 函數調用中的關鍵字參數、默認參數
d. Python支持內部/內嵌函數,除在函數體內,任何地方都不能對其進行調用
e. 裝飾器:引入日志;增加計時邏輯來檢測性能;給函數加入事務能力P277例11.2
6.2. 可變長度參數
Formal Arguments形參集合(位置和默認):
使用*和**來指定元組和字典的元素作為非關鍵字及關鍵字參數。
a. 非關鍵字可變長參組(元組):位於最后,元組保存所有傳遞給函數的“額外”的參數,如果沒有則為空。
b. 關鍵字變量參數(字典):使用雙星號(**)。
c. 調用帶有可變長參數對象:定義對象,在函數調用中傳遞的對象加上*和**。
6.3. 測試函數(例如:)
def testit(func, *nkwargs,**kwargs)
try:
retval=func(*nkwargs,**kwargs)
result=(True,ritual)
except Exception,diag
result=(False,str(diag))
return result
6.4. 函數式編程
- 匿名函數與lambda:lambda[args1[,args2,…argsN]]:ecpression使用lambda關鍵字創建匿名函數。用合適的表達式調用一個lambda生成一個可以像其它函數一樣使用的函數對象。可被傳遞給其他函數,用額外的引用別名化,作為容器對象以及作為可調用對象被調用。
- 內建函數apply(),filter(),map(),reduce():P288表11.2
a) from random import randict as ri
print [n for n in [ri(1,99) for I in range(9)]if n%2]
b) map(lambda x,y:(x+y,x-y),[1,3,5],[2,4,6])
c) reduce((lambda x,y:x+y),range(5))
函數式編程的內建函數如下表:
表格 21 函數式編程的內建函數
內建函數 | 描述 |
apply(func[,nkw] [,kw]) | 用可選的參數來調用func,nkw為非關鍵字參數,kw為關鍵字參數;返回值是函數調用的返回值(逐漸淘汰) |
filter(func,seq) | 調用一個布爾函數func來迭代遍歷每個seq中的元素;返回一個使func返回值為true的元素列表(部分被摒棄) |
map(func,seq1[, seq2…]) | 將函數func作用於給定序列(s)的每個元素,並用一個列表來提供返回值;如果func為None,func表現為一個身份函數,返回一個含有每個序列中元素集合的n個元組列表 |
reduce(func,seq [,init]) | 將二元函數作用於seq序列的元素,每次攜帶一對(先前的結果以及下一個序列元素),連續地將現有的結果和下一個值作用在獲得的隨后的結果上,最后減少我們的序列為一個單一的返回值;如果初始值init給定,第一個比較會是init和第一個序列元素而不是序列的頭兩個元素 |
- 偏函數應用:Currying能泛化成為偏函數引用(partial function application,PFA),這種函數將任意數量(順序)的參數的函數轉化為另一個帶剩余參數的函數對象。
from functions import partial
basetwo = partial(int,base=2)
6.5. 變量的作用域
局部作用域內為了明確引用全局變量使用關鍵字global。
閉包
def counter(start_at=0):
count=[start_at]
def incr():
count[0]+=1
return count[0]
return incr
6.6. 遞歸
6.7. 生成器
import generators form __future__
yield ~送回生成器[send()],生成器退出[close()]
def counter(start_at=0):
count=start_at
while True:
val=(yield count)
if val is not None
count=val
else count+=1
- 7. 模塊(自我包含並且有組織的代碼片段)
7.1. 名稱空間:名稱(標識符)到對象的映射
a. 向名稱空間添加名稱操作過程涉及綁定標識符到指定對象的操作(引用計數加1);
b. Python解釋器加載名稱空間順序:內建~,執行模塊的全局~,(兩個活動~);執行期間調用函數將創建第三個名稱空間(局部~),通過globals()和locals()內建函數判斷屬於哪個~;
c. __builtins__模塊包含__builtin__模塊(包含內建函數,異常和其他屬性)和內建名稱空間中內建名字的集合;
d. 作用域:指出了從用戶代碼的哪些物理位置可以訪問名稱(標識符);
e. 無限制的名稱空間:可以在任何需要放置數據的地方獲得一個名稱空間。
完整授權名稱(fully qualified)、路徑搜索(查找某個文件的操作)、搜索路徑(查找一組目錄);默認搜索路徑:sys.path。
7.2. 導入模塊(遵循作用域原則)
模塊導入方法:①import語句;②form-import語句;③多行導入(行尾使用\符號);④擴展的import語句(as)。
a. 模塊導入幾點注意:
a) 限制使from modual import *“污染當前名稱空間。兩種場合建議使用:1.目標模塊屬性多,反復鍵入模塊名行不方便;2.交互解釋器下,減少輸入次數。
b) sys.modual.keys()查看當前載入到解釋器的模塊組成字典的模塊名;
c) 阻止屬性導入:使用from modual import*時,可以給不想導入的屬性名稱前加下划線(_),但導入整個模塊或顯示地導入某個屬性時不起作用;
d) 不區分大小寫的導入(?PYTHONCASEOK環境變量)
e) 模塊頭部加入一個額外的編碼表示說明可以讓導入者使用指定的編碼解析你的模塊,例:
#!user/bin/envpython
#_*_coding:UTF-8-**
f) 導入循環?
g) 模塊執行(命令行、shell、execfile()、模塊導入、解釋器的-m選項等);相關模塊:modulefinder, pkgutil, zipimport
b. 只從模塊導入名字會成為局部名稱空間的一部分,可能覆蓋一個已經存在的具有相同名字的對象。使用import和完整標識符名稱(名字屬性標識)解決。
c. from __future__ import new_future“導入”新特性,用戶可以嘗試新特性或特性變化,以便在特性固定下來的時候修改程序。
d. 警告框架:①應用程序(員)接口(Application programmer’s interface API);②警告過濾器(警告會有一個默認的輸出顯示到sys.stderr。命令行也可控制警告過濾器,使用-w選項)
e. 從zip文件中導入模塊:把zip文件當做目錄處理,在文件中搜索模塊。
7.3. 模塊內建函數
a. __import__(modual_name[,globals[,locals[,fromlist]]])可以使用自定義導入算法覆蓋原函數
b. globals()和locals()返回調用者全局和局部名稱空間的字典,全局名稱空間下兩函數返回值相同。
c. reload(modual)重新導入一個已經導入的模塊(全部且成功導入)
7.4. 包
有層次的文件目錄結構,定義了一個由模塊和子包組成的Python應用程序執行環境。和模塊相同,也使用句點屬性標識來訪問他們的元素,使用標准的import和from –import語句導入包中模塊。
P321引入包的作用
- 8. Python面向對象
8.1. Python對象概述
a. Python使用對象模型來存儲數據,構造任何類型的值都是一個對象,所有Python對象都有以下三個特性:身份(id()查看,被認為是該對象的內存地址)、類型(type()查看)和值。所有Python類型的根和所有Python標准累的 默認元組(metaclass)即type。對象的身份比較:obj1 is (not) obj2或id(obj1) == id(obj2)。Python僅緩存簡單整型。
b. Python內部對象
a) 代碼:編譯過的Python源代碼片段,compile()執行exec命令或eval()內建函數,用戶自定義函數核心。
b) 幀:標識Python的執行棧幀,包含Python解釋器運行時需要知道的所有信息。
c) 跟蹤記錄:異常發生時,一包含針對異常的棧跟蹤信息的跟蹤記錄對象被創建。
d) 切片對象:
e) 省略對象:用於擴展切片語法中起記號作用,表示省略號。
f) XRange對象:
c. 工廠函數:即類對象,當調用時,實際是創建了一個類實例。
8.2. 類屬性
a. Python不支持純虛函數或者抽象方法,這些都是強制在子類中定義方法。作為替代方法,可以簡單地在基類方法中引發NotImplementedErrer異常,獲得類似效果。
查看類屬性:①使用dir()內建函數;②訪問類的字典屬性__dict__(所有類都具備的特殊屬性之一)。__doc__是類的文檔字符串,不被派生類繼承。
表格 22 特殊類屬性
C.__name__ | 類C的名字(字符串) |
C.__doc__ | 類C的文檔字符串 |
C.__bases__ | 類C的所有父類構成的元組 |
C.__dict__ | 類C的屬性 |
C.__module__ | 類C定義所在的模塊 |
C.__class__ | 實例C對應所在的類(僅新式類中) |
b. 命名類屬性和方法:①類名以大寫字母開頭,數據屬性聽起來應當是數據值的名字,方法名應當指出對應對象或值的行為;②數據值使用名詞作為名字,方法使用謂詞(動詞加對象)。
8.3. 類實例
a. __init__()構造器方法
b. __new__()構造器方法 (見13.11.3)
c. __del__()解構器方法,直到該實例對象所有引用都被清除掉后才會執行(P343 DEL方法使用總結)
△ 跟蹤實例:使用靜態成員記錄實例個數,顯式加入一些代碼進入類定義或__init__()和__del__()中
8.4. 實例屬性(能夠中“運行時”創建實例屬性)
a. 構造器中首先設置實例屬性;默認參數提供人都市里安裝;__init__()應當返回None;內建實例屬性使用dir()查看,不存在__dict__屬性;給一個與類屬性同名的實例屬性賦值,會有效地“隱藏”類屬性,若類屬性可變則無法刪除修改后實例屬性,修改類屬性使用類名而不是實例名。
b. 使用dir()查看所有實例屬性(同樣可用於查看類屬性);
c. 特殊實例屬性:I.__class__實例化I都類,I.__dict__I都屬性;
d. 可修改類和實例中__dict__屬性,但要重載__setattr__方法。
8.5. 綁定與方法調用()
調用綁定方法:self參數不需要明確地傳入;
調用非綁定方法:必須傳遞self參數。
8.6. 靜態方法和類方法
a. 使用staticmethos()和classmethos()內建函數進行轉換;
b. 使用函數修飾符(@staticmethos和@classmethos)。
8.7. 繼承
a. 使用類與其他數據類型及邏輯執行流混合使用都方法:組合、子類和派生類;
class SubClassName(ParentClass1 [, ParentClass2,...])
‘class_suite’
b. 文檔字符串對類、函數/方法、模塊來說都是唯一的,特殊屬性__doc__不會從基類中繼承過來;__base__類屬性,對任何(子)類,是一個包含其他父類(parent)的集合的元組,沒有父類的類的屬性值為空;
c. 使用super()內建函數顯式地調用父類方法;重寫__init__不會自動調用基類的__init__; super(子類名,self).__init__() <=> 基類名.__init__(self)
d. 從標准類型派生:
不可變類型class RoundFloat(float):
def __new__(cls,val):
return super(RoundFloat,cls).__new__(cls,round(val,2)
可變類型 class SortedKeyDict(dict):
def keys(self):
return Sorted(super(SortedKeyDict,self).keys())
- 多重繼承(要點:1.找到合適都屬性;2.重寫方法時,如何調用對應父類方法,“以發揮它們的作用”,同時在子類中處理好自己的義務。)
a) 方法解釋順序(MRO):經典類使用深度優先,從左至右的查找順序;新式類使用廣度優先,首先查找同胞兄弟。
(新式類屬性__mro__顯示查找都順序)
b) 棱形效應引起MRO問題
8.8. 類、實例和其他對象都內建函數
表格 23 類、實例和其他對象都內建函數
issubclass(sub, sup) | 如果類sub是類sup的子類,則返回True,反之為False |
isinstance(obj1, obj2) | 如果實例obj1是類obj2或者obj2子類的一個實例;或者如果obj1是obj2的類型,則返回True,反之為False |
hasattr(obj,attr) | 如果obj有屬性attr(用字符串給出),返回True,反之為False |
getattr(obj,attr[,default]) | 獲取obj的attr屬性;與返回obj.attr類似;如果attr不是obj的屬性,則返回默認值或引發AttributeError異常 |
setattr(obj,attr,val) | 設置obj的attr屬性值為val,否則創建屬性 |
delattr(obj,attr) | 從obj中刪除屬性attr(以字符串給出) |
dir(obj=None) | 返回obj的屬性的一個列表;如果沒有給定obj,dir()則顯示局部名字空間中的屬性,即locals().keys() |
super(type,obj=None) | 返回一個表示父類類型的代理對象;如果沒有轉入obj,則返回的super對象是非綁定的;反之如果obj是一個type,issubclass必為True;否則isinstance就必為True |
vars(obj=None) | 返回obj的屬性及其值的一個字典;如果沒有給出obj,vars()顯示局部名字空間字典(屬性及其值),即locals() |
8.9. 用特殊方法定制類
示例:例13.2 P371 roundFloat2.py、P374 例13.3 time60.py、例13.4 randSeq.py
a. 迭代器
a) RandSeq(RANDom SEQuence的縮寫)(無損地讀取一個序列,不會越界,永遠不會引發StopIteration異常);
b) AnyIter(ANY number of items ITERator)(同時給出一個安全標示符(safe)來創建這個對象,為真則在遍歷完這個迭代器前,返回所獲取的任意條目;若為假,則在用戶請求過多條目時,引發異常。示例P376 例13.5 anyIter.py
b. 多類型定制(NumStr)示例P378 例13.6 numstr.py
表格 24 定制類的特殊方法
特殊方法 | 描述 |
基本定制型 | |
C.__init__(self[,arg1,...]) | 構造器(帶一些可選參數) |
C.__new__(self[,arg1,...]) | 構造器;通常用在設置不變數據類型的子類 |
C.__del__(self) | 解構器 |
C.__str__(self) | 可打印的字符輸出;內建str()及print語句 |
C.__repr__(self) | 運行時的字符串輸出;內建repr()和‘’操作符 |
C.unicode__(self) | Unicode字符串輸出;內建unicode() |
C.__call__(self,args) | 表示可調用的實例 |
C.__nonzero__(self) | 為object定義False值;內建bool() |
C.__len__(self) | “長度”;內建len() |
對象(值)比較 | |
C.__cmp__(self,obj) | 對象比較;內建cmp() |
C.__lt__(self,obj) and C.__le__(self,obj) | 小於/小於或等於;對應<及<=操作符 |
C.__gt__(self,obj) and C.__ge__(self,obj) | 大於/大於或等於; |
C.__eq__(self,obj) and C.__ne__(self,obj) | 等於/不等於; |
屬性 | |
C.__getattr__(self,attr) | 獲取屬性;內建getattr(),僅當屬性沒有找到時調用 |
C.__setattr__(self,attr,val) | 設置屬性 |
C.__delattr__(self,attr) | 刪除屬性 |
C.__getattribute__(self,attr) | 獲取屬性;內建getattr();總是被調用 |
C.__get__(self,attr) | (描述符)獲取屬性 |
C.__set__(self,attr) | (描述符)設置屬性 |
C.__delete__(self,attr) | (描述符)刪除屬性 |
定制類/模擬類型 | |
數值類型:二進制操作符 | |
C.__*add__(self,obj) | 加;+操作符 |
C.__*sub__(self,obj) | 減;-操作符 |
C.__*mul__(self,obj) | 乘;*操作符 |
C.__*div__(self,obj) | 除;/操作符 |
C.__*truediv__(self,obj) | True除;/操作符 |
C.__*floordiv__(self,obj) | False除;//操作符 |
C.__*mod__(self,obj) | 取模/取余;%操作符 |
C.__*divmod__(self,obj) | 除和取模;內建divmod() |
C.__*pow__(self,obj[,mod]) | 乘冪;內建pow();**操作符 |
C.__*lshift__(self,obj) | 左移位;<<操作符 |
定制類/模擬類型 | |
數值類型:二進制操作符 | |
C.__*rshift__(self,obj) | 右移;>>操作符 |
C.__*and__(self,obj) | 按位與;&操作符 |
C.__*or__(self,obj) | 按位或;|操作符 |
C.__*xor__(self,obj) | 按位與或;^操作符 |
數值類型:一元操作符 | |
C.__neg__(self) | 一元負 |
C.__pos__(self) | 一元正 |
C.__abs__(self) | 絕對值;內建abs() |
C.__invert__(self) | 按位求反;~操作符 |
數值類型:數值轉換 | |
C.__complex__(self,com) | 轉為complex(復數);內建complex() |
C.__int__(self) | 轉為int;內建int() |
C.__long__(self) | 轉為long;內建long() |
C.__float__(self) | 轉為float;內建float() |
數值類型:基本表示法(String) | |
C.__oct__(self) | 八進制表示;內建oct() |
C.__hex__(self) | 十六進制表示;內建hex() |
數值類型:數值壓縮 | |
C.__coerce__(self,num) | 壓縮成同樣的數值類型;內建coerce() |
C.__index__(self) | 必要時壓縮可選的數值類型為整型 |
序列類型 | |
C.__len__(self) | 序列中項的數目 |
C.__getitem__(self,ind) | 得到單個序列元素 |
C.__setitem__(self,ind,val) | 設置單個序列元素 |
C.__delitem__(self,ind) | 刪除單個序列元素 |
C.__getslice__(self,ind1,ind2) | 得到序列片段 |
C.__setslice__(self,i1,i2,val) | 設置序列片段 |
C.__delslice__(self,ind1,ind2) | 刪除序列片段 |
C.__contains__(self,val) | 測試序列成員;內建in關鍵字 |
C.__*add__(self,obj) | 串連;+操作符 |
C.__*mul__(self,obj) | 重復;*操作符 |
C.__iter__(self) | 創建迭代類;內建iter() |
映射類型 | |
C.__len__(self) | mapping中的項的數目 |
C.__hash__(self) | 散列(hash)函數值 |
C.__getitem__(self,key) | 得到給定鍵(key)的值 |
C.__setitem__(self,key,val) | 設置給定鍵(key)的值 |
C.__delitem__(self,key) | 刪除給定鍵(key)的值 |
C.__missing__(self,key) | 給定鍵如果不存在字典中則提供一個默認值 |
8.10. 私有化
- Python的默認屬性都是“公開的”;
- 雙下划線(__):私有性的初步形成()
- 單下划線(_):簡單的模塊級私有化只需要中屬性名前使用一個單下划線字符,防止模塊的屬性用”from mymodule import *”加載,這種嚴格是基於作用域,也適用於函數。
8.11. 授權(P386 例13.7 twrapme.py)
8.12. 新式類的高級屬性
- Python中工廠函數:init(),long(),float(),complex(),str(),unicode(),list() tuple(),type();(新加入)basestring(),dict(),bool(),set(),frozenset() object(),classmethod(),staticmethod(),super(),property(),file()
- __slots__類屬性:可替代屬性__dict__,是一個類變量,由一序列對象組成,由所有合法標識符構成的實例屬性的集合來表示,可以是元組、列表或可迭代對象或簡單的字符串,試圖創建非__slots__中名字的實例屬性將導致AttributeError異常。
- __getattribute__()特殊方法?P394 例13.9 descr.py
- 描述符
a) __get__(),__set__()和__delete__()特殊方法;
b) 優先級別:類屬性->數據描述符->實例屬性->非數據描述符;
c) 屬性和property()內建函數 –> 默認為__getattr__()?
- 元類和__metaclass__(元類[MetaClasses]賦予你如何創建類的控制權,傳統類的元素是types.ClassType)P402 例13.10 meta.py
表格 25 與類相關的模塊
模塊 | 說明 |
UserList | 提供一個列表對象的封裝類 |
UserDict | 提供一個字典對象的封裝類 |
UserString | 提供一個字符處對象的封裝類;包括一個MutableString子類,又需要還可提供有關功能 |
types | 定義所有Python對象的類型在標准Python解釋器中的名字 |
operator | 標准操作符的函數接口 |
- 9. 執行環境
9.1. 可調用對象(Python有4種可調用對象:函數、方法、類和一些類的實例)
9.1.1. 函數
a. 內建函數(BIF):用C/C++寫的,編譯后放入Python解釋器,作為第一(內建)名稱空間的一部分加載進系統。這些函數中__bulitin__模塊中,作為__builtins__模塊導入到解釋器中。
表格 26 內建函數屬性
屬性 | 描述 |
bif.__doc__ | 文檔字符串(或None) |
bif.__name__ | 字符串類型的文檔名字 |
bif.__self__ | 設置為None(保留給內建方法) |
bif.__module__ | 存放bif定義的模塊名字(或None) |
b. 用戶定義的函數(UDF):定義在模塊最高級,作為全局名稱空間都一部分裝載到系統中。
表格 27 用戶自定義函數屬性
屬性 | 描述 |
udf.__doc__ | 文檔字符串(也可用udf.func_doc) |
udf.__name__ | 字符串類型的函數名字(也可用udf.func_name) |
udf.func_code | 字節編譯的代碼對象 |
udf.func_defaults | 默認的參數元組 |
udf.func_globals | 全局名稱空間字典;和從函數內部調用globals(x)一樣 |
udf.func_dict | 函數屬性的名稱空間 |
udf.func_doc | 見上 |
udf.func_name | 見上 |
udf.func_closure | 包含自由變量的引用的單元對象元組 |
c. lambda表達式(名為“<lambda>”的函數)
9.1.2. 方法
a. 內建方法(BIM)
如下是內建方法的屬性:
表格 28 內建方法的屬性
屬性 | 描述 |
bim.__doc__ | 文檔字符串 |
bim.__name__ | 字符串類型的函數名字 |
bim.__self__ | 綁定的對象 |
b. 用戶定義的方法(UDM):包含在類定義中,只有標准函數都包裝,僅有定義它們都類可以使用。
表格 29 用戶自定義方法的屬性
屬性 | 描述 |
udm.__doc__ | 文檔字符串(與dum.im_func.__doc__相同 |
udm.__name__ | 字符串類型的方法名字(與udm.im_func.__name__相同 |
udm.__module__ | 定於udm的模塊的名字(或none) |
udm.im_class | 方法相關聯的類(如果是非綁定,則為要求udm的類 |
udm.im_func | 方法的對象 |
udm.im_self | 如果綁定的話為相關聯的實例,如果非綁定則為none |
9.1.3. 類:“調用”類的結果便是創建了實例
9.1.4. 類的實例:Python給類提供了名為__call__的特殊方法,允許程序員創建可調用對象(實例),默認情況沒有實現該方法,即大多數實例都是不可調用的。
9.2. 代碼對象(每個可調用物的核心都是代碼對象,可以作為函數或者方法調用的一部分來執行,也可用exec語句或內建函數eval()來執行。整體上,一個Python模塊的代碼對象是構成該模塊全部代碼。
9.3. 可執行對象聲明和內建函數
P421 例14.1 loopmake.py、P425 例14.2 funcAttrs.py
表格 30 可執行的對象聲明和內建函數
內建函數和語句 | 描述 |
callable(obj) | 如果obj可調用,返回True,否則返回FALSE |
compile(string, file, type) | 從type類型中創建代碼對象;file是代碼存放的地方 |
eval(obj,globals=blobals(), locals=locals()) | 對obj進行求值,obj是已編譯為代碼對象的表達式,或是一個字符串表達式;可以給出全局或者/和局部的名稱空間 |
exec obj | 執行obj、單一的Python語句或者語句的集合,也就是說格式是代碼對象或者字符串;ojb也可以是一個文件對象 |
input(prompt=”) | 等同於eval(raw_input(prompt=”)) |
9.4. 執行其他(Python)程序
a. 導入(在定義模塊的執行語句前加入語句if __name– = ‘__main__’;
b. execfile() => execfile(filename,globals=blobals(),locals=locals());
c. 將模塊作為腳本執行(可以使用命令行從工作目錄中調用腳本$ myScript.py # or $ python myScript.py)
9.5. 執行其他(非Python)程序
表格 31 為外部程序執行提供的os模塊(△代表Unix下,■代表Windows下)
模塊函數 | 描述 |
system(cmd) | 執行程序cmd(字符串),等待程序結束,返回退出代碼(windows下始終為0) |
fork() | 創建一個和父進程並行的子進程(通常是和exec()一起使用);返回兩次…一次給父進程一次給子進程△ |
execl(file,arg0,arg1,…) | 用參數arg0、arg1等執行文件 |
execv(file,arglist) | 除了使用參數向量列表,其他的和execle相同 |
execle(file,arg0,arg1,…env) | 和execl相同,但是提供環境變量字典env |
execve(file,arglist,env) | 除了帶有參數向量列表,其他和execl相同 |
execlp(cmd,arg0,rarg1,…) | 與execl相同,但是在用戶的搜索路徑下搜索完全的文件路徑名 |
execvp(cmd,arglist) | 除了帶有參數向量列表,其他和execlp相同 |
execlpe(cmd,arg0,arg1,…env) | 和execlp相同,但是提供了環境變量字典 |
execvpe(cmd,arglist,env) | 和execvp相同,但是提供了環境變量字典 |
spawn(mode,file,args[,env]) | spawn()家族在一個新的進程中執行路徑,args作為參數,也許還有環境變量的字典env;模式(mode)是個顯示不同操作模式的魔術 |
wait() | 等待子進程完成(通常和fock和exec()一起使用△ |
waitpid(pid,options) | 等待指定的子進程完成(通常和fock和exec()一起使用△ |
popen(cmd,mode=’r’, buffering=-1) | 執行字符串cmd,返回一個類文件對象作為運行程序通信句柄,默認為讀取模式和默認系統緩沖startfileb(path) |
startfile(path) | 用關聯的應用程序執行路徑■ |
- a. os.system()
- b. os.popen()
- c. os.fork()、os.exec()、os.wait()
- d. os.spawn()
- e. subprocess模塊
表格 32 各種文件執行函數
文件對象屬性 | 描述 |
os/popen2.popen2() | 執行文件、打開文件、從新創建的運行程序讀取(stdout),或者向該程序寫(stdin) |
os/popen2.popen3() | 執行文件、打開文件、從新創建的運行程序讀取(stdout和stderr),或者向該程序寫(stdin) |
os/popen2.popen4() | 執行文件、打開文件、從新創建的運行程序讀取(結合stdout,stderr),或者向該程序寫(stdin) |
commands.getoutput() | 在子程序中執行文件,以字符串返回所有的輸出(Unix下) |
subprocess.call() | 創建subprocess的便捷函數。Popen等待命令完成,然后返回狀態代碼;與os.system()類似,是較靈活的替代方案 |
9.6. 受限執行
在Python歷史的某個時期,存在着使用了rexec和bastion模塊的限制執行的概念。第一個模塊允許沙盒(sandbox)中的執行代碼修改內建對象。第二個模塊用來過濾屬性和包裝你的類。但由於一個顯著的缺點和彌補安全漏洞的困難,這些模塊便被廢棄了。
9.7. 結束執行
干凈的執行表示當所有模塊最高級的語句執行完畢后的退出,當遇到某種致命的錯誤或不滿足繼續執行的條件的時候,Python會提前退出。可以通過異常和異常處理,或者建造一個“清掃器”方法,把代碼的主要部分放在if語句中,在沒有錯誤的情況下執行,因而可以讓錯誤的情況“正常地”終結。
- sys.exit() and SystemExit
當調用sys.exit()時,會引發systemExit()異常。除非對異常進行監控,異常通常不會被捕捉到或處理的,解釋器會用給定的狀態參數退出,默認為0,exit()的任何整型參數都會以退出狀態返回給調用者。sys.exit()經常用在命令調用的中途發現錯誤之后。
- sys.exitfunc()
sys.exitfunc()默認是不可用的,可以修改它以提供額外的功能。在調用exit()退出解釋器之前用到這個函數,如果sys.exitfunc已經被先前定義的exit函數覆蓋了,則把這段代碼作為exit()函數的一部分執行。通常exit函數用於執行某些類型的關閉活動,比如關閉文件和網絡連接,最好用於完成維護任務,比如釋放先前保留的系統資源。
- os._exit()函數
os模塊中的_exit()函數不是在一般應用中使用(平台相關,只是用特定的平台,比如基於Unix的平台,以及Win32平台)。語法是os._exit(status),不執行任何清理便立即退出Python,狀態參數是必需的。
- os.kill() Function
os模塊的kill()函數模擬傳統的unix函數來發送信號給進程。kill()參數是進程標識數(PID)和想要發送的進程的信號。發送的典型信號為SIGINT、SIGQUIT、或更徹底地,SIGKIL來使進程終結。
9.8. 各種操作系統接口
表格 33 各種OS模塊屬性(△也適用於win32)
模塊屬性 | 描述 |
unname() | 獲得系統信息(主機名、操作系統版本,補丁級別、系統架構等) |
getuid()/setuid(uid) | 獲取/設置現在進程都真正都用戶ID |
getpid()/getppid() | 獲取真正的現在/父進程ID(PID)△ |
getgid()/setgid(gid) | 獲取/設置現在進程都群組ID |
getsid()/setsid() | 獲取會話ID(SID)或創建和返回新的SID |
umask(mask) | 設置現在的數字unmask,同時返回先前的那個(mask用於文件許可)△ |
getenv(ev)/putenv(ev,value), environ | 獲取和設置環境變量ev的值;os.envion屬性是描述當前所有環境變量的字典△ |
geteuid()/setegid() | 獲取/設置當前進程的有效用戶ID(GID) |
getegid()/setegid() | 獲取/設置當前進程都有效組ID(GID) |
getpgid(pid)/setpgid(pid, pgrp) | 獲取和設置進程GID進程PID;對於get,如果pid為0,便返回現在進程的進程GID |
getlogin() | 返回運行現在進程的用戶登錄 |
times() | 返回各種進程時期的元組△ |
strerror(code) | 返回和錯誤代碼對應的錯誤信息△ |
getloadavg() | 返回代表在過去1,5,15分鍾內的系統平均負載值的元組 |
表格 34 相關模塊
模塊 | 描述 |
atexit | 注冊當Python解釋器退出時的執行句柄 |
popen2 | 提供額外的在os.popen之上的功能:提供通過標准文件和其他進程交互的能力;對於Python2.4及以上版本,使用subpross() |
commands | 提供額外的在os.system之上的功能:把所有的程序輸出保存在返回的字符串中(與輸出到屏幕相反);對於2.4及以上版本,使用subpross |
getopt | 在這樣的應用程序中的處理選項和命令行參數 |
site | 處理site-specific模塊或包 |
platform | 底層平台和架構的屬性 |
subprocess | 管理(計划替代舊的函數和模塊,比如os.system()、os.spawn()、os.popen()、popen2.*和command.*) |
原文:http://www.lupaworld.com/home-space-do-blog-uid-294076-id-121557.html