摘要:繼續講述更多的的內置函數。傳遞以切換緩沖關閉僅允許在二進制模式下,選擇行緩沖僅在文本模式下可用,并且的整數以指示固定大小的塊緩沖區的大小以字節為單位。啟動內置的幫助系統此函數主要在交互式中使用。
繼續講述更多的Python的內置函數。
IO操作input([prompt])
如果存在 prompt 實參,則將其寫入標準輸出,末尾不帶換行符。接下來,該函數從輸入中讀取一行,將其轉換為字符串(除了末尾的換行符)并返回。當讀取到 EOF 時,則觸發 EOFError。例如:
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。
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’ 則不會截斷。
正如在 Overview 中提到的,Python區分二進制和文本I/O。以二進制模式打開的文件(包括 mode 參數中的 ‘b’ )返回的內容為 bytes對象,不進行任何解碼。在文本模式下(默認情況下,或者在 *mode* 參數中包含‘t’` )時,文件內容返回為 str ,首先使用指定的 encoding (如果給定)或者使用平臺默認的的字節編碼解碼。
注解 Python不依賴于底層操作系統的文本文件概念;所有處理都由Python本身完成,因此與平臺無關。
buffering 是一個可選的整數,用于設置緩沖策略。傳遞0以切換緩沖關閉(僅允許在二進制模式下),1選擇行緩沖(僅在文本模式下可用),并且>1的整數以指示固定大小的塊緩沖區的大?。ㄒ宰止潪閱挝唬?。如果沒有給出 buffering 參數,則默認緩沖策略的工作方式如下:
二進制文件以固定大小的塊進行緩沖;使用啟發式方法選擇緩沖區的大小,嘗試確定底層設備的“塊大小”或使用 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="
", 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]: ""u7f16u7a0b"" In [25]: ascii("a b") Out[25]: ""a b""
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的內置函數提供了常用的功能,熟練使用這些內置函數對編程有很大幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43801.html
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
摘要:正如我們前面舉的張三的例子那樣,不同命名空間中的名稱之間沒有任何關系。作用域作用域,是一個命名空間可直接發放完的代碼的文本區域。刪除也是如此,語句會從局部命名空間的引用中移除對的綁定。 命名空間和作用域的概念我們之前也提到過,比如內置函數globals(),函數中變量的作用域,模塊使用的import等等。這些可能讓我們對這兩個概念有了大致的理解。本節再詳細探討一下。 showImg(h...
摘要:在中,并不是一個內置函數,而是一個類型,但是在中它是一個內置函數上面是中從看到的的說明,它的是,而不像內置函數的是。雖然的類型從中的內置函數變成了中的,但并不影響我們對它的使用。 循環是計算機程序中經常用到的流程。試想一下,如果我們有一萬個數據要處理,每個數據處理的流程都一模一樣,如果我們用順序流程就要把處理流程重復寫一萬遍,是不是很累?而用for循環就簡單多了。 showImg(ht...
摘要:我們把這些內置函數類型分成幾類進行介紹。實參的合法范圍是到進制表示是。產生一個將應用于迭代器中所有元素并返回結果的迭代器。內置的函數保證穩定。 Python解釋器內置了很多函數和類型,可以隨時隨地在編程中使用。其實,我們在前面的學習中已經接觸過好多內置函數。 showImg(https://segmentfault.com/img/remote/1460000019177948); 這...
閱讀 3094·2021-08-03 14:05
閱讀 2140·2019-08-29 15:35
閱讀 678·2019-08-29 13:30
閱讀 3168·2019-08-29 13:20
閱讀 2530·2019-08-23 18:15
閱讀 1796·2019-08-23 14:57
閱讀 2213·2019-08-23 13:57
閱讀 1309·2019-08-23 12:10