Python學習進階教程(7)—內置函數(之七)

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


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


class tuple([iterable])

tuple實際上是一個不可變的序列類型,而不是一個函數。[已在" Python學習入門(11)—序列和元組 "詳細介紹過]

class type(object)

class type(name, bases, dict)

只提供一個參數時,返回對象的類型。返回值是一個類型對象,通常與object._ class__返回的對象相同。

建議使用isinstance()內置函數來測試對象的類型,因為它把子類考慮在內。

使用三個參數時,返回一個新類型對象。這本質上是class語句的一種動態形式。name字符串是類名,併成為__name__屬性;bases元組逐項列出基類併成為__bases__屬性;dict字典是包含類主體定義的名稱空間,它被複制到一個標準字典中,成為__dict__屬性。例如,以下兩個語句創建相同類型的對象:

<code>>>> class X:
...     a = 1
...
>>> X = type('X', (object,), dict(a=1))/<code>

vars([object])

為模塊、類、實例或任何其他具有__dict__屬性的對象返回__dict__屬性。

像模塊和實例這樣的對象有一個可更新的_dict__屬性;但是,其他對象可能對它們的__dict__屬性有寫限制(例如,類使用types.MappingProxyType防止直接的字典更新)。

沒有參數,vars()就像local()一樣。注意,局部字典只對讀取有用,因為對局部字典的更新將被忽略。

zip(*iterables)

創建一個迭代器,它聚合來自每個可迭代對象的元素。

返回元組的迭代器,其中第i個元組包含來自每個參數序列或可迭代對象的第i個元素。當最短的輸入iterable用完時,迭代器停止。使用單個的可迭代參數,它返回一個1元組的迭代器。如果沒有參數,它將返回一個空迭代器。等價於:

<code>def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By

    sentinel = object()
    iterators = [iter(it) for it in iterables]
    while iterators:
        result = []
        for it in iterators:
            elem = next(it, sentinel)
            if elem is sentinel:
                return
            result.append(elem)
        yield tuple(result)/<code>

可迭代對象的求值順序是從左到右的。這使得使用zip(*[iter(s)]*n)將數據系列聚類成n-長度組的做法成為可能。這將重複相同的迭代器n次,使得每個輸出元組都是對迭代器的n次調用的結果。這樣做的效果是將輸入分成長度為n的塊。

zip()應該只有在不關心來自較長迭代的尾部不匹配的值時,才可以用於長度不等的可迭代對象。如果這些很重要,那麼可以使用itertools.zip_longest()。

zip()和*運算符可以用來unzip一個列表:

<code>>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True/<code>

__import__(name, globals=None, locals=None, fromlist=(), level=0)

注意:這是一個高級函數,與importlib.import_module()不同,在日常的Python編程中並不需要它。

這個函數由import語句調用。為了改變import語句的語義,它可以被替換(通過導入builtins和給builtins.__import__賦值),但不提倡這樣做,因為對於實現相同的目的它比使用import掛鉤(PEP 302)更簡單,且對於假定使用默認import實現的代碼不會導致問題。為了支持importlib.import_module(),也不鼓勵直接使用_import__()。

該函數導入模塊name,可能使用給定的globals和locals來確定如何在包上下文中解釋該名稱。fromlist給出了應該從名稱為name的模塊中導入的對象或子模塊的名稱。標準實現根本不使用locals參數,使用glocals參數也只是用來來確定import語句的包上下文。

level指定是使用絕對導入還是相對導入。0(默認值)表示只執行絕對導入。level的正值表示要搜索的相對於調用了_import__()的模塊的目錄的父目錄的數量 (詳細信息參見PEP 328)。

當name變量具有package.module形式時,通常,返回的是頂級包(直到第一個點的名稱),而不是name命名的模塊。但是,當給出一個非空fromlist參數時,將返回name命名的模塊。

例如,語句import spam會產生以下代碼:

<code>spam = __import__('spam', globals(), locals(), [], 0)/<code>

import spam.ham 會調用:

<code>spam = __import__('spam.ham', globals(), locals(), [], 0)/<code>

另一方面,語句from spam.ham import eggs, sausage as saus會調用:

<code>_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage/<code>

此處,模塊spam.ham由__import__()返回。從該對象中檢索要導入的名稱,並將其分配給各自的對應的名稱。

如果只是希望通過名稱導入模塊(可能是在包中),那麼可以使用importlib.import_module().

【關於"標準庫內置函數"的內容至本篇全部講完】

【結束】

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


分享到:


相關文章: