帶着問題去理解:
什么是生成器
生成器與迭代器的區別
為什么使用生成器
如何使用生成器
yeild 與 return的區別
迭代器
Python中一個實現_iter_方法和_next_方法的類對象,就是迭代器。
是一個能記住遍歷位置的對象,遍歷時只能往前,不能后退。迭代器常用方法有 iter() 和 next().
把一個類作為迭代器使用需要在類中實現兩個函數:__iter__() 和 __next__().
生成器
Python 中使用了 yield 的函數稱為生成器,生成器函數返回一個迭代器。
在調用生成器運行的過程中,每次遇到 yield 時函數會暫停並保存當前所有的運行信息,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續運行。
生成器函數自動實現了迭代器協議,能更方便地實現。
生成器函數 和 生成器表達式都可以提供生成器,只需要簡單地將列表推導的中括號替換成圓括號即可
二者區別
1.迭代器是訪問容器的一種方式,也就是說容器已經出現。我們是從已有元素拓印出一份副本,只為我們此次迭代使用。而生成器則是,而生成器則是自己生成元素的。
2.在用法上生成器只需要簡單函數寫法,配合yield就能實現。而迭代器真正開發中很難使用到。我們可以把生成器看做,python給我們提供的特殊接口實現的迭代器。
3.生成器是只能遍歷一次的。
為什么使用生成器
Python使用生成器對延遲操作提供了支持。在需要的時候才產生結果,而不是立即產生結果。
1、節省資源消耗,和聲明序列不同的是生成器在不使用的時候幾乎不占內存,也沒有聲明計算過程!
2、使用的時候,生成器是隨用隨生成,用完即刻釋放,非常高效!
3、可在單線程下實現並發運算處理效果。
yeild 與 return的區別
相同點:都是返回函數執行的結果
不同點:return 在返回結果后結束函數的運行,而yield 則是讓函數變成一個生成器,生成器每次產生一個值(yield語句),函數被凍結,被喚醒后再產生一個值