国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python標(biāo)準(zhǔn)庫---14、內(nèi)置類型:二進(jìn)制序列類型 (memoryview)

yacheng / 3678人閱讀

摘要:對于更高的維度,其長度等于表示的嵌套列表的長度。這是數(shù)組在連續(xù)表示時(shí)將會占用的空間總字節(jié)數(shù)。該值僅作為參考信息。新版功能一個(gè)表明內(nèi)存是否為的布爾值。新版功能上一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型二進(jìn)制序列類型下一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型集合類型映射類型

上一篇文章:Python標(biāo)準(zhǔn)庫---13、內(nèi)置類型:二進(jìn)制序列類型 ( bytes, bytearray)
下一篇文章:Python標(biāo)準(zhǔn)庫---15、內(nèi)置類型:集合類型、映射類型
內(nèi)存視圖

memoryview 對象允許 Python 代碼訪問一個(gè)對象的內(nèi)部數(shù)據(jù),只要該對象支持 緩沖區(qū)協(xié)議 而無需進(jìn)行拷貝。

class memoryview(obj)

創(chuàng)建一個(gè)引用 obj 的 memoryview。 obj 必須支持緩沖區(qū)協(xié)議。 支持緩沖區(qū)協(xié)議的內(nèi)置對象包括 bytes 和 bytearray。

memoryview 具有 元素 的概念,即由原始對象 obj 所處理的基本內(nèi)存單元。 對于許多簡單類型例如 bytes 和 bytearray 來說,一個(gè)元素就是一個(gè)字節(jié),但是其他的類型例如 array.array 可能有更大的元素。

len(view) 與 tolist 的長度相等。 如果 view.ndim = 0,則其長度為 1。 如果 view.ndim = 1,則其長度等于 view 中元素的數(shù)量。 對于更高的維度,其長度等于表示 view 的嵌套列表的長度。 itemsize 屬性可向你給出單個(gè)元素所占的字節(jié)數(shù)。

memoryview 支持通過切片和索引訪問其元素。 一維切片的結(jié)果將是一個(gè)子視圖:

    >>> v = memoryview(b"abcefg")
    >>> v[1]
    98
    >>> v[-1]
    103
    >>> v[1:4]
    
    >>> bytes(v[1:4])
    b"bce"

如果 format 是一個(gè)來自于 struct 模塊的原生格式說明符,則也支持使用整數(shù)或由整數(shù)構(gòu)成的元組進(jìn)行索引,并返回具有正確類型的單個(gè) 元素。 一維內(nèi)存視圖可以使用一個(gè)整數(shù)或由一個(gè)整數(shù)構(gòu)成的元組進(jìn)行索引。 多維內(nèi)存視圖可以使用由恰好 ndim 個(gè)整數(shù)構(gòu)成的元素進(jìn)行索引,ndim 即其維度。 零維內(nèi)存視圖可以使用空元組進(jìn)行索引。

這里是一個(gè)使用非字節(jié)格式的例子:
    >>> import array
    >>> a = array.array("l", [-11111111, 22222222, -33333333, 44444444])
    >>> m = memoryview(a)
    >>> m[0]
    -11111111
    >>> m[-1]
    44444444
    >>> m[::2].tolist()
    [-11111111, -33333333]

如果下層對象是可寫的,則內(nèi)存視圖支持一維切片賦值。 改變大小則不被允許:

    >>> data = bytearray(b"abcefg")
    >>> v = memoryview(data)
    >>> v.readonly
    False
    >>> v[0] = ord(b"z")
    >>> data
    bytearray(b"zbcefg")
    >>> v[1:4] = b"123"
    >>> data
    bytearray(b"z123fg")
    >>> v[2:3] = b"spam"
    Traceback (most recent call last):
      File "", line 1, in 
    ValueError: memoryview assignment: lvalue and rvalue have different structures
    >>> v[2:6] = b"spam"
    >>> data
    bytearray(b"z1spam")

