Python學習進階教程(5)—內置函數(之五)

(本號正在連續推出以Python官網文檔為主線的完整的系統的學習Python的系列文章和視頻,感興趣的朋友們歡迎搜索關注。本文及後續文章如無特別聲明均以Windows平臺作為演示平臺,Python版本為:3.8.1)


注意:開始學習“Python學習進階教程”系列內容前須已經學習過“Python學習入門教程”系列內容】


class object

返回一個沒有特徵的新對象。object是所有類的基礎。它具有對所有Python類實例都通用的方法。這個函數不接受任何參數。

注意:對象沒有__dict__,所以你不能給對象類的一個實例分配任意的屬性。


oct(x)

將整數轉換為前綴為“0o”的八進制字符串。結果是一個有效的Python表達式。如果x不是Python的int對象,它必須定義一個返回整數的__index__()方法。例如:

<code>>>> oct(8)
'0o10'
>>> oct(-56)
'-0o70'/<code>

如果要將整數轉換為帶前綴“0o”或不帶前綴的八進制字符串,可以使用以下任何一種方法。

<code>>>> '%#o' % 10, '%o' % 10
('0o12', '12')
>>> format(10, '#o'), format(10, 'o')
('0o12', '12')
>>> f'{10:#o}', f'{10:o}'
('0o12', '12')/<code>

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

打開file並返回一個對應的file對象。如果文件無法打開,則會引發OSError。

file是一個類似於路徑的對象,它提供要打開的文件的路徑名(絕對路徑名或相對於當前工作目錄的路徑名)或文件描述符(為整數)。(如果給出了一個文件描述符,那麼它在返回的I/O對象關閉時關閉,除非將closefd設置為False。)

mode是一個可選的字符串,它指定打開文件的模式。默認為“r”,是在文本模式下打開閱讀。其他常見的值有:“w”表示寫入(如果文件已經存在,則將其截斷)、“x”表示獨佔創建,“a”表示附加(在某些Unix系統中,這意味著所有的寫入都附加到文件的末尾,而不管當前的查找位置)。在文本模式中,如果沒有指定編碼,則使用的編碼依賴於平臺。調用local .getpreferredencoding(False)可獲取當前的語言環境編碼。(讀取和寫入原始字節使用二進制模式,不指定編碼。)可用的模式有:

Python學習進階教程(5)—內置函數(之五)

默認模式是“r”(打開用於讀取文本,是“rt”的同義詞)。模式“w+”和“w+b”打開並截斷文件。模式'r+'和'r+b'打開文件,沒有截斷。

Python區分了二進制和文本I/O。以二進制模式打開的文件(包括mode參數中的'b')將內容作為字節對象返回,而不進行任何解碼。在文本模式下(默認情況下,或者在mode參數中包含't'時),文件的內容作為str返回,這些字節首先使用與平臺相關的編碼進行解碼,如果給定,則使用指定的編碼。

有一個額外的模式允許使用字符'U',它不再有任何作用,已不推薦了。該模式以前在文本模式中用來啟用通用換行,這已成為Python 3.0中的默認行為。

注意:Python不依賴於底層操作系統的文本文件概念;所有的處理都是由Python本身完成的,因此是與平臺無關的。

buffering是一個可選的整數,用於設置緩衝策略。傳遞0給buffering將關閉緩衝(僅允許在二進制模式下),傳遞1將選擇行緩衝(僅可在文本模式下使用),傳遞> 1的整數表示固定大小的塊緩衝區的大小(以字節為單位)。當沒有給出緩衝參數時,默認的緩衝策略如下:

  • 二進制文件以固定大小的塊緩衝;緩衝區的大小是通過嘗試確定底層設備的“塊大小”以及io.DEFAULT_BUFFER_SIZE來選擇的。在許多系統上,緩衝區通常是4096或8192字節長。
  • “交互式”文本文件(isatty()返回True的文件)使用行緩衝。其他文本文件對二進制文件使用上述策略。

encoding是用於指定解碼或編碼文件的編碼名稱。這隻在文本模式下使用。默認編碼是平臺相關的(由local .getpreferredencoding()返回),可以使用Python支持的任何文本編碼。有關受支持的編碼的列表,請參閱codecs模塊。

