python的叠代器和生成器
阿新 • • 發佈:2018-09-22
而是 ... 斐波那契數 聯系 python2.7 如果 s函數 span fibonacci
本文將簡要介紹python中叠代器和生成器的區別與聯系,以下內容基於python2.7環境
1. 可叠代對象與叠代器
1.1 可叠代對象
可叠代對象需要滿足的條件:實現了 __iter__ 方法,該方法返回一個叠代器對象,可以使用for...in...循環進行取值。
例如:list, tuple, dict, str, set 等等。
1.2 叠代器
叠代器條件:實現了 __iter__ 和 next 方法。
如果調用了next方法,容器沒有值可以返回,則會拋出一個StopIteration異常。
next方法的使用有兩種方式:i.next() 和 next(i)。
判斷方法
from collections import Iterable,Iterator print isinstance(["S","u","g","a","r"], Iterable) print isinstance(["S","u","g","a","r"], Iterator) print isinstance(iter(["S","u","g","a","r"]), Iterator) # 對於python內置的可叠代對象,可以使用函數iter()獲取相應的叠代器 運行結果: True False True
代碼舉例1
class Test(): def__init__(self,data=1): self.data = data def __iter__(self): return self def next(self): if self.data > 5: raise StopIteration else: self.data+=1 return self.data t = Test(3) from collections import Iterator print isinstance(t, Iterator)for i in t: print i 運行結果: True 4 5 6
代碼舉例2(斐波那契數列)
class Fibonacci_sequence(object): def __init__(self): self.prev = 0 self.cur = 1 def __iter__(self): return self def next(self): value = self.cur self.prev,self.cur = self.cur,self.prev+self.cur return value fib = Fibonacci_sequence() print fib.next(),next(fib),fib.next(),next(fib),fib.next(),fib.next() from collections import Iterator print isinstance(fib, Iterator) 運行結果: 1 1 2 3 5 8 True
補充
#itertools函數返回的都是叠代器對象 from itertools import count,cycle from collections import Iterator counter = count(start=1, step=3) print isinstance(counter,Iterator) print next(counter) print counter.next() print next(counter) print counter.next() 運行結果: True 1 4 7 10 colors = cycle(["red","green","blue"]) print colors.next(),colors.next(),colors.next(),colors.next(),colors.next(),colors.next() 運行結果: red green blue red green blue
小結
叠代器一定是可叠代對象,可叠代對象不一定是叠代器!
叠代器不會一次性把所有元素加載到內存,而是需要的時候才生成返回結果!
iter()和__iter__不同,iter()是直接調用了對象的__iter__方法,並且把這個方法的返回值作為自己的返回值。
在for..in...循環中,比如 for i in list,會先調用iter(list)得到可叠代對象list的叠代器,每次循環再調用叠代器的next()方法獲取值。
2. 生成器
生成器是一種特殊的叠代器(更加優雅),它不需要像類一樣寫__iter__和next方法,只需要一個yield關鍵字即可,生成器一定是叠代器
2.1 生成器函數
代碼舉例1
def func(): a = 0 while True: yield a a += 1 f = func() # f就是一個生成器,通過調用f的next方法取值 print f.next(),next(f),next(f),next(f),next(f) 運行結果: 0 1 2 3 4
代碼舉例2(斐波那契數列)
def fibonacci_sequence(): prev,cur = 0,1 while True: yield cur prev,cur = cur,prev+cur fib = fibonacci_sequence() # fib是一個生成器,通過調用next方法取值 print fib.next(),fib.next(),fib.next(),fib.next(),fib.next(),fib.next(),fib.next() from collections import Iterable,Iterator print isinstance(fib, Iterable) print isinstance(fib, Iterator) 運行結果: 1 1 2 3 5 8 13 True True
2.2 生成器表達式
代碼舉例
generator = (i for i in range(10)) # 註意使用的是小括號而不是中括號 from collections import Iterable,Iterator print isinstance(generator, Iterable) print isinstance(generator, Iterator) 運行結果: True True
python的叠代器和生成器