python基礎教程:內置函數(二)

繼續講述更多的Python的內置函數。python

IO操做

input([prompt])
若是存在 prompt 實參,則將其寫入標準輸出,末尾不帶換行符。接下來,該函數從輸入中讀取一行,將其轉換爲字符串(除了末尾的換行符)並返回。當讀取到 EOF 時,則觸發 EOFError。例如:express

In [25]: s = input('>>')
>>認真學python

In [26]: s
Out[26]: '認真學python'

若是加載了 readline 模塊,input() 將使用它來提供複雜的行編輯和歷史記錄功能。編程

open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打開 file 並返回對應的 file object。若是該文件不能打開,則觸發 OSError。app

file 是一個 path-like object,表示將要打開的文件的路徑(絕對路徑或者當前工做目錄的相對路徑),也能夠是要被封裝的整數類型文件描述符。(若是是文件描述符,它會隨着返回的 I/O 對象關閉而關閉,除非 closefd 被設爲 False 。)編程語言

mode 是一個可選字符串,用於指定打開文件的模式。默認值是 ‘r’ ,這意味着它以文本模式打開並讀取。其餘常見模式有:寫入 ‘w’ (截斷已經存在的文件);排它性建立 ‘x’ ;追加寫 ‘a’ (在 一些 Unix 系統上,不管當前的文件指針在什麼位置,全部 寫入都會追加到文件末尾)。在文本模式,若是 encoding 沒有指定,則根據平臺來決定使用的編碼:使用 locale.getpreferredencoding(False) 來獲取本地編碼。(要讀取和寫入原始字節,請使用二進制模式並不要指定 encoding。)可用的模式有:函數

字符 意義
‘r’ 讀取(默認)
‘w’ 寫入,並先截斷文件
‘x’ 排它性建立,若是文件已存在則失敗
‘a’ 寫入,若是文件存在則在末尾追加
‘b’ 二進制模式
‘t’ 文本模式(默認)
‘+’ 更新磁盤文件(讀取並寫入)
‘U’ universal newlines 模式(已棄用)
默認的模式是 ‘r’ (打開並讀取文本,同 ‘rt’ )。對於二進制寫入, ‘w+b’ 模式打開並把文件截斷成 0 字節; ‘r+b’ 則不會截斷。ui