errors是一個可選的字符串,它指定如何處理編碼和解碼錯誤。該參數不能用在二進制模式中。可以使用各種標準的錯誤處理程序,以及任何已註冊到codecs.register_error()的錯誤處理名稱。標準名稱包括:

  • ‘strict’如果有編碼錯誤,則拋出ValueError異常。與默認值None具有相同的效果。
  • ‘ignore’忽略錯誤。注意,忽略編碼錯誤會導致數據丟失。
  • ‘repalce’導致替換標記(如“?”)被插入到有格式錯誤數據的地方。
  • ‘surrogateescape’將把任何不正確字節表示為Unicode私有使用區域中從U+DC80到U+DCFF的代碼點。然後,當使用surrogateescape錯誤處理程序時在寫入數據時,這些私有代碼點將被轉換回字節。這對於處理未知編碼的文件很有用。
  • ‘xmlcharrefreplace’僅在寫入文件時受支持。不受編碼支持的字符將被替換為適當的XML字符引用nnn;。
  • ‘backslashreplace’用Python的反斜槓轉義序列替換了格式錯誤的數據。
  • ‘namereplace’(只在寫的時候支持)將不支持的字符替換為\\N{…}轉義序列。

newline控制通用換行模式的工作方式(它只適用於文本模式)。可以是None,'', '\\n', '\\r', '\\r\\n'。其工作原理如下:

•當從流中讀取輸入時,如果newline為None時,則啟用通用換行模式。輸入中的行可以以'\\n'、'\\r'或'\\r\\n'結尾,這些行在返回給調用者之前被轉換成'\\n'。如果newline是“,則啟用通用換行模式,但將向調用者返回未翻譯的行結束符。如果newline是任何其他合法的值,則輸入行僅由給定的字符串結束,並且此行結束符將不變地返回給調用者。

•當將輸出寫入流時,如果換行符為None,則將任何'\\n'字符轉換為系統默認的行分隔符os.linesep。如果換行符是“”或“\\n”,則不進行轉換。如果換行符是任何其他合法的值,那麼寫入的任何'\\n'字符都將被翻譯成此給定的字符串。

如果closefd為False,並且給file指定了一個文件描述符而不是文件名,那麼在關閉文件時,底層文件描述符將保持打開狀態。如果一個文件名被給定,closefd必須為真(默認值),否則將引發錯誤。

可以通過傳遞一個可調用的opener來使用自定義的文件打開器。然後,通過使用(file, flags) 調用opener獲得file對象的底層文件描述符。opener必須返回一個打開的文件描述符。將os.open作為opener的結果類似於傳遞None。

新創建的文件是不可繼承的。

下面的示例使用os.open()函數的dir_fd參數來打開相對於給定目錄的文件:

<code>>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
...     return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
...     print('This will be written to somedir/spamspam.txt', file=f)
...
>>> os.close(dir_fd)  # don't leak a file descriptor/<code>

open()函數返回的file對象的類型取決於模式。當open()用於以文本模式('w'、'r'、'wt'、'rt'等)打開文件時,它返回io的一個TextIOBase子類 (特別的是io.TextIOWrapper)。當使用緩衝區以二進制模式打開文件時,返回的類是io.BufferedIOBase的一個子類,確切的類是不同的:在read二進制模式下,它返回一個io.BufferedReader;在寫入二進制和附加二進制模式中,它返回一個io.BufferedWriter。在讀/寫模式下,它返回一個io.BufferedRandom。當緩衝被禁用時,返回原始流io.RawIOBase的子類, io.FileIO 。

該調用會引發以參數文件、模式和標誌為參數的審計事件open。

ord(c)

給定一個表示一個Unicode字符的字符串,返回一個表示該字符的Unicode編碼點的整數。例如,ord('a')返回整數97,ord('€')(歐元符號)返回8364。這是chr()的逆操作。

pow(base, exp[, mod])

返回base的exp次冪;如果mod存在,返回base的exp次冪再模mod(計算效率要好於pow(base, exp) % mod))。雙參數形式pow(base, exp)等價於使用power操作符:base**exp。

參數必須具有數值類型。對於混合操作數類型,適用於二元算術運算符的強制規則。對於int操作數,除非第二個參數是負的,否則結果的類型與操作數相同(在強制之後);在這種情況下,所有參數都轉換為float,並傳遞一個float結果。例如,10**2返回100,但是10**-2返回0.01。

對於整型操作數base和exp,如果mod存在,mod也必須是整數類型,mod必須非零。如果mod是存在的,exp是負的,那麼base與mod必須互質的。在這種情況下,返回pow(inv_base, -exp, mod),其中inv_base是對base模mod的逆。

下面是一個計算38模97的逆的例子:

