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

溫馨提示×

溫馨提示×

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

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

什么是Python迭代器和生成器

發布時間:2020-09-24 11:43:48 來源:億速云 閱讀:98 作者:Leah 欄目:編程語言

什么是Python迭代器和生成器?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

迭代器與可迭代對象

概念

迭代器:是訪問數據集合內元素的一種方式,一般用來遍歷數據,但是他不能像列表一樣使用下標來獲取數據,也就是說迭代器是不能返回的。

Iterator:迭代器對象,必須要實現 next 魔法函數

Iterable:可迭代對象,繼承 Iterator,必須要實現 iter 魔法函數

比如:

from collections import Iterable,Iterator
a = [1,2,3]
print(isinstance(a,Iterator))
print(isinstance(a,Iterable))

返回結果

False
True

在 Pycharm 中使用 alt+b 進去 list 的源碼中可以看到,在 list 類中有 iter 魔法函數,也就是說只要實現了 iter 魔法函數,那么這個對象就是可迭代對象。

上面的例子中 a 是一個列表,也是一個可迭代對象,那么如何才能讓這個 a 變成迭代器呢?使用 iter() 即可。

from collections import Iterable,Iterator
a = [1,2,3]
a = iter(a)
print(isinstance(a,Iterator))
print(isinstance(a,Iterable))
print(next(a))
print('----')
for x in a:
    print(x)

返回結果

True
True
1
----
2
3

可以看到現在 a 是可迭代對象又是一個迭代器,說明列表 a 中有 iter 方法,該方法返回的是迭代器,這個時候使用 next 就可以獲取 a 的下一個值,但是要記住迭代器中的數值只能被獲取一次。

梳理迭代器 (Iterator) 與可迭代對象 (Iterable) 的區別:

可迭代對象:繼承迭代器對象,可以用 for 循環(說明實現了 iter 方法)

迭代器對象:可以用 next 獲取下一個值(說明實現了 next 方法),但是每個值只能獲取一次,單純的迭代器沒有實現 iter 魔法函數,所以不能使用 for 循環

只要可以用作 for 循環的都是可迭代對象

只要可以用 next() 函數的都是迭代器對象

列表,字典,字符串是可迭代對象但是不是迭代器對象,如果想變成迭代器對象可以使用 iter() 進行轉換

Python 的 for 循環本質上是使用 next() 進行不斷調用,for 循環的是可迭代對象,可迭代對象中有 iter 魔法函數,可迭代對象繼承迭代器對象,迭代器對象中有 next 魔法函數

一般由可迭代對象變迭代器對象

大家在學python的時候肯定會遇到很多難題,以及對于新技術的追求,這里推薦一下我們的Python學習扣qun:784758214,這里是python學習者聚集地!!同時,自己是一名高級python開發工程師,從基礎的python腳本到web開發、爬蟲、django、數據挖掘等,零基礎到項目實戰的資料都有整理。送給每一位python的小伙伴!每日分享一些學習的方法和需要注意的小細節

可迭代對象

可迭代對象每次使用 for 循環一個數組的時候,本質上會從類中嘗試調用 iter 魔法函數,如果類中有 iter 魔法函數的話,會優先調用iter魔法函數,當然這里切記 iter 方法必須要返回一個可以迭代的對象,不然就會報錯。

如果沒有定義 iter 魔法函數的話,會創建一個默認的迭代器,該迭代器調用 getitem 魔法函數,如果你沒有定義 iter 和 getitem 兩個魔法函數的話,該類型就不是可迭代對象,就會報錯。

比如:

class s:
    def __init__(self,x):
        self.x = x
    def __iter__(self):
        return iter(self.x)
        # 這里必須要返回一個可以迭代的對象
    # def __getitem__(self, item):
    #     return self.x[item]
# iter和getitem其中必須要實現一個
a = s('123')
# 這里的a就是可迭代對象
# 這里不能調用next(a)方法,因為沒有定義
for x in a:
    print(x)

這里把注釋符去掉返回結果也是一樣的,返回結果:

迭代器對象

一開始提起,iter 搭配 Iterable 做可迭代對象,next 搭配 Iterator 做迭代器。next() 接受一個迭代器對象,作用是獲取迭代器對象的下一個值,迭代器是用來做迭代的,只會在需要的時候產生數據。

和可迭代對象不同,可迭代對象一開始是把所有的列表放在一個變量中,然后用 getitem 方法不斷的返回數值,getitem 中的 item 就是索引值。

但是 next 方法并沒有索引值,所以需要自己維護一個索引值,方便獲取下一個變量的位置。

class s:
    def __init__(self,x):
        self.x = x
        # 獲取傳入的對象
        self.index = 0
        # 維護索引值
    def __next__(self):
        try:
            result = self.x[self.index]
            # 獲取傳入對象的值
        except IndexError:
            # 如果索引值錯誤
            raise StopIteration
        # 拋出停止迭代
        self.index += 1
        # 索引值+1,用來獲取傳入對象的下一個值
        return result
        # 返回傳入對象的值

a = s([1,2,3])
print(next(a))
print('----------')
for x in a:
# 類中并沒有iter或者getitem魔法函數,不能用for循環,會報錯
    print(x)

返回結果

Traceback (most recent call last):
1
----------
  File "C:/CODE/Python進階知識/迭代協議/迭代器.py", line 34, in <module>
    for x in a:
TypeError: 's' object is not iterable

上面一個就是完整的迭代器對象,他是根據自身的索引值來獲取傳入對象的下一個值,并不是像可迭代對象直接把傳入對象讀取到內存中,所以對于一些很大的文件讀取的時候,可以一行一行的讀取內容,而不是把文件的所有內容讀取到內存中。

生成器

生成器:函數中只要有 yield,這個函數就會變成生成器。每次運行到 yield 的時候,函數會暫停,并且保存當前的運行狀態,返回返回當前的數值,并在下一次執行 next 方法的時候,又從當前位置繼續往下走。

簡單用法

舉個例子:

def gen():
    yield 1
    # 返回一個對象,這個對象的值是1
def ret():
    return 1
    # 返回一個數字1
g = gen()
r = ret()
print(g,r)
print(next(g))

返回結果

<generator object gen at 0x000001487FDA2D58> 1
1

看完上述內容,你們掌握什么是Python迭代器和生成器的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

金湖县| 丹巴县| 镇安县| 淄博市| 武定县| 和硕县| 榆社县| 彰化市| 云浮市| 洪湖市| 林甸县| 尤溪县| 和平区| 修文县| 厦门市| 阿勒泰市| 电白县| 温州市| 东城区| 南宁市| 宁武县| 保靖县| 昌江| 即墨市| 防城港市| 凌海市| 湖州市| 百色市| 青神县| 太白县| 武定县| 丰顺县| 镇康县| 孝昌县| 曲阜市| 和政县| 日喀则市| 青河县| 梁河县| 平昌县| 中江县|