python 迭代器和生成器

本文屬於個人對知識總結,若有不當或錯誤,還望各位看官糾正

  • 說到迭代器和生成器,就必須知道:
    • 可迭代對象;
    • 迭代器;
    • 生成器.

重要的寫在前面

迭代器和生成器的區別和關係
生成器是迭代器的一種
迭代器是惰性執行的,調用一次執行一次
1.迭代器是對已知數據進行操作next()
2.生成器是通過算法計算,返回數據,一般生成器函數都會有 yield 這個關鍵字

什麼是可迭代對象呢?

  • 我們已經知道可以對list、tuple、str等類型的數據使⽤for…in…的循環語法從其中依次拿到數據進⾏使⽤,這樣的過程也被稱爲遍歷,也叫迭代。
  • 總結 : 可遍歷 (for ... in ... :)的對象,就是一個可迭代對象.

迭代器

  • 判斷是否是迭代器

    • python中的 isinstance() 可以判斷你傳入的對象是否是某一特定的類型,是返回true,否返回false.
      • 用法:
      from collections import Iterable,Iterator
      l = [1,2,3,4,56,6,6,]
      print(isinstance(l,Iterable))  # true
      print(isinstance(l,Iterator))  # false
      lo = iter(l)  #獲得  l  的迭代器對象
      print(isinstance(lo,Iterable))  # true
      print(isinstance(lo,Iterator))  # true
      
  • iter()函數,Python中的 iter( object[, sentinel]) 函數可用來返回一個迭代器對象,iter( )函數只傳入一個參數時,參數必須爲可迭代對象;當使用第二個參數sentinel(哨兵)時,第一個參數必須是一個可調用對象.

    • 迭代器簡單使用
      l = [1,2,3,4,56,6,6,]
      lo = iter(l)
      for i in range(len(l):
      	print(next(lo))
      	
      # 在lo元素調用完之後,在使用next()
      print(next(lo))# 會報 StopIteration異常
      
  • 把一個類作爲一個迭代器使用需要在類中實現兩個方法 iter() 與 next() 。
    iter() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了 next() 方法並* 通過 StopIteration 異常標識迭代的完成。

  • next() 方法(Python 2 裏是 next())會返回下一個迭代器對象。

  • 例子請看 https://www.runoob.com/python3/python3-iterator-generator.html

生成器

  • 如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器(Generator)

    def gen():
        for i in range(10):
            n = i + 1
            yield n
    
    g = gen()
    print(g)
    print(next(g))
    for n in g:
        print(n)
    

輸出結果
輸出結果
解釋: 語句 print(g) 輸出的不是數據,而是一個生成器對象,需要使用next(),調用 gen() 函數, 不斷的計算 n 的值,並通過 yield 返回 n 值.
yeild 當程序執行到 yield 這裏時,系統一般會保存程序當前的執行狀態,當下一次調用(此函數的next(n)),程序就會接着上一次保存的狀態,繼續執行.

總結:
迭代器和生成器的區別和關係
生成器是迭代器的一種
迭代器是惰性執行的,調用一次執行一次
1.迭代器是對已知數據進行操作next()
2.生成器是通過算法計算,返回數據,一般生成器函數都會有 yield 這個關鍵字

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章