如何在python中将参数传递给callable-iterator函数?

时间:2012-03-22 02:52:07

标签: python

Python 2.6.2

>>> 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的内置函数:

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

3 个答案:

答案 0 :(得分:1)

我不确定你要在这里完成什么,但是

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

答案 1 :(得分: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

答案 2 :(得分:-1)

我认为你想要的是:

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

将参数传递给lambda函数,您需要将lambda映射到可迭代的范围(100)或[2,4,5]