正如在 Overview 中提到的,Python區分二進制和文本I/O。以二進制模式打開的文件(包括 mode 參數中的 ‘b’ )返回的內容爲 bytes對象,不進行任何解碼。在文本模式下(默認狀況下,或者在 *mode* 參數中包含‘t’` )時,文件內容返回爲 str ,首先使用指定的 encoding (若是給定)或者使用平臺默認的的字節編碼解碼。編碼

註解 Python不依賴於底層操做系統的文本文件概念;全部處理都由Python自己完成,所以與平臺無關。
buffering 是一個可選的整數,用於設置緩衝策略。傳遞0以切換緩衝關閉(僅容許在二進制模式下),1選擇行緩衝(僅在文本模式下可用),而且>1的整數以指示固定大小的塊緩衝區的大小(以字節爲單位)。若是沒有給出 buffering 參數,則默認緩衝策略的工做方式以下:spa

二進制文件以固定大小的塊進行緩衝;使用啓發式方法選擇緩衝區的大小,嘗試肯定底層設備的「塊大小」或使用 io.DEFAULT_BUFFER_SIZE。在許多系統上,緩衝區的長度一般爲4096或8192字節。
「交互式」文本文件( isatty() 返回 True 的文件)使用行緩衝。其餘文本文件使用上述策略用於二進制文件。
encoding 是用於解碼或編碼文件的編碼的名稱。這應該只在文本模式下使用。默認編碼是依賴於平臺的(不 管 locale.getpreferredencoding() 返回何值),但可使用任何Python支持的 text encoding 。有關支持的編碼列表,請參閱 codecs 模塊。操作系統

errors 是一個可選的字符串參數,用於指定如何處理編碼和解碼錯誤 – 這不能在二進制模式下使用。可使用各類標準錯誤處理程序(列在 Error Handlers ),可是使用 codecs.register_error() 註冊的任何錯誤處理名稱也是有效的。標準名稱包括:

若是存在編碼錯誤,’strict’ 會引起 ValueError 異常。 默認值 None 具備相同的效果。
‘ignore’ 忽略錯誤。請注意,忽略編碼錯誤可能會致使數據丟失。
‘replace’ 會將替換標記(例如 ‘?’ )插入有錯誤數據的地方。
‘surrogateescape’ 將表示任何不正確的字節做爲Unicode專用區中的代碼點,範圍從U+DC80到U+DCFF。當在寫入數據時使用 surrogateescape 錯誤處理程序時,這些私有代碼點將被轉回到相同的字節中。這對於處理未知編碼的文件頗有用。
只有在寫入文件時才支持 ‘xmlcharrefreplace’。編碼不支持的字符將替換爲相應的XML字符引用 nnn;。
‘backslashreplace’ 用Python的反向轉義序列替換格式錯誤的數據。
‘namereplace’ (也只在編寫時支持)用 N{…} 轉義序列替換不支持的字符。
newline 控制 universal newlines 模式如何生效(它僅適用於文本模式)。它能夠是 None,」,’n’,’r’ 和 ‘rn’。它的工做原理:

從流中讀取輸入時,若是 newline 爲 None,則啓用通用換行模式。輸入中的行能夠以 ‘n’,’r’ 或 ‘rn’ 結尾,這些行被翻譯成 ‘n’ 在返回呼叫者以前。若是它是 」,則啓用通用換行模式,但行結尾將返回給調用者未翻譯。若是它具備任何其餘合法值,則輸入行僅由給定字符串終止,而且行結尾將返回給未調用的調用者。
將輸出寫入流時,若是 newline 爲 None,則寫入的任何 ‘n’ 字符都將轉換爲系統默認行分隔符 os.linesep。若是 newline 是 」 或 ‘n’,則不進行翻譯。若是 newline 是任何其餘合法值,則寫入的任何 ‘n’ 字符將被轉換爲給定的字符串。
若是 closefd 是 False 而且給出了文件描述符而不是文件名,那麼當文件關閉時,底層文件描述符將保持打開狀態。若是給出文件名則 closefd 必須爲 True (默認值),不然將引起錯誤。

能夠經過傳遞可調用的 opener 來使用自定義開啓器。而後經過使用參數( file,flags )調用 opener 得到文件對象的基礎文件描述符。 opener 必須返回一個打開的文件描述符(使用 os.open as opener 時與傳遞 None 的效果相同)。

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
打印objects到文本流file,以分隔符sep分隔多個對象,並以end結尾。

語法相關

breakpoint(*args, **kwargs)
此函數會在調用時將你陷入調試器中。具體來講,它調用 sys.breakpointhook(),直接傳遞 args 和 kws 。默認狀況下, sys.breakpointhook() 調用 pdb.set_trace()且沒有參數。在這種狀況下,它純粹是一個便利函數,所以您沒必要顯式導入 pdb 且鍵入儘量少的代碼便可進入調試器。可是, sys.breakpointhook() 能夠設置爲其餘一些函數並被 breakpoint() 自動調用,以容許進入你想用的調試器。

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
將 source 編譯成代碼或 AST 對象。代碼對象能夠被 exec() 或 eval() 執行。source 能夠是常規的字符串、字節字符串,或者 AST 對象。

ascii(object)
返回一個只用ASCII碼錶示的對象。相似函數repr()返回一個對象的可打印字符串表示,可是會把其中非ASCII的字符用\x\u\U進行轉義。好比:

In [23]: ascii([1,2,3])
Out[23]: '[1, 2, 3]'

In [24]: ascii('編程')
Out[24]: "'\\u7f16\\u7a0b'"

In [25]: ascii('a\nb')
Out[25]: "'a\\nb'"

repr(object)
返回包含對象的可打印表示的字符串。對於許多類型,此函數嘗試返回一個字符串,該字符串在傳遞給eval()時會產生具備相同值的對象,不然表示形式是一個用尖括號括起來的字符串,它包含對象類型的名稱附加信息一般包括對象的名稱和地址。 類能夠經過定義repr()方法來控制此函數爲其實例返回的內容。

In [54]: repr({'a': 1, 'b':2, 'c':3})
Out[54]: "{'a': 1, 'b': 2, 'c': 3}"

In [55]: s = repr({'a': 1, 'b':2, 'c':3})

In [56]: eval(s)
Out[56]: {'a': 1, 'b': 2, 'c': 3}

eval(expression, globals=None, locals=None)
實參是一個字符串,以及可選的 globals 和 locals。globals 實參必須是一個字典。locals 能夠是任何映射對象。
這個函數也能夠用來執行任何代碼對象(如 compile() 建立的)。這種狀況下,參數是代碼對象,而不是字符串。若是編譯該對象時的 mode 實參是 ‘exec’ 那麼 eval() 返回值爲 None 。

In [17]: a = 2

In [18]: eval('a+2')
Out[18]: 4

In [19]: eval('3*3')
Out[19]: 9

In [20]: d = ascii({'a':1, 'b':2})

In [21]: d
Out[21]: "{'a': 1, 'b': 2}"

In [22]: eval(d)
Out[22]: {'a': 1, 'b': 2}

提示: exec() 函數支持動態執行語句。 globals() 和 locals() 函數各自返回當前的全局和本地字典,所以您能夠將它們傳遞給 eval() 或 exec() 來使用。

exec(object[, globals[, locals]])
這個函數支持動態執行 Python 代碼。object 必須是字符串或者代碼對象。若是是字符串,那麼該字符串將被解析爲一系列 Python 語句並執行(除非發生語法錯誤)。[1] 若是是代碼對象,它將被直接執行。在任何狀況下,被執行的代碼都須要和文件輸入同樣是有效的(見參考手冊中關於文件輸入的章節)。請注意即便在傳遞給 exec() 函數的代碼的上下文中,return 和 yield 語句也不能在函數定義以外使用。該函數返回值是 None 。

In [24]: exec('a=2;x=a*3;print(x)')
6

globals()
返回表示當前全局符號表的字典。這老是當前模塊的字典(在函數或方法中,不是調用它的模塊,而是定義它的模塊)。

locals()
更新並返回表示當前本地符號表的字典。在函數塊而不是類塊中調用 locals() 時會返回自由變量。

註解 不要更改此字典的內容;更改不會影響解釋器使用的局部變量或自由變量的值。

help([object])
啓動內置的幫助系統(此函數主要在交互式中使用)。若是沒有實參,解釋器控制檯裏會啓動交互式幫助系統。若是實參是一個字符串,則在模塊、函數、類、方法、關鍵字或文檔主題中搜索該字符串,並在控制檯上打印幫助信息。若是實參是其餘任意對象,則會生成該對象的幫助頁。

該函數經過 site 模塊加入到內置命名空間。

memoryview(obj)
返回由給定實參建立的「內存視圖」對象。有關詳細信息,請參閱 Memory Views。

類相關

@classmethod
把一個方法封裝成類方法。

一個類方法把類本身做爲第一個實參,就像一個實例方法把實例本身做爲第一個實參。請用如下習慣來聲明類方法:

class A:
    @classmethod
    def func(cls, arg1, ...): ...

@classmethod形式是函數裝飾器。
它能夠同時在類(如 C.f())和實例(如 C().f())上調用。實例除了它的類信息,其餘都會被忽略。若是一個類方法在子類上調用,子類會做爲第一個實參傳入。

類方法和 C++ 和 Java 的靜態方法是有區別的。若是你想要靜態方法,請看 staticmethod()。

@staticmethod

將方法轉換爲靜態方法。
靜態方法不會接收隱式的第一個參數。要聲明一個靜態方法,請使用此語法

class A:
    @staticmethod
    def func(arg1, arg2, ...): ...

@staticmethod 形式函數是一個 decorator 函數。它能夠在類(例如 C.f() )或實例(例如 C().f() )上調用。實例會被忽略,只須要類自己。

Python中的靜態方法與Java或C ++中的靜態方法相似。另請參閱 classmethod() ,用於建立備用類構造函數的變體。

像全部裝飾器同樣,也能夠像常規函數同樣調用 staticmethod ,並對其結果執行某些操做。好比某些狀況下須要從類主體引用函數而且您但願避免自動轉換爲實例方法。對於這些狀況,請使用此語法:

class A:
    buildin_open = staticmethod(open)

issubclass(class, classinfo)
若是 class 是 classinfo 的子類(直接、間接或 虛擬 的),則返回 true。classinfo 能夠是類對象的元組,此時 classinfo 中的每一個元素都會被檢查。其餘狀況,會觸發 TypeError 異常。

class property(fget=None, fset=None, fdel=None, doc=None)
返回 property 屬性。

fget 是獲取屬性值的函數。 fset 是用於設置屬性值的函數。 fdel 是用於刪除屬性值的函數。而且 doc 爲屬性對象建立文檔字符串。

一個典型的用法是定義一個託管屬性 x:

class A:
    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.")

若是 a 是 A 的實例,a.x 將調用getter,a.x = value 將調用setter, del a.x 將調用deleter。

若是提供了doc參數,則它就是這個屬性的docstring。不然,這個屬性會拷貝fget的docstring。

經過裝飾器能夠輕鬆實現可讀屬性:

class Point:
    def __init__(self):
        self._x = 0
        self._y = 0

    @property
    def x(self):
        """Get the current x"""
        return self._x

裝飾器@property把方法x()變爲一個「getter」只讀的同名屬性,並把x的docstring「Get the current x」做爲屬性的docstring。

屬性對象具備可用做裝飾器的getter,setter和deleter方法,這些方法建立屬性的副本,並將相應的訪問器函數設置爲裝飾函數。參考下面的例子:

class A:
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

這段代碼與第一個示例徹底等效。 要保證其餘函數指定與原始屬性相同的名稱(在本例中爲x)。

返回的屬性對象還具備與構造函數參數對應的屬性fget,fset和fdel。

Python 3.5版更改:屬性對象的docstring如今可寫了。

super([type[, object-or-type]])

返回將方法調用委託給父類或兄弟類類型的代理對象。這對於訪問已在類中重寫的繼承方法頗有用。搜索順序與getattr()使用的搜索順序相同,只是跳過了類型自己。

該類型的mro屬性列出了getattr()和super()使用的方法解析搜索順序。該屬性是動態的,只要更新繼承層次結構,就能夠更改該屬性。

若是省略第二個參數,則返回的超級對象是未綁定的。若是第二個參數是一個對象,則isinstance(obj,type)必須爲true。若是第二個參數是一個類型,則issubclass(type2,type)必須爲true(這對於classmethods頗有用)。

super有兩個典型的用例。在具備單繼承的類層次結構中,super可用於引用父類而不顯式命名它們,從而使代碼更易於維護。這種用法與其餘編程語言中super的使用密切相關。

第二個用例是在動態執行環境中支持協做多重繼承。此用例是Python獨有的,在靜態編譯語言或僅支持單繼承的語言中找不到。這使得實現「菱形圖」成爲可能,其中多個基類實現相同的方法。好的設計要求此方法在每種狀況下都具備相同的調用簽名(由於調用的順序是在運行時肯定的,由於該順序適應類層次結構中的更改,而且由於該順序能夠包括在運行時以前未知的兄弟類)。

對於這兩種用例,典型的超類調用以下所示:

class B(A):
    def method(self, arg):
        super().method(arg) # 至關於:super(B, self).method(arg)

注意,super()是做爲顯式點狀屬性查找的綁定過程的一部分實現的,例如super().getitem(name)。它經過實現本身的getattribute()方法來實現,它以可預測的順序搜索類,支持協做多重繼承。 所以,對於使用語句或運算符(如super()[name])進行隱式查找,未定義super()。

另外請注意,除零參數形式外,super()不限於使用內部方法。 兩個參數形式徹底指定參數並進行適當的引用。零參數形式僅適用於類定義,由於編譯器填寫必要的細節以正確檢索正在定義的類,以及訪問普通方法的當前實例。

對象操做

callable(object)
若是實參 object 是可調用的,返回 True,不然返回 False。若是返回真,調用仍可能會失敗;但若是返回假,則調用 object 確定會失敗。注意類是可調用的(調用類會返回一個新的實例)。若是實例的類有 call() 方法,則它是可調用。

delattr(object, name)
setattr() 相關的函數。實參是一個對象和一個字符串。該字符串必須是對象的某個屬性。若是對象容許,該函數將刪除指定的屬性。例如 delattr(x, ‘foobar’) 等價於 del x.foobar 。

dir([object])
若是沒有實參,則返回當前本地做用域中的名稱列表。若是有實參,它會嘗試返回該對象的有效屬性列表。

若是對象有一個名爲 dir() 的方法,那麼該方法將被調用,而且必須返回一個屬性列表。這容許實現自定義 getattr() 或 getattribute() 函數的對象可以自定義 dir() 來報告它們的屬性。

若是對象不提供 dir(),這個函數會嘗試從對象已定義的 dict 屬性和類型對象收集信息。結果列表並不老是完整的,若是對象有自定義 getattr(),那結果可能不許確。

默認的 dir() 機制對不一樣類型的對象行爲不一樣,它會試圖返回最相關而不是最全的信息:

  • 若是對象是模塊對象,則列表包含模塊的屬性名稱。
  • 若是對象是類型或類對象,則列表包含它們的屬性名稱,而且遞歸查找全部基類的屬性。
  • 不然,列表包含對象的屬性名稱,它的類屬性名稱,而且遞歸查找它的類的全部基類的屬性。

返回的列表按字母表排序。

getattr(object, name[, default])
返回對象命名屬性的值。name 必須是字符串。若是該字符串是對象的屬性之一,則返回該屬性的值。例如, getattr(x, ‘foobar’) 等同於 x.foobar。若是指定的屬性不存在,且提供了 default 值,則返回它,不然觸發 AttributeError。

setattr(object, name, value)
它是getattr()的對應函數。實參是對象,字符串和任意值。字符串多是已存在或新增屬性的名稱。該函數把value賦值給屬性。例如,setattr(x, 'foobar', 123)至關於x.foobar = 123

hasattr(object, name)
該實參是一個對象和一個字符串。若是字符串是對象的屬性之一的名稱,則返回 True,不然返回 False。(此功能是經過調用 getattr(object, name) 看是否有 AttributeError 異常來實現的。)

hash(object)
返回該對象的哈希值(若是它有的話)。哈希值是整數。它們在字典查找元素時用來快速比較字典的鍵。相同大小的數字變量有相同的哈希值(即便它們類型不一樣,如 1 和 1.0)。

註釋: 若是對象實現了本身的 hash() 方法,請注意,hash() 根據機器的字長來截斷返回值。另請參閱 hash()。

id(object)
返回對象的「標識值」。該值是一個整數,在此對象的生命週期中保證是惟一且恆定的。兩個生命期不重疊的對象可能具備相同的 id() 值。

isinstance(object, classinfo)
若是 object 實參是 classinfo 實參的實例,或者是(直接、間接或 虛擬)子類的實例,則返回 true。若是 object 不是給定類型的對象,函數始終返回 false。若是 classinfo 是對象類型(或多個遞歸元組)的元組,若是 object 是其中的任何一個的實例則返回 true。 若是 classinfo 既不是類型,也不是類型元組或類型的遞歸元組,那麼會觸發 TypeError 異常。

len(s)
返回對象的長度(元素個數)。實參能夠是序列(如 string、bytes、tuple、list 或 range 等)或集合(如 dictionary、set 或 frozen set 等)。

vars([object])

返回具備dict屬性的模塊,類,實例或任何其餘對象的dict屬性。

模塊和實例等對象具備可更新的dict屬性; 可是,其餘對象可能對其dict屬性具備寫入限制(例如,類使用types.MappingProxyType來防止直接字典更新)。

沒有參數,vars()就像locals()同樣。 請注意,locals字典僅對讀取有用,由於忽略了對locals字典的更新。

總結

Python的內置函數提供了經常使用的功能,熟練使用這些內置函數對編程有很大幫助。

相關文章
相關標籤/搜索