<code>>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True
print(*objects,sep='', end='\\n',file=sys.stdout,flush=False)/<code>

將object打印到文本流file中,以sep分隔,後跟end。sep、end、file和flush(如果存在)必須作為關鍵字參數給出。

所有非關鍵字參數都被轉換成像str()的字符串,並寫入到流中,以sep分隔,後跟end。sep和end都必須是字符串;它們也可以是None,這將使用默認值。如果沒有object,print()將直接寫入end。

file參數必須是一個有寫(字符串)方法的對象;如果它不存在,則使用sys.stdout。由於打印的參數被轉換為文本字符串,所以print()不能與二進制模式文件對象一起使用,此時應使用file.write(…)代替。

是否緩衝輸出通常由文件決定,但是如果flush關鍵字參數為真,則強制刷新流。

class property(fget=None, fset=None, fdel=None, doc=None)

返回一個屬性。

fget是一個獲取屬性值的函數。fset是一個用於設置屬性值的函數。fdel是一個用於刪除屬性的函數。doc為屬性創建一個docstring。

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

<code>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.")/<code>

如果c是C的一個實例,則c.x將調用getter, c.x = value將調用setter, del c.x將調用deleter。

如果給定doc,doc將是屬性的docstring,否則,該屬性將複製fget的docstring(如果存在的話)。這使得使用property()作為裝飾器輕鬆創建只讀屬性成為可能:

<code>class Parrot:
    def __init__(self):
        self._voltage = 100000
 
    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage/<code>

@property裝飾器將voltage()方法轉換為具有相同名稱的只讀屬性的“getter”,並將voltage的docstring設置為“Get the current voltage”。

屬性對象具有可作為修飾符使用的getter、setter和deleter方法,這些修飾符創建屬性的副本,並將相應的訪問器函數設置為修飾後的函數。這可以用一個例子來解釋:

<code>class C:
    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/<code>

這段代碼與第一個示例完全相同。確保為附加函數提供與原始屬性相同的名稱(本例中為x)。

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

class range(stop)

class range(start, stop[, step])

range實際上是一個不可變的序列類型,而不是一個函數。range構造函數的參數必須是整數(內置的int或任何實現了__index__()特殊方法的對象)。如果省略了step參數,它的默認值是1。如果省略了start參數,它的默認值是0。如果step設為零,則引發ValueError。

對於正向step,範圍r的內容由公式r[i] = start +step*i(其中i >= 0, r[i] < stop)決定。

對於一個負的step,範圍的內容仍然由公式r[i] = start + step*i決定,但是約束條件是i >= 0和r[i] > stop。

如果r[0]不滿足值約束,則範圍對象將為空。range支持負索引,但是它們被解釋為從序列的末尾開始索引,序列的末尾由正索引決定。

雖然允許range包含值大於sys.maxsize的值,但是某些特性(比如len())可能會導致溢出錯誤。

repr(object)

返回一個包含對象的可打印表示形式的字符串。對於許多類型,這個函數試圖返回一個字符串,將此字符串傳遞給eval()將返回一個對象。否則返回的字符串是用括號括起來的類型對象的名稱加上額外的信息通常包括對象的名稱和地址。類可以通過定義一個__repr__()方法來控制這個函數為它的實例返回什麼。

reversed(seq)

返回一個反向迭代器。seq必須是一個具有__reversed__()方法的對象,或者支持序列協議(具有從0開始的整型參數的__len__()方法和__getitem__()方法)的對象。

round(number[, ndigits])

返回小數點後四捨五入為ndigit精度的數字。如果ndigit被省略或為None,它將返回其輸入的最接近的整數。

對於支持round()的內置類型,將值四捨五入為最接近的10的- ndigit次方的倍數;如果與兩個倍數接近程度相同,則向偶數進行舍入(例如,round(0.5)和round(-0.5)都是0,round(1.5)是2)。任何整數對於ndigit(正數、零或負數)都是有效的。如果省略了ndigit或沒有,則返回值為整數。否則返回值的類型與number相同。

對於一般的Python對象號,將其委託給number.__ round__。

注意:round()對於浮點數的行為可能令人意外:例如,round(2.675, 2)給出的是2.67,而不是預期的2.68。這不是一個錯誤:它是一個事實的結果,即大多數小數部分不能被準確地表示為浮點數。

【結束】

篇尾寄語:萬丈高樓平地起,是否具有紮實的基礎決定一個人能否走遠以及能走多遠。Python的學習也是同樣的道理!


分享到:


相關文章: