最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

容易被忽略的Python內(nèi)置類型

 更新時間:2020年09月03日 11:58:14   作者:apocelipes  
這篇文章主要介紹了容易被忽略的Python內(nèi)置類型,幫助大家更好的理解和學習python,感興趣的朋友可以了解下

Python中的內(nèi)置類型是我們開發(fā)中最常見的,很多人都能熟練的使用它們。

然而有一些內(nèi)置類型確實不那么常見的,或者說往往會被我們忽略,所以這次的主題就是帶領(lǐng)大家重新認識這些“不同尋常”的內(nèi)置類型。

(注意:本文基于python3,不會包含任何python2相關(guān)內(nèi)容)

frozenset

不可變集合(frozenset)與普通的set一樣,只不過它的元素是不可變的,因此諸如`add`,`remove`,`update`等可以添加/刪除/改變集合內(nèi)元素的方法是不存在的,換句話說一旦frozenset建立后你將不再可能更改集合內(nèi)的元素。其他的方法與set一致: ```python >>> frozen = frozenset([1, 1, 2, 3, 4, 5, 6, 6]) frozenset({1, 2, 3, 4, 5, 6}) >>> frozen | {1, 2, 3, 7, 8} frozenset({1, 2, 3, 4, 5, 6, 7, 8}) >>> frozen ^ {1, 2, 3, 7, 8} frozenset({4, 5, 6, 7, 8}) ```

range

`range`事實上相當?shù)贸R?,所以你也許會奇怪我為什么把它列出來。
其實原因很簡單,因為大部分人熟悉range的使用,但并不清楚range到底是什么。返回迭代器?返回一個可迭代對象?range本身又是什么呢?

答案揭曉:

>>> range
<class 'range'>

是的,range是個class!所以當我們使用for i in range(1, 10)這樣的代碼時,實際上我們遍歷了一個range對象,而range也實現(xiàn)了可迭代對象需要的__iter__魔法方法,所以它自身是可迭代對象:

>>> range.__iter__
<slot wrapper '__iter__' of 'range' objects>

因此,range既不返回迭代器,也不返回其他可迭代對象,而是返回的自己。

bytearray

`bytearray`一般情況下并不常見,它主要為了可以實現(xiàn)原地修改bytes對象而出現(xiàn),因為bytes和str一樣是不可變對象,例如這樣是非法的: ```python >>> b = '測試用例a'.encode('utf8') >>> b[-1] = 98 # change 'a' -> 'b' Traceback (most recent call last): File "", line 1, in TypeError: 'bytes' object does not support item assignment ``` 而當我們把bytes的內(nèi)容復(fù)制給`bytearray`時就可以進行原地修改了: ```python >>> array = bytearray(b) >>> array[-1] = 98 >>> array.decode('utf8') 測試用例b ``` `bytearray`對象沒有字面常量,因此只能通過構(gòu)造函數(shù)創(chuàng)建,它有著和bytes一樣的方法,只是可變以及多了一些序列對象的特性。如果要創(chuàng)建一個`bytearray`可以有如下的幾種方法: - `bytearray()`返回一個空的`bytearray`對象 - `bytearray(10)`創(chuàng)建一個長度為10且內(nèi)容被0填充的`bytearray` - `bytearray(iterable)`會將可迭代對象的內(nèi)容轉(zhuǎn)換成bytes然后存入對象中 - `bytearray(b'Hi!')`將已有的二進制數(shù)據(jù)復(fù)制進對象

另外bytearray還提供了fromhexhex方便將數(shù)據(jù)以16進制的形式輸入輸出:

>>> array.hex()
'e6b58be8af95e794a8e4be8b62'
>>> bytearray().fromhex('e6b58be8af95e794a8e4be8b62').decode('utf8')
'測試用例b'

memoryview

