1. 程式人生 > >python迭代器和生成器區別

python迭代器和生成器區別

  1. 迭代器和生成器區別:迭代器通常是先定義一個迭代器類,再通過例項化建立迭代器;而生成器則是先定義一個包含yield的函式,然後再通過呼叫該函式來建立生成器。
  2. 如果要實現迭代器,只需要實現2個方法即可:

    __iter__(self):該方法返回一個迭代器,迭代器必須包含一個__next__()方法;

    __reversed__(self):該方法主要為內建的reversed()反轉函式提供支援(當不需要反轉只定義一個方法即可);

 如:實現一個斐波拉契數列的迭代器 f(n+2) = f(n+1) + f(n)

class Fibs:
def __init__(self, n):
self.first = 0
self.second = 1
self.__len = n

# 定義迭代器所需要的__next__方法
def __next__(self):
if self.__len == 0:
raise StopIteration
self.first, self.second = self.second, self.first + self.second
self.__len -= 1
return self.first

# 定義__iter__方法,該方法返回迭代器
def __iter__(self):
return self

 #例項化迭代器

 

print(20 * '*' + '迭代器' + 20 * '*')
fibs = Fibs(10)
print(next(fibs))
print(next(fibs))
print(next(fibs))

print([e for e in fibs])

列印如下:

 

 

 3. 建立生成器兩個步驟:定義一個包含yield語句的函式,呼叫1定義的函式來得到生成器;

print(20 * '*' + '生成器' + 20 * '*')
def demo_generator(val, step):
'''
建立差值遞增的數列
:param val:
:param step:
:return:
'''
print('demo_generator start...')
cur = 0
for i in range(val):
cur += i * step
yield cur

#呼叫函式
g = demo_generator(10, 2)
print(next(g))
print(next(g))
print(next(g))
print([e for e in g])

 

列印如下:

 

 

 



 

&n