在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 五、自定義容器(Container)
二、Enum 的源碼
前言
一、Python 模塊簡介
一、List(列表)
五、匿名函數(shù)
三、什么是元類
二、循環(huán)語句
二、模塊的使用
三、第一個 Python 程序
線程與進程
Python
三、條件語句和循環(huán)語句綜合實例
四、對象的描述器
三、類的屬性
一、迭代
五、迭代器和生成器綜合例子
六、運算符相關(guān)的魔術(shù)方法
一、枚舉類的使用
前言
一、簡明概述
二、Python 的基本數(shù)據(jù)類型
多線程編程
五、作用域
四、包
四、枚舉的比較
四、Python 中的變量
六、類的多態(tài)
一、Python 中類也是對象
一、Python 的 Magic Method
前言
四、生成器
一、面向?qū)ο蟮母拍?/span>
五、類的繼承
二、類
二、使用 <code>type()</code> 動態(tài)創(chuàng)建類
進程
二、set
三、主模塊和非主模塊
一、字典(Dictionary)
前言
前言
前言
前言
四、集成開發(fā)環(huán)境(IDE): PyCharm
前言
四、函數(shù)的參數(shù)
三、lsit 生成式(列表生成式)
四、自定義元類
四、類的方法
二、函數(shù)傳值問題
二、注釋
一、條件語句
一、Python 語法的簡要說明
三、函數(shù)返回值
三、基本數(shù)據(jù)類型轉(zhuǎn)換
三、屬性的訪問控制
二、Python 的安裝
前言
三、命名規(guī)范
一、Python 自定義函數(shù)的基本步驟
三、自定義類型的枚舉
五、自定義容器(Container)
二、Python 迭代器
前言
二、tuple(元組)
一、Python 簡介
前言
前言
前言
二、構(gòu)造(<code>__new__</code>)和初始化(<code>__init__</code>)
前言

五、自定義容器(Container)

經(jīng)過之前編章的介紹,我們知道在 Python 中,常見的容器類型有: dict, tuple, list, string。其中也提到過可容器和不可變?nèi)萜鞯母拍睢F渲?tuple, string 是不可變?nèi)萜?,dict, list 是可變?nèi)萜鳌? 可變?nèi)萜骱筒豢勺內(nèi)萜鞯膮^(qū)別在于,不可變?nèi)萜饕坏┵x值后,不可對其中的某個元素進行修改。當(dāng)然具體的介紹,可以看回之前的文章,有圖文介紹。

那么這里先提出一個問題,這些數(shù)據(jù)結(jié)構(gòu)就夠我們開發(fā)使用嗎?不夠的時候,或者說有些特殊的需求不能單單只使用這些基本的容器解決的時候,該怎么辦呢?

這個時候就需要自定義容器了,那么具體我們該怎么做呢?

功能 說明
自定義不可變?nèi)萜黝愋?/td> 需要定義 __len____getitem__ 方法
自定義可變類型容器 在不可變?nèi)萜黝愋偷幕A(chǔ)上增加定義 __setitem____delitem__
自定義的數(shù)據(jù)類型需要迭代 需定義 __iter__
返回自定義容器的長度 需實現(xiàn) __len__(self)
自定義容器可以調(diào)用 self[key] ,如果 key 類型錯誤,拋出TypeError ,如果沒法返回key對應(yīng)的數(shù)值時,該方法應(yīng)該拋出ValueError 需要實現(xiàn) __getitem__(self, key)
當(dāng)執(zhí)行 self[key] = value 調(diào)用是 __setitem__(self, key, value)這個方法
當(dāng)執(zhí)行 del self[key] 方法 其實調(diào)用的方法是 __delitem__(self, key)
當(dāng)你想你的容器可以執(zhí)行 for x in container: 或者使用 iter(container) 需要實現(xiàn) __iter__(self) ,該方法返回的是一個迭代器

來看一下使用上面魔術(shù)方法實現(xiàn) Haskell 語言中的一個數(shù)據(jù)結(jié)構(gòu):

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class FunctionalList:
    ''' 實現(xiàn)了內(nèi)置類型list的功能,并豐富了一些其他方法: head, tail, init, last, drop, take'''

    def __init__(self, values=None):
        if values is None:
            self.values = []
        else:
            self.values = values

    def __len__(self):
        return len(self.values)

    def __getitem__(self, key):
        return self.values[key]

    def __setitem__(self, key, value):
        self.values[key] = value

    def __delitem__(self, key):
        del self.values[key]

    def __iter__(self):
        return iter(self.values)

    def __reversed__(self):
        return FunctionalList(reversed(self.values))

    def append(self, value):
        self.values.append(value)

    def head(self):
        # 獲取第一個元素
        return self.values[0]

    def tail(self):
        # 獲取第一個元素之后的所有元素
        return self.values[1:]

    def init(self):
        # 獲取最后一個元素之前的所有元素
        return self.values[:-1]

    def last(self):
        # 獲取最后一個元素
        return self.values[-1]

    def drop(self, n):
        # 獲取所有元素,除了前N個
        return self.values[n:]

    def take(self, n):
        # 獲取前N個元素
        return self.values[:n]
上一篇:前言下一篇:多線程編程