順番が逆になったが、昨日使ったジェネレータの説明を。
def count(n):
step = 1
while True:
n += step
yield nfor 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.nfor 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 = sc = 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