def get_map_iterator(slist,gfunc=None):
index = 0
def Next():
nonlocal index
x = slist[index]
index = index + 1
return x
def has_more():
if slist[index] != None :
return True
else:
return False
dispatch = {
'Next': lambda: gfunc(Next()),
'has_more': has_more
}
return dispatch
it = get_map_iterator((1,3,6))
for i in range(i,6):
it['Next']()
it = get_map_iterator((1,3,6),lambda x:1/x)
while it['has_more']():
it['next']()
P.S 这段代码的结果应该是:
1
3
6
no more items
no more items
1.0
0.33333
0.166666
对gfunc的更改将如何影响这一点,我的意思是如果我确实得到一个函数或者我没有得到一个函数,我将需要更改才能使其工作
答案 0 :(得分:1)
get_map_iterator()
返回一个函数对象(dispatch
)。您正试图将该对象视为字典。
您希望调用代替:
while it('has_more'):
it('Next')
您的dispatch()
函数本身不会返回另一个函数对象,因此您不会调用it()
返回的任何内容。
您的has_more
路线失败了:
>>> it('has_more')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 17, in dispatch
File "<stdin>", line 9, in has_more
TypeError: next expected at least 1 arguments, got 0
大概是因为您打算使用您定义的Next()
函数,而不是内置的next()
function。
但是,即使修复也无法获得输出,因为slist[0] != slist[1]
。
听起来好像是在尝试实际返回字典:
dispatch = {
'Next': lambda: gfunc(Next()),
'has_more': has_more
}
return dispatch
你将使用的返回值,就像你最初使用的那样,通过一个键查找可调用对象,然后调用它。