1. 程式人生 > >Python3標準庫(一) 內建函式

Python3標準庫(一) 內建函式

Python中內建了很多的函式,而學習標準庫我們需要事先熟悉這些內建函式,所以在這裡一個個進行介紹。有些函式比較簡單,只給予文字描述,而有些函式會給出示例程式碼幫助理解。

返回一個整數或浮點數的絕對值,如果是複數,返回它的模。

當 iterable 中所有元素都為 True 時(或者 iterable 為空),返回 True 。

當 iterable 中有元素為 True 時,則返回 True 。如果 iterable 為空,返回 False 。

類似於repr(),返回一個輸入物件的可列印的字串。

將整數 x 轉化為一個二進位制字串。當 x 不是 int 物件時,x 必須實現__index__()方法來返回一個整型數值。

>>> bin(9)
'0b1001'

將一個值轉換成一個boolean型別的值,省略 x 將返回 False。

>>> bool()
False
>>> bool('fedora')
True
bytearray的建構函式。bytearray型別是一個可變的整數序列(0 <= 整數 < 256),即位元組陣列,例如:
>>> a = bytearray(b'after')
>>> list(a)   # convert a bytearray object into a list of integers
[97, 102, 116, 101, 114]
位元組物件(bytes object)的建構函式。bytes是bytearray的不可變版本:
>>> a = bytes('after', 'UTF-8')
>>> list(a)   # convert a bytes object into a list of integers
[97, 102, 116, 101, 114]
判斷一個物件是否可呼叫,如果一個例項的類實現了call()方法,則它是可以呼叫的。
>>> f = lambda x,y : x+y
>>> callable(f)   # f是函式物件,可呼叫
True
>>> a = 10   # a 不可呼叫
>>> callable(a)
False
返回編碼值 i 對應的字元(str型別),i 的有效值為 0 到 1114111。與ord()正好相反。
>>> chr(97)
'a'

編譯一個源,返回一個程式碼物件,該程式碼物件可以用來作為exec()或者eval()的引數。

複數的建構函式,re 為返回複數物件的實數部分,im 為虛數部分。

刪除一個物件的屬性,相當於del object.name

字典型別的建構函式。

16、dir()返回一個包含了 object 所有屬性的列表物件,如果沒有引數,則包含當前作用域的所用屬性。

