面向对象编程之生成器与迭代器
生活随笔
收集整理的這篇文章主要介紹了
面向对象编程之生成器与迭代器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
生成器
列表推導式
[i * i for i in range(8)] > [0, 1, 4, 9, 16, 25, 36, 49]生成器表達式
(i * i for i in range(8)) > <generator object <genexpr> at 0x0000025C8F9019A8>查看生成器對應的所有元素,有兩種方式:
1.多次調用內置函數(shù)next(),每次調用都返回生成器的下一個元素,直到拋出異常StopIteration時表示沒有更多元素了。
2.使用for-in語句對生成器進行迭代,這樣就不需要關心異常StopIteration了。
生成器中保存的并不是其對應的所有元素,而是如何推算出所有元素的算法。將生成器用于for-in語句時,元素是在循環(huán)的過程中不斷被推送出來的。將生成器作為內置函數(shù)next()的實參時,返回的下一個元素也是在調用函數(shù)時被推送出來的。因此,生成器是惰性推算的,也就是說,只有當用到生成器中的某個元素時,才會臨時進行推算,而并不會提前推算出來。
如果需要創(chuàng)建一個元素個數(shù)較大的容器,就可以考慮使用生成器,從而節(jié)約大量的存儲空間。
生成器函數(shù) yield
生成器函數(shù)中通過關鍵字yield返回推算出的元素。生成器函數(shù)與普通函數(shù)的區(qū)別在于:當調用 內置函數(shù)next()或使用for-in語句進行迭代時,執(zhí)行完yield語句就會將生成器函數(shù)掛起,下次會從掛起的地方繼續(xù)執(zhí)行。
def fib(n):i = 0a,b = 1,1while i < n:print(a,end = ',')a,b = b,a+bi+=1 fib(6) > 1,1,2,3,5,8, def fib(n):i = 0a,b = 1,1while i < n:yield aa,b = b,a+bi+=1 fib(6) > <generator object fib at 0x0000021D6F86FB10> gf = fib(6) print(next(gf)) print(next(gf)) print(next(gf)) print(next(gf)) print(next(gf)) print(next(gf)) print(next(gf)) > 1 1 2 3 5 8 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-7-2e6b10837911> in <module>()6 print(next(gf))7 print(next(gf)) ----> 8 print(next(gf))StopIteration: gf = fib(6) for item in gf:print(item) > 1 1 2 3 5 8遇到return生成器終止
只要有yield就是生成器
def test():n = 0while n < 10:yield nn+=2return '返回值作為異常的提示語' a = test() print(a) > <generator object test at 0x000001A825EE9390> next(a) > 0 next(a) > --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-11-3f6e2eea332d> in <module>() ----> 1 next(a)StopIteration: 返回值作為異常的提示語迭代器
可以用于for-in語句的對象被稱為可迭代(iterable)對象
例如:range,列表,元組,字符串,字典,集合,生成器都是可迭代對象
可以調用內置函數(shù)isinstance()判斷一個對象是否是可迭代對象。標準庫模塊collections中的類Iterable用于表示可迭代對象
from collections import Iterable print(isinstance([1,2,3],Iterable)) > True print(isinstance('abc',Iterable)) > True print(isinstance((i * i for i in range(1,7)),Iterable)) > True如果一個可迭代對象可以作為內置函數(shù)next()的實參從而支持惰性推算,那么該對象被稱為迭代器(Iterator)對象。
對于range,列表,元組,字符串,字典和合集等可迭代對象,都不可以作為內置函數(shù)next()的實參,而生成器可以。所以,生成器是迭代器的一種。
可以調用內置函數(shù)isinstance()判斷一個對象是否是迭代器對象。標準庫模塊collections中的類Iterator用于表示迭代器對象。
L = [1,2,3] next(L) > --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-16-613237b05554> in <module>()1 L = [1,2,3] ----> 2 next(L)TypeError: 'list' object is not an iterator s = 'abc' next(s) > --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-000efaea8dad> in <module>()1 s = 'abc' ----> 2 next(s)TypeError: 'str' object is not an iterator from collections import Iterator print(isinstance(L, Iterator)) print(isinstance(s, Iterator)) > False False print(isinstance((i * i for i in range(1,7)),Iterator)) > True可以調用內置函數(shù)iter()把不支持惰性推算的可迭代對象轉換為迭代器對象。
iter_L = iter(L) iter_s = iter(s) print(isinstance(iter_L, Iterator)) print(isinstance(iter_s, Iterator)) > True True print(next(iter_L)) print(next(iter_L)) print(next(iter_L)) print(next(iter_L)) > 1 2 3 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-18-6087a98b9770> in <module>()2 print(next(iter_L))3 print(next(iter_L)) ----> 4 print(next(iter_L))StopIteration: print(next(iter_s)) print(next(iter_s)) print(next(iter_s)) print(next(iter_s)) > a b c --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-19-4df9ec750908> in <module>()2 print(next(iter_s))3 print(next(iter_s)) ----> 4 print(next(iter_s))StopIteration:如果一個對象同時實現(xiàn)了特殊方法__iter__()和__next__(),那么該對象也被稱為迭代器對象。如果將該對象用于for-in語句,for-in語句首先會調用特殊方法__iter__()返回一個可迭代對象,然后不斷調用該可迭代對象的特殊方法__next__()返回下一次迭代的值,直到遇到StopIteration時退出循環(huán)。
class MyIterator(object):def __init__(self):self.data = 0def __iter__(self):return selfdef __next__(self):if self.data > 5:raise StopIteration()else:self.data += 1return self.data for item in MyIterator():print(item) > 1 2 3 4 5 6 class Fib(object):def __init__(self):self.a,self.b = 0,1def __iter__(self):return selfdef __next__(self):self.a,self.b = self.b,self.a + self.bif self.a > 50:raise StopIteration()return self.a for item in Fib():print(item)> 1 1 2 3 5 8 13 21 34總結
以上是生活随笔為你收集整理的面向对象编程之生成器与迭代器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 房贷审批没有通过的原因 这几点你有没有
- 下一篇: 错误与异常