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
答案 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]