1. 程式人生 > >python的叠代器和生成器

python的叠代器和生成器

而是 ... 斐波那契數 聯系 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的叠代器和生成器