由帶有格式符號 "B", "b" 或 "c" 的可哈希(只讀)類型構(gòu)成的一維內(nèi)存視圖同樣是可哈希的。 哈希定義為 hash(m) == hash(m.tobytes()):

    >>> v = memoryview(b"abcefg")
    >>> hash(v) == hash(b"abcefg")
    True
    >>> hash(v[2:4]) == hash(b"ce")
    True
    >>> hash(v[::-2]) == hash(b"abcefg"[::-2])
    True

在 3.3 版更改: 一維內(nèi)存視圖現(xiàn)在可以被切片。 帶有格式符號 "B", "b" 或 "c" 的一維內(nèi)存視圖現(xiàn)在是可哈希的。

在 3.4 版更改: 內(nèi)存視圖現(xiàn)在會自動注冊為 collections.abc.Sequence

在 3.5 版更改: 內(nèi)存視圖現(xiàn)在可使用整數(shù)元組進(jìn)行索引。

memoryview 具有以下一些方法:

__eq__(exporter)

memoryview 與 PEP 3118 中的導(dǎo)出器這兩者如果形狀相同,并且如果當(dāng)使用 struct 語法解讀操作數(shù)的相應(yīng)格式代碼時(shí)所有對應(yīng)值都相同,則它們就是等價(jià)的。

對于 tolist() 當(dāng)前所支持的 struct 格式字符串子集,如果 v.tolist() == w.tolist() 則 v 和 w 相等:

        >>> import array
        >>> a = array.array("I", [1, 2, 3, 4, 5])
        >>> b = array.array("d", [1.0, 2.0, 3.0, 4.0, 5.0])
        >>> c = array.array("b", [5, 3, 1])
        >>> x = memoryview(a)
        >>> y = memoryview(b)
        >>> x == a == y == b
        True
        >>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
        True
        >>> z = y[::-2]
        >>> z == c
        True
        >>> z.tolist() == c.tolist()
        True

如果兩邊的格式字符串都不被 struct 模塊所支持,則兩對象比較結(jié)果總是不相等(即使格式字符串和緩沖區(qū)內(nèi)容相同):

        >>> from ctypes import BigEndianStructure, c_long
        >>> class BEPoint(BigEndianStructure):
        ...     _fields_ = [("x", c_long), ("y", c_long)]
        ...
        >>> point = BEPoint(100, 200)
        >>> a = memoryview(point)
        >>> b = memoryview(point)
        >>> a == point
        False
        >>> a == b
        False

請注意,與浮點(diǎn)數(shù)的情況一樣,對于內(nèi)存視圖對象來說,v is w 也 并不 意味著 v == w。

在 3.3 版更改: 之前的版本比較原始內(nèi)存時(shí)會忽略條目的格式與邏輯數(shù)組結(jié)構(gòu)。

tobytes()

將緩沖區(qū)中的數(shù)據(jù)作為字節(jié)串返回。 這相當(dāng)于在內(nèi)存視圖上調(diào)用 bytes 構(gòu)造器。

        >>> m = memoryview(b"abc")
        >>> m.tobytes()
        b"abc"
        >>> bytes(m)
        b"abc"

對于非連續(xù)數(shù)組,結(jié)果等于平面化表示的列表,其中所有元素都轉(zhuǎn)換為字節(jié)串。 tobytes() 支持所有格式字符串,不符合 struct 模塊語法的那些也包括在內(nèi)。

hex()

返回一個(gè)字符串對象,其中分別以兩個(gè)十六進(jìn)制數(shù)碼表示緩沖區(qū)里的每個(gè)字節(jié)。

        >>> m = memoryview(b"abc")
        >>> m.hex()
        "616263"

3.5 新版功能.

tolist()

