91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python迭代、可迭代、迭代器的區別有哪些

發布時間:2021-11-25 13:37:33 來源:億速云 閱讀:144 作者:iii 欄目:互聯網科技

這篇文章主要介紹“python迭代、可迭代、迭代器的區別有哪些”,在日常操作中,相信很多人在python迭代、可迭代、迭代器的區別有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python迭代、可迭代、迭代器的區別有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

可迭代對象常見的有str、list、tuple、dict等,對這些容器訪問其內部元素時可以用“對象[下標]”的方式。實際上是因為python對這些對象封裝了getitem方法,以下通過斐波那契數列類的案例來了解getitem的定義方法。

表面可迭代對象

class Fib(object):
    # count表示生成斐波那契數列的個數
    def __init__(self, count):
        self.count = count
        # 保存前兩個值
        self.x = 0
        self.y = 1
        # 記錄生成數列的下標

    # 聲明Fib類是可迭代的
    def __iter__(self):
        return self

    def __getitem__(self, item):
        if isinstance(item, int):
            if item <= self.count:
                self.x = 0
                self.y = 1
                for x in range(item):
                    result = self.x
                    self.x, self.y = self.y, self.x + self.y
                return result
            else:
                raise TypeError('超出范圍!')
        elif isinstance(item, slice):
            start, stop = item.start, item.stop
            l = []
            self.x = 0
            self.y = 1
            for x in range(stop):
                if x >= start:
                    l.append(self.x)
                self.x, self.y = self.y, self.x + self.y
            return l
        else:
            raise TypeError('參數不合要求!')


fib6 = Fib(6)
print(fib6[0:5])
print(fib6[6])

            
out:
[0, 1, 1, 2, 3]
5

python解釋器在遇到對象后跟方括號[]取值時,會調用該對象的getitem方法,若要賦值調用setitem方法,若要刪除調用delitem方法。

實際上上述代碼存在缺陷,表面是可迭代對象,實際是迭代器,因為每個元素都是實時生成的,而且不能對其修改。若嘗試fib6[2]=5會報錯。

真正可迭代對象

class Fib(object):
    # count表示生成斐波那契數列的個數
    def __init__(self, count):
        self.count = count
        self.x = 0
        self.y = 1
        self.index = 0
        self.row = []
        for x in range(self.count):
            self.row.append(self.x)
            self.x, self.y = self.y, self.x + self.y
            self.index += 1

    # 聲明Fib類是可迭代的
    def __iter__(self):
        return self

    def __getitem__(self, item):
        if isinstance(item, int):
            if item <= self.count:
                return self.row[item]
            else:
                raise TypeError('超出范圍!')
        elif isinstance(item, slice):
            start, stop = item.start, item.stop
            return self.row[start:stop]
        else:
            raise TypeError('參數不合要求!')

    def __setitem__(self, item, value):
        if isinstance(item, int):
            if item <= self.count:
                self.row[item] = value
            else:
                raise TypeError('超出范圍!')
        else:
            raise TypeError('參數不合要求!')


fib6 = Fib(6)
print(fib6[:4])
fib6[2] = 5
print(fib6[:4])

out:
[0, 1, 1, 2]
[0, 1, 5, 2]

上述代碼是真正的可迭代對象,因為每個元素都是保存在列表中,可以對其修改,例如嘗試fib6[2]=5不會報錯。

注:以上代碼對slice第三參數未處理,修改值時也只能一個個改,但不影響深入理解可迭代對象。

到此,關于“python迭代、可迭代、迭代器的區別有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双牌县| 哈巴河县| 昭平县| 体育| 吴堡县| 抚顺县| 阿瓦提县| 肥乡县| 台东县| 萨迦县| 梁山县| 榆社县| 南溪县| 巴楚县| 荆门市| 宜良县| 广宗县| 土默特左旗| 平阴县| 宜宾县| 安塞县| 日喀则市| 化德县| 盱眙县| 赤水市| 五指山市| 云和县| 通州市| 沭阳县| 绥中县| 黄龙县| 诏安县| 新巴尔虎左旗| 建德市| 美姑县| 婺源县| 宕昌县| 阆中市| 察哈| 平和县| 商城县|