Python中生成器能做到迭代器能做的所有事,而且因為自動創建了__iter__()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析,同時節省內存。除了創建和保持程序狀態的自動生成,當發生器終結時,還會自動跑出StopIterration異常。
列表、元組、字典、字符串都是可迭代對象。
數字、布爾值都是不可迭代的。
下面分別來說說這兩者的具體區別:
1、迭代器
迭代器對象要求支持迭代器協議的對象。在Python中,支持迭代器協議就是實現對象的__iter__()和next()方法。其中__iter__()方法返回迭代器對象本身;next()方法返回容器的下一個元素,在結尾時引發StopIteration異常。
下面用個簡單的列表來說迭代器的用法:
看完上面代碼,我想很多人納悶列表怎么可以有一個迭代器。由于面試題篇幅有限,大家如果想了解可迭代對象怎么可以獲取迭代器呢?
2、生成器
生成器(generator)就是一個函數,它提供了一種實現迭代器協議的便捷方式。生成器與普通函數的區別在于它包含yield表達式,并且不需要定義__iter__()和__next__()。
生成器是一種惰性的序列,如果我們需要創建一個0~1000000000的序列,這樣大的序列創建出來會占用比較多的內存,生成器就是為了解決這樣的問題。
下面用個簡單的例子來說生成器的用法:
如果對于有不認同的意見,大家可以在關注我指出和補充,歡迎留言。