返回一個元組(a//b, a%b)

返回一個可迭代的 enumerate object,對其使用 next() 得到的是包含索引和元素的tuple,通常用於同時遍歷索引和元素:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

>>> for x in enumerate(seasons):   # 遍歷
...     print(x, end=' ')
... 
(0, 'Spring') (1, 'Summer') (2, 'Fall') (3, 'Winter')
相當於:
def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
執行一段程式碼,返回執行的結果。
>>> x = 1
>>> eval('x+1')
2
也是執行一段程式碼,返回None。
>>> x = 1
>>> exec('x += 10')
>>> x
11
過濾器,返回由使函式 function 返回True的 iterable 元素組成的迭代器。
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> f = lambda x: x%2==0
>>> list(filter(f, lst))
[2, 4, 6, 8]

返回一個浮點型的物件,無參時返回0.0

格式化一個值,當引數是一個自定義物件的時候,該物件需要實現__format__()方法。

>>> format(3.1415926, '7.3g')
'   3.14'

frozenset 的建構函式。顧名思義,frozenset是一種 set 型別,且不可改變(沒有add、remove等方法)。

獲得物件的name屬性,當該屬性不存在的時候可以使用一個預設值作為返回值。

返回一個包含當前所有全域性符號和對應值的字典。

返回物件的 hash 值,object 必須是可雜湊的。注意:所有不可變的內建型別都是 hashable 的,比如 string,tuple;所有可變的內建型別都是 unhashable 的,比如 list,dict(即沒有__hash__()方法)。

檢視一個物件的幫助文件。

將一個整數轉為小寫的十六進位制字串(以’0x’開頭),如果不是int物件,需要定義 __index__()方法。

31、id()返回一個物件的 id 身份,可以看作該物件的記憶體地址。

讀取一行輸入並返回一個字串。

返回一個可迭代的物件。

37、len()返回一個長度值,與 object 中的__len__()有關。

list 的建構函式。

返回一個包含當前區域性符號和對應值的字典,與globals() 對應。

對映函式,將 iterable 中的每個元素應用到 function 函式,返回由所有結果組成的迭代器。

>>> it = map(lambda x: x*2, [1,2,3,4])
>>> list(it)
[2, 4, 6, 8]

41、max()最大值。

42、min()最小值。

產生下一個生成值,與__next__()有關。

將一個整數轉為一個八進位制字串。如果不是 int 物件,需要定義__index__()方法。

開啟一個檔案,返回對應的檔案物件。

返回字元 c 的編碼值,與chr(i)相反。

>>> ord('a')
97

pow(x, y)相當於x**ypow(x, y, z)相當於pow(x, y) % z

class C:
    def __init__(self):
        self.__x = None

    def getx(self):
        return self.__x

    def setx(self, value):
        self.__x = value

    def delx(self):
        del self.__x
        
    x = property(getx, setx, delx, "I'm the 'x' property.")
為了操作資料成員 __x,我們需要使用 getx、setx、delx 方法,很麻煩。但是如果通過 property 函式將方法繫結到成員x,那麼當獲取成員x的值時,就會呼叫getx函式;當給成員x賦值時,就會呼叫setx函式;當刪除x時,就會呼叫delx函式:
c = C()
print(c.x)    # 相當於c.getx()
c.x = 20      # 相當於c.setx(20)
del c.x       # 相當於c.delx()

這樣通過 x 間接呼叫方法操作 __x 就方便多了。

將物件轉化為可列印的字串。

倒序序列,物件需要實現__reversed__()方法。

>>> round(1.75368, 3)
1.754

56、set() set 的建構函式。

返回一個靜態的方法。要知道,一個類的靜態方法沒有隱式的第一個 self 引數,因為靜態方法是獨立於例項物件的:

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

61、str()字串的建構函式。

62、sum()求和。

super() 常用於繼承中呼叫父類的方法。例如,類的繼承中,通常需要呼叫父類的構造方法,以初始化父類部分,有兩種方法能達到這個目的。

方法一:呼叫未繫結的父類構造方法

class A:
    def __init__(self):
        self.a = 'A_method'

class B:
    def __init__(self):
        self.b = 'B_method'

class C(A, B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)
        # ...其他超類
        self.c = 'C_method'
方法二:使用super函式
class A:
    def __init__(self):
        super().__init__()
        self.a = 'A_method'

class B:
    def __init__(self):
        super().__init__()
        self.b = 'B_method'

class C(A, B):
    def __init__(self):
        super().__init__()    # 等價於super(C,self).__init__()
        self.c = 'C_method'

可以看出,方法一更直觀,但是方法二使用 super 函式可以一次初始化所有超類(但要確保所有的超類的構造方法都使用了super函式)。當繼承結構很複雜時,方法二明顯更適用,當然 super 不僅可以用於構造方法還可以用於其他方法。

使用 super 還有一個好處,就是當改變父類名時,不需要再去修改其他地方,便於程式碼的維護。

元組的建構函式。

返回一個物件的型別,返回值與object.__class__一樣。

返回 object 中所有屬性與對應值的字典。沒有引數時作用和locals()一樣。

67、zip() zip 函式接受一系列可迭代的物件作為引數,將物件中對應的元素打包成一個個tuple(元組)。





附:reduce函式

在Python 3裡,reduce()函式已經被從全域性名字空間裡移除了,它現在被放置在functools模組裡。函式原型如下:

reduce(function, iterable[, initializer])
function 必須是二元函式,在省略第三個引數的情況下,函式先對 iterable 中的第1,2個數據進行操作,得到的結果再與第三個資料用 function() 函式運算……依次類推,最後得到一個結果。如果初始值 initializer 給定,第一次呼叫會是 initializer 和第一個元素而不是序列的頭兩個元素。
>>> from functools import reduce
>>> reduce(lambda x,y: x+y, [1,2,3,4,5])
15
>>> reduce(lambda x,y: x+y, [1,2,3,4,5], 10)
25
map用於對映,reduce用於歸併。

(全文完)