將緩沖區(qū)內(nèi)的數(shù)據(jù)以一個(gè)元素列表的形式返回。

        >>> memoryview(b"abc").tolist()
        [97, 98, 99]
        >>> import array
        >>> a = array.array("d", [1.1, 2.2, 3.3])
        >>> m = memoryview(a)
        >>> m.tolist()
        [1.1, 2.2, 3.3]

在 3.3 版更改: tolist() 現(xiàn)在支持 struct 模塊語法中的所有單字符原生格式以及多維表示形式。

release()

釋放由內(nèi)存視圖對象所公開的底層緩沖區(qū)。 許多對象在被視圖所獲取時(shí)都會采取特殊動作(例如,bytearray 將會暫時(shí)禁止調(diào)整大小);因此,調(diào)用 release() 可以方便地盡早去除這些限制(并釋放任何多余的資源)。

在此方法被調(diào)用后,任何對視圖的進(jìn)一步操作將引發(fā) ValueError (release() 本身除外,它可以被多次調(diào)用):

        >>> m = memoryview(b"abc")
        >>> m.release()
        >>> m[0]
        Traceback (most recent call last):
          File "", line 1, in 
        ValueError: operation forbidden on released memoryview object

        使用 with 語句,可以通過上下文管理協(xié)議達(dá)到類似的效果:
        >>>

        >>> with memoryview(b"abc") as m:
        ...     m[0]
        ...
        97
        >>> m[0]
        Traceback (most recent call last):
          File "", line 1, in 
        ValueError: operation forbidden on released memoryview object

3.2 新版功能.

cast(format[, shape])

