1. 程式人生 > 其它 >python學習之最常用的內建函式

python學習之最常用的內建函式

技術標籤:筆記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() 是既可以乘方,也可以開方的。