ジェネレータ(1)

順番が逆になったが、昨日使ったジェネレータの説明を。


def count(n):
step = 1
while True:
n += step
yield n

for i in count(0):
if i >= 10:
break
print i,


1 2 3 4 5 6 7 8 9

関数の中にyieldというキーワードがあるとジェネレータになるらしい。yieldがあるとそこで値を返し、次に呼ばれると値を返した次から実行される。
これをクラスで表現すると次のようになる。


class count:
def __init__(self, n):
self.n = n
self.step = 1

def __iter__(self):
return self

def next(self):
self.n += self.step
return self.n

for i in count(0):
if i >= 10:
break
print i,

すなわち、__init__と__iter__とnextを実装すればよい。
クラスにするともっと複雑なことができる。例えば、


class count:
def __init__(self, n):
self.n = n
self.step = 1

def __iter__(self):
return self

def next(self):
self.n += self.step
return self.n

def set_step(self, s):
self.step = s

c = count(0)
for i in c:
if i >= 20:
break
if i == 10:
c.set_step(2)
print i,

こうすると、途中から2刻みに出力することになる。


1 2 3 4 5 6 7 8 9 10 12 14 16 18