2012-03-22 12 views
1

のPython 2.6.2Pythonでcallable-iteratorの関数に引数を渡すにはどうすればいいですか?

>>> call_iter = iter(lambda x: x + 1, 100) 
>>> call_iter.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: <lambda>() takes exactly 1 argument (0 given) 

私はlambda x:x + 1に引数を渡したいです。

更新:上記の例はわかりにくいと思います。

私はPythonでmyiterのような組み込みfuncがあるかどうかを疑問に思う:

class myiter: 
    def __init__(self, callable, initial, sentinel): 
     self.value = initial 
     self.callable = callable 
     self.sentinel = sentinel 

    def __iter__(self): 
     return self 

    def next(self): 
     if self.value == self.sentinel: 
      raise StopIteration 
     else: 
      # calculate next value from prev value 
      self.value = self.callable(self.value) 
      return self.value 

if __name__ == '__main__': 
    call_iter = myiter(lambda x:x + 1, 0, 100) 
    for i in call_iter: 
     print i 
+2

これは理解しにくいです。 'call_iter'を使って生成する数字のシーケンスは何ですか? –

+0

これは 'iter'の呼び出し可能な形式を使用する必要がありますか?それはあなたが渡したい開始番号ですか? – agf

+0

おそらくカスタムイテレータですか? http://stackoverflow.com/questions/19151/build-a-basic-python-iterator –

答えて

1

私はあなたがここで達成しようとしているのかわからないんだけど、

>>> call_iter = iter(lambda:lambda x: x + 1, 100) 
>>> next(call_iter)(1) 
2 
+0

しかし、呼び出し可能関数が関数を返すので、センチネル値100はどのような目的に役立ちますか? – agf

+0

@agf、私はまだそれを推測しようとしています:) –

+0

私は彼が 'call_iter = iter(lambda x = itertools.count()。next:x()+ 1,100)'のようなものだと思っていました。 – agf

-1

私は何をしたいことはあると思う:

call_iter = iter(map(lambda x: x + 1, range(100))) 
>>> call_iter.next() 
1 
>>> call_iter.next() 
2 
>>> call_iter.next() 
3 
>>> 

あなたがマップする必要がラムダ関数に引数を渡しますレンジ(100)または[2,4,5]のような反復可能にラムダ

+4

あなたは 'imap'を使うべきだと思います。そうでなければ、イテレータを使う意味がほとんどありません。 –

1

使用しようとしているiterの形式は、0引数の関数しか使用しません。以下は説明のためのものです。実際にはこれをしないでください。一般に

>>> x = 0 
>>> def counter(): 
...  global x 
...  x += 1 
...  return x 
... 
>>> list(iter(counter, 10)) 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 

iterのこの形態は非常に有用ではありません。呼び出しの間に状態を維持する呼び出し可能な呼び出しが必要です。たとえば、docsで提案されているように、ファイルオブジェクトのreadlineメソッドを渡すことができます。しかし、一般的に、これを行うより良い方法があります。だから、例えば、あなたがこのようなクラスを作成したと言う:

>>> class Incrementer(object): 
...  def __init__(self): 
...   self.state = 0 
...  def __call__(self): 
...   rval = self.state 
...   self.state += 1 
...   return rval 
... 
>>> list(iter(Incrementer(), 10)) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

それは美しいとすべてですが、あなたが反復可能なことになってクラスを作成する必要がある場合、あなたは同様にそれを与えることによって、その本当のイテレータになるかもしれませんnext方法および__iter__方法。逆に、クラスを作成していない場合は、yield

関連する問題