`memoryview`提供了直接訪問對象內(nèi)存的機制,只要目標對象支持[buffer protocol](https://docs.python.org/3/c-api/buffer.html#bufferobjects),例如`bytes`和`bytearray`。
memoryview有個稱為“元素”的概念,也就是對象規(guī)定的最小的內(nèi)存單元,比如bytesbytearray的最小內(nèi)存單元就是一個byte,具體取決于對象的實現(xiàn)。

len(view)通常等于len(view.tolist()),也就是等于view的“元素”數(shù)量。如果view.ndim == 0,那么整個view的內(nèi)存會被視作一個整體,len會返回1,如果view.ndim == 1那么就正常返回“元素”的個數(shù)。view.itemsize會返回單個“元素”的大小。單位是byte。

view.readonly表示當前的memoryview是否是只讀的,例如bytes對象的view就是只讀的,view.readonly的值為True。是否只讀取決于被引用的對象是否可變以及對buffer protocol的實現(xiàn)。

對于使用完畢的memoryview應(yīng)該盡快調(diào)用其release()方法釋放資源,而且部分對象在被view引用時會自動進行一些限制,比如bytearray會禁止調(diào)整大小,及時釋放view是資源可以解除這些限制。

結(jié)合示例可以更清晰地了解這些特性:

>>> 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 "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')

dict-views

準確的說,這不是一種類型,而是一種概念。然而typing里仍然將其視為一種類型,所以也就羅列在此了。
概念:返回自dict.keys(),dict.values()dict.items()的對象被稱作dict-views。

對于views對象,可以使用len,成員檢測,它本身也是可迭代對象:

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
>>> print(n)
504

>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']

>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'}
{'juice', 'sausage', 'bacon', 'spam'}

從例子中可以看出,views保持著元素的插入順序(插入順序的保證從python3.6開始)以及views動態(tài)反應(yīng)了key/value的插入和刪除以及修改,因此在某些場景下views對象是相當有用的。

The Ellipsis Object (...)

`...`不是一個類型,不過算是一個內(nèi)置對象。
它沒什么特殊的含義,僅表示省略,通常被用在type hints中:

>>> ...
Ellipsis
>>> from typing import Callable
>>> func: Callable[..., None] = lambda x,y:print(x*y)

func是一個沒有返回值的函數(shù),參數(shù)列表沒有做任何限制。

你也可以寫成Ellipsis,兩者是等價的,不過顯然是...這種形式更簡單明了。

以上就是這些容易被忽略和遺忘的內(nèi)置類型,如有錯誤和疏漏歡迎指出。

參考:

https://docs.python.org/3/library/stdtypes.html

https://docs.python.org/3/c-api/buffer.html#bufferobjects

以上就是容易被忽略的Python內(nèi)置類型的詳細內(nèi)容,更多關(guān)于Python內(nèi)置類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python制作簡單五子棋游戲

    python制作簡單五子棋游戲

    這篇文章主要為大家詳細介紹了python制作簡單五子棋游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Python?多線程爬取案例

    Python?多線程爬取案例

    這篇文章主要介紹了Python?多線程爬取案例,爬蟲屬于I/O密集型的程序,所以使用多線程可以大大提高爬取效率,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Python幫你解決手機qq微信內(nèi)存占用太多問題

    Python幫你解決手機qq微信內(nèi)存占用太多問題

    你有沒有發(fā)現(xiàn)以前16G內(nèi)存也可以裝幾個游戲玩,現(xiàn)在128G的卻日常使用都不夠了?更不用說裝什么游戲,這其實是軟件內(nèi)存占用過多導致的,今天我們用python來清理下
    2022-02-02
  • Python之字典對象的幾種創(chuàng)建方法

    Python之字典對象的幾種創(chuàng)建方法

    這篇文章主要介紹了Python之字典對象的幾種創(chuàng)建方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明

    pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明

    這篇文章主要介紹了pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python通過SSH登陸linux并操作的實現(xiàn)

    python通過SSH登陸linux并操作的實現(xiàn)

    這篇文章主要介紹了python通過SSH登陸linux并操作的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Python中進度條tqdm包使用方法及特性介紹

    Python中進度條tqdm包使用方法及特性介紹

    這篇文章主要介紹了Python中進度條tqdm包使用方法及特性,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python序列化與數(shù)據(jù)持久化實例詳解

    python序列化與數(shù)據(jù)持久化實例詳解

    這篇文章主要介紹了python序列化與數(shù)據(jù)持久化,結(jié)合實例形式詳細分析了Python序列化與數(shù)據(jù)持久化相關(guān)原理、實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下
    2019-12-12
  • python中的二維列表實例詳解

    python中的二維列表實例詳解

    這篇文章主要介紹了python中的二維列表實例詳解,文中給大家介紹了python 二維列表按列取元素的方法,需要的朋友可以參考下
    2018-06-06
  • Flask框架中密碼的加鹽哈希加密和驗證功能的用法詳解

    Flask框架中密碼的加鹽哈希加密和驗證功能的用法詳解

    加鹽加密就是在加密時混入一段隨機字符串,這段字符串便被稱為"鹽值",這里我們來看一下Python的Flask框架中密碼的加鹽哈希加密和驗證功能的用法詳解:
    2016-06-06

最新評論

古交市| 滦平县| 隆尧县| 新化县| 丽江市| 文昌市| 临颍县| 信丰县| 广州市| 石柱| 基隆市| 东乡| 临夏市| 平阳县| 华池县| 临泉县| 理塘县| 黄浦区| 南通市| 赤城县| 松溪县| 揭东县| 新巴尔虎右旗| 太仆寺旗| 广德县| 洪湖市| 奉化市| 黄梅县| 辽阳县| 凤城市| 黄平县| 邓州市| 深泽县| 灵山县| 宁安市| 大连市| 五指山市| 吉安县| 正蓝旗| 六安市| 简阳市|