python學習之最常用的內建函式
python學習之最常用的內建函式
Python 內建函式總共有70餘個(通常把內建類也統稱為內建函式),覆蓋面廣,功能強大。不過,對於初學者在初級階段,掌握下面幾個函式是當務之急。
(1) 控制檯輸出函式 print()
print() 應該是每一個初學者首先接觸到的函式,也一定用得非常熟練。我們知道,print() 函式一次可以列印多個物件,列印物件可以是任意型別。此外,print() 函式還有4個預設引數,靈活運用,方能得心應手。
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
- objects – 零個或多個輸出物件。輸出多個物件時,需要用半形逗號分隔
- sep – 用來間隔多個物件,預設值是一個空格
- end – 用來設定以什麼結尾。預設值是換行符 \n,我們可以換成其他字串
- file – 要寫入的檔案物件
- flush – 輸出是否被快取通常決定於 file,但如果 flush 關鍵字引數為 True,流會被強制重新整理
(2) 控制檯輸入函式 input()
input() 函式常用於程式執行過程中接收使用者輸入的引數,使用者敲擊回車鍵,函式即返回使用者輸入的字串,但不包括回車符。因input() 函式本身具備IO阻塞的功能,所以也可用於作為程式除錯斷點來使用。input() 函式沒有預設引數,但接受一個字串作為輸入提示資訊。
>>> nums = input('請輸入3個整數,中間以空格分割,回車結束輸入:')
請輸入3個整數,中間以空格分割,回車結束輸入:3 4 5 6
>>> print(nums) # 請注意,nums是一個字串,不是整數
3 4 5 6
>>> [int(item) for item in nums.split()] # 這樣才可以把輸入的字串變成3個整數
[3, 4, 5, 6]
(3) 可迭代物件長度函式 len()
len() 函式也是初學者接觸最早、最容易記住的函式之一,len 是 length 簡寫,該函式用於返回列表、元祖、字典、字串等可迭代物件的長度(或稱為元素數量)。至於什麼是可迭代物件,暫時可以不用深究,隨著學習的深入,會逐步理解的。
(4) 序列生成器函式 range()
通常我們是在學習 for 迴圈的時候,認識的 range() 函式。最初(py2時代),range() 函式返回的是一個列表,因為太耗記憶體,所以進入新時代(py3時代)之後,range() 函式不再返回列表,而是range類了。
(5) 格式化輸出函式 format()
雖然這裡提到的是 format() 函式,但大多數情況下,我更喜歡用%去做格式化輸出。讀者可以通過下面的例子體會一下兩種格式化方法的差異。
下面給出用%去做格式化輸出的常用符號速查表。
符號 | 功能 |
---|---|
%d,%i | 轉換為帶符號的十進位制形式的整數 |
%o | 轉換為帶符號的八進位制形式的整數 |
%x,%X | 轉換為帶符號的十六進位制形式的整數 |
%e | 轉化為科學計數法表示的浮點數(e 小寫) |
%E | 轉化為科學計數法表示的浮點數(E 大寫) |
%f,%F | 轉化為十進位制形式的浮點數 |
%g | 智慧選擇使用 %f 或 %e 格式 |
%G | 智慧選擇使用 %F 或 %E 格式 |
%c | 格式化字元及其 ASCII 碼 |
%r | 使用 repr() 將變數或表示式轉換為字串 |
%s | 使用 str() 將變數或表示式轉換為字串 |
(6) 排序函式 sorted()
排序是比較常見的需求。排序函式 sorted() 不會改變原有的資料結構,而是返回一個新的排序結果。這一點,和列表類的 sort() 方法不同。列表類的 sort() 方法改變了列表自身,且無返回值。
>>> sorted([3,2,7,1,5]) # 一維列表排序
[1, 2, 3, 5, 7]
>>> sorted([3,2,7,1,5], reverse=True) # 一維列表排序,逆序輸出
[7, 5, 3, 2, 1]
(7) 檔案操作函式 open()
檔案讀寫是程式設計師最基本的技能之一,必須熟練掌握。好在Python的檔案操作非常簡單,很容易上手。通常檔案讀寫時,不管正常還是非正常結束,一定要關閉檔案——這需要捕獲異常並進行處理。為了簡化程式碼,使之更加優雅,我習慣使用 with - as 來操作檔案。
開啟檔案有多種模式,詳見下表:
mode引數 | 引數概述 | 引數功能 |
---|---|---|
r / rt | 只讀模式(預設) | 只能獲取文字內容,不能寫入 |
rb | 二進位制只讀模式 | 使用二進位制獲取文字內容, 通常用於獲取圖片視訊等非文字 |
r+ | 讀寫追加 | 用於讀寫,檔案指標放在內容開頭 |
rb+ | 二進位制讀寫追加 | 用於二進位制讀寫,檔案指標放在內容開頭 |
w / wt | 只寫模式 | 用於寫入內容,會將原本的內容覆蓋 |
w+ | 只寫追加 | 用於寫入內容,會在原本的內容之後續寫 |
wb | 二進位制只寫模式 | 用於寫入二進位制內容,會將原本的內容覆蓋 通常用於寫入圖片視訊等非文字 |
wb+ | 二進位制只寫追加 | 用於寫入二進位制內容,會在原本的內容之後續寫 通常用於寫入圖片視訊等非文字 |
a / at | 讀寫追加 | 用於讀取或寫入內容,寫入會在原本的內容之後續寫 沒有文字則建立文字 |
ab | 二進位制讀寫追加 | 用於讀取或寫入二進位制內容,寫入會在原本內容之後續寫 沒有文字則建立文字 |
a+ | 讀寫追加 | 用於讀取或寫入內容,寫入會在原本的內容之後續寫 沒有文字則建立文字 |
ab+ | 二進位制讀寫追加 | 用於讀取或寫入二進位制內容,寫入會在原本內容之後續寫 沒有文字則建立文字 |
下面的例子,演示瞭如何將資料寫入到csv檔案,又如何讀出csv檔案中的資料。
>>> with open(r'd:\csv_data.csv', 'w') as fp: # 寫csv檔案
for line in [[0.468,0.975,0.446],[0.718,0.826,0.359]]:
ok = fp.write('%s\n'%','.join([str(item) for item in line]))
>>> with open(r'd:\csv_data.csv', 'r') as fp:
print(fp.read())
0.468,0.975,0.446
0.468,0.975,0.446
>>> with open(r'd:\csv_data.csv', 'r') as fp: # 讀csv檔案
for line in fp.readlines():
print('%s - %s - %s'%tuple(line.strip().split(',')))
0.468 - 0.975 - 0.446
0.468 - 0.975 - 0.446
12345678910111213141516
(8) 型別相關函式 type()/isinstance()
對於初學者來說,執行程式碼時出了問題是最頭疼的事兒:根本不知道發生了什麼,又該從何處入手。如果不是縮排錯誤,或者找不到模組一類的初級錯誤,那麼,檢視變數的型別,也許是最值得一試的除錯方法。type() 就是用於檢視物件型別的函式。
>>> type(5)
<class 'int'>
>>> type('ssdf')
<class 'str'>
>>> type([])
<class 'list'>
>>> type(print)
<class 'builtin_function_or_method'>
>>> type(range(5))
<class 'range'>
12345678910
但是,有很多同學瞭解了 type() 之後,喜歡用它來做型別判斷,這是不正確的。用於型別判斷的函式是isinstance(),請看:
>>> a = [3,4,5]
>>> b = ('x', 'y')
>>> c = dict()
>>> d = 'python'
>>> isinstance(a, list)
True
>>> isinstance(b, list)
False
>>> isinstance(c, (dict,str))
True
>>> isinstance(d, (dict,str))
True
>>> isinstance(b, (dict,str))
False
1234567891011121314
(9) 特殊功能函式 enumerate()/zip()/map()/chr()/ord()
遍歷列表、字串等可迭代物件的時候,如果我們想同時得到元素的索引序號,enumerate() 函式就可以派上用場了。enumerate() 返回可迭代物件的索引和元素組成的元組的迭代物件,所以,不用擔心該函式的效率和資源消耗情況,放心使用好了。
>>> for index, item in enumerate([True, False, None]):
print(index, item, sep='->')
0->True
1->False
2->None
>>> for index, item in enumerate('xyz'):
print(index, item, sep='->')
0->x
1->y
2->z
123456789101112
zip() 函式也有一個經典的應用場景:同時遍歷多個列表。
>>> a = ['x','y','z']
>>> b = [3,4,5]
>>> for k, v in zip(a,b):
print(k, v, sep='->')
x->3
y->4
z->5
12345678
map() 函式可以理解為對列表中的每一個元素做一次計算,這個計算由函式引數指定。這個作為引數的函式,可以是普通的函式,也可以是 lambda 匿名函式。我們以對列表中各元素開三次方為例,演示一下man() 函式的用法。
>>> def extract(x): # 開3次方
return pow(x, 1/3)
>>> result = map(extract, [7,8,9]) # 使用函式extract()對列表元素逐一開3次方,返回一個迭代物件
>>> list(result) # 將迭代物件轉為list
[1.912931182772389, 2.0, 2.080083823051904]
>>> list(map(lambda x:pow(x, 1/3), [7,8,9])) # 使用lambda函式,更簡潔
[1.912931182772389, 2.0, 2.080083823051904]
12345678
chr() 函式返回 ascii 編碼值對應的字元,ord() 函式返回字元的 ascii 編碼值, 二者是互逆的操作。
>>> chr(65)
'A'
>>> ord('Z')
90
>>> for i in range(26):
print(chr(65+i), sep='', end='')
ABCDEFGHIJKLMNOPQRSTUVWXYZ
12345678
(10) 數學函式 sum()/max()/min()/abs()/pow()/divmod()/round()
Python 內建的數學計算與統計函式不多,但基本夠用。不過,如果你需要對數函式和三角函式的話,你恐怕得匯入 manth 模組(標準模組)或者其他模組了(比如 numpy 等)。需要提醒大家的是,很多教科書說,做開方運算就得匯入 manth 模組,其實,內建函式 pow() 是既可以乘方,也可以開方的。