將內(nèi)存視圖轉(zhuǎn)化為新的格式或形狀。 shape 默認(rèn)為 [byte_length//new_itemsize],這意味著結(jié)果視圖將是一維的。 返回值是一個(gè)新的內(nèi)存視圖,但緩沖區(qū)本身不會被復(fù)制。 支持的轉(zhuǎn)化有 1D -> C-contiguous 和 C-contiguous -> 1D。

目標(biāo)格式僅限于 struct 語法中的單一元素原生格式。 其中一種格式必須為字節(jié)格式 ("B", "b" 或 "c")。 結(jié)果的字節(jié)長度必須與原始長度相同。

將 1D/long 轉(zhuǎn)換為 1D/unsigned bytes:

        >>> import array
        >>> a = array.array("l", [1,2,3])
        >>> x = memoryview(a)
        >>> x.format
        "l"
        >>> x.itemsize
        8
        >>> len(x)
        3
        >>> x.nbytes
        24
        >>> y = x.cast("B")
        >>> y.format
        "B"
        >>> y.itemsize
        1
        >>> len(y)
        24
        >>> y.nbytes
        24

將 1D/unsigned bytes 轉(zhuǎn)換為 1D/char:

        >>> b = bytearray(b"zyz")
        >>> x = memoryview(b)
        >>> x[0] = b"a"
        Traceback (most recent call last):
          File "", line 1, in 
        ValueError: memoryview: invalid value for format "B"
        >>> y = x.cast("c")
        >>> y[0] = b"a"
        >>> b
        bytearray(b"ayz")

將 1D/bytes 轉(zhuǎn)換為 3D/ints 再轉(zhuǎn)換為 1D/signed char:

       >>> import struct
       >>> buf = struct.pack("i"*12, *list(range(12)))
       >>> x = memoryview(buf)
       >>> y = x.cast("i", shape=[2,2,3])
       >>> y.tolist()
       [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
       >>> y.format
       "i"
       >>> y.itemsize
       4
       >>> len(y)
       2
       >>> y.nbytes
       48
       >>> z = y.cast("b")
       >>> z.format
       "b"
       >>> z.itemsize
       1
       >>> len(z)
       48
       >>> z.nbytes
       48

將 1D/unsigned char 轉(zhuǎn)換為 2D/unsigned long:

        >>> buf = struct.pack("L"*6, *list(range(6)))
        >>> x = memoryview(buf)
        >>> y = x.cast("L", shape=[2,3])
        >>> len(y)
        2
        >>> y.nbytes
        48
        >>> y.tolist()
        [[0, 1, 2], [3, 4, 5]]

3.3 新版功能.

在 3.5 版更改: 當(dāng)轉(zhuǎn)換為字節(jié)視圖時(shí),源格式將不再受限。

還存在一些可用的只讀屬性:

obj

內(nèi)存視圖的下層對象:

        >>> b  = bytearray(b"xyz")
        >>> m = memoryview(b)
        >>> m.obj is b
        True

3.3 新版功能.

nbytes

nbytes == product(shape) * itemsize == len(m.tobytes())。 這是數(shù)組在連續(xù)表示時(shí)將會占用的空間總字節(jié)數(shù)。 它不一定等于 len(m):

        >>> import array
        >>> a = array.array("i", [1,2,3,4,5])
        >>> m = memoryview(a)
        >>> len(m)
        5
        >>> m.nbytes
        20
        >>> y = m[::2]
        >>> len(y)
        3
        >>> y.nbytes
        12
        >>> len(y.tobytes())
        12

多維數(shù)組:

        >>> import struct
        >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
        >>> x = memoryview(buf)
        >>> y = x.cast("d", shape=[3,4])
        >>> y.tolist()
        [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
        >>> len(y)
        3
        >>> y.nbytes
        96

3.3 新版功能.

readonly

一個(gè)表明內(nèi)存是否只讀的布爾值。

format

一個(gè)字符串,包含視圖中每個(gè)元素的格式(表示為 struct 模塊樣式)。 內(nèi)存視圖可以從具有任意格式字符串的導(dǎo)出器創(chuàng)建,但某些方法 (例如 tolist()) 僅限于原生的單元素格式。

在 3.3 版更改: 格式 "B" 現(xiàn)在會按照 struct 模塊語法來處理。 這意味著 memoryview(b"abc")[0] == b"abc"[0] == 97。

itemsize

memoryview 中每個(gè)元素以字節(jié)表示的大小:

        >>> import array, struct
        >>> m = memoryview(array.array("H", [32000, 32001, 32002]))
        >>> m.itemsize
        2
        >>> m[0]
        32000
        >>> struct.calcsize("H") == m.itemsize
        True
ndim

一個(gè)整數(shù),表示內(nèi)存所代表的多維數(shù)組具有多少個(gè)維度。

### shape

一個(gè)整數(shù)元組,通過 ndim 的長度值給出內(nèi)存所代表的 N 維數(shù)組的形狀。

在 3.3 版更改: 當(dāng) ndim = 0 時(shí)值為空元組而不再為 None。

strides

一個(gè)整數(shù)元組,通過 ndim 的長度給出以字節(jié)表示的大小,以便訪問數(shù)組中每個(gè)維度上的每個(gè)元素。

在 3.3 版更改: 當(dāng) ndim = 0 時(shí)值為空元組而不再為 None。

suboffsets

供 PIL 風(fēng)格的數(shù)組內(nèi)部使用。 該值僅作為參考信息。

c_contiguous

一個(gè)表明內(nèi)存是否為 C-contiguous 的布爾值。

3.3 新版功能.

f_contiguous
    一個(gè)表明內(nèi)存是否為 Fortran contiguous 的布爾值。

    3.3 新版功能.
contiguous

一個(gè)表明內(nèi)存是否為 contiguous 的布爾值。

3.3 新版功能.

上一篇文章:Python標(biāo)準(zhǔn)庫---13、內(nèi)置類型:二進(jìn)制序列類型 ( bytes, bytearray)
下一篇文章:Python標(biāo)準(zhǔn)庫---15、內(nèi)置類型:集合類型、映射類型

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44001.html

相關(guān)文章

  • Python學(xué)習(xí)之路21-序列構(gòu)成的數(shù)組

    摘要:第行把具名元組以的形式返回。對序列使用和通常號兩側(cè)的序列由相同類型的數(shù)據(jù)所構(gòu)成當(dāng)然不同類型的也可以相加,返回一個(gè)新序列。從上面的結(jié)果可以看出,它雖拋出了異常,但仍完成了操作查看字節(jié)碼并不難,而且它對我們了解代碼背后的運(yùn)行機(jī)制很有幫助。 《流暢的Python》筆記。接下來的三篇都是關(guān)于Python的數(shù)據(jù)結(jié)構(gòu),本篇主要是Python中的各序列類型 1. 內(nèi)置序列類型概覽 Python標(biāo)準(zhǔn)庫...

    ralap 評論0 收藏0
  • Python標(biāo)準(zhǔn)---15、內(nèi)置類型:集合類型、映射類型

    摘要:目前有兩種內(nèi)置集合類型,和。兩個(gè)類的構(gòu)造器具有相同的作用方式返回一個(gè)新的或?qū)ο螅湓貋碜杂凇R硎居杉蠈ο髽?gòu)成的集合,所有的內(nèi)層集合必須為對象。目前僅有一種標(biāo)準(zhǔn)映射類型字典。 上一篇文章:Python標(biāo)準(zhǔn)庫---14、內(nèi)置類型:二進(jìn)制序列類型 (memoryview)下一篇文章:Python標(biāo)準(zhǔn)庫---16、內(nèi)置類型:上下文管理器類型、其他、特殊屬性 集合類型 --- set, ...

    kycool 評論0 收藏0
  • Python標(biāo)準(zhǔn)---12、內(nèi)置類型:文本序列類型(str)

    摘要:上一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型迭代器類型序列類型下一篇文章標(biāo)準(zhǔn)庫內(nèi)置類型二進(jìn)制序列類型文本序列類型在中處理文本數(shù)據(jù)是使用對象,也稱為字符串。正式的定義為十進(jìn)制數(shù)字符就是一般分類中的字符。 上一篇文章:Python標(biāo)準(zhǔn)庫---11、內(nèi)置類型:迭代器類型、序列類型(list-typle-range)下一篇文章:Python標(biāo)準(zhǔn)庫---13、內(nèi)置類型:二進(jìn)制序列類型 ( bytes, bytear...

    luoyibu 評論0 收藏0
  • 流暢的python讀書筆記-第九章-符合Python風(fēng)格的對象

    摘要:以便于用戶理解的方式返回對象的字符串表示形式。函數(shù)會調(diào)用函數(shù),對來說,輸出的是一個(gè)有序?qū)Α4送猓€有用于支持內(nèi)置的構(gòu)造函數(shù)的方法。可散列實(shí)現(xiàn)了方法,使用推薦的異或運(yùn)算符計(jì)算實(shí)例屬性的散列值私有屬性最好用命名規(guī)則來實(shí)現(xiàn)這種方式有好有壞 絕對不要使用兩個(gè)前導(dǎo)下劃線,這是很煩人的自私行為。——Ian Bicking 對象表示形式 repr()  以便于開發(fā)者理解的方式返回對象的字符串表示形式...

    fai1017 評論0 收藏0
  • 流暢的python

    摘要:流暢的中有很多奇技淫巧,整本書都在強(qiáng)調(diào)如何最大限度地利用標(biāo)準(zhǔn)庫。常見的扁平序列包括,,等。數(shù)組支持所有跟可變序列有關(guān)的操作,包括和。和用于指定列表的區(qū)間,默認(rèn)是使用整個(gè)列表。但是元組的賦值不被允許,當(dāng)異發(fā)生時(shí) 流暢的python中有很多奇技淫巧,整本書都在強(qiáng)調(diào)如何最大限度地利用Python 標(biāo)準(zhǔn)庫。介紹了很多python的不常用的數(shù)據(jù)類型、操作、庫等,對于入門python后想要提升對p...

    Alan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<