我有功课,我们需要做像iterator这样的事情,func工作得很好但是techer告诉他用这样的(t = Make_iterator())运行func,我做错了什么? TNX!
global x
x=-1
def Make_iterator(fn):
global x
x+=1
return fn(x)
fn=lambda y:y*2
t=Make_iterator(fn)
print(t())
答案 0 :(得分:4)
我认为你需要一个闭包,它是一个在anther函数的本地命名空间中定义的函数,因此它可以访问外部函数的变量:
def make_iterator(func):
x = -1
def helper():
nonlocal x
x += 1
return func(x)
return helper
nonlocal
语句允许内部函数修改外部函数中声明的变量(否则你会得到一个错误,或者你绑定自己的局部变量而不改变外部一)。它只是在Python 3中添加,所以如果您仍在使用Python 2,则需要将x
值包装在可变数据结构中,如列表。
同一想法的另一种方法是编写类而不是函数。如果类定义了__call__
方法,则类的实例可以是可调用的(就像函数一样):
class MyIterator(object):
def __init__(self, func):
self.index = -1
self.func = func
def __call__(self):
self.index += 1
return self.func(self.index)
如果您需要跟踪的状态比本示例中使用的简单整数索引更复杂(或者应该以更复杂的方式更改),这可能很有用。它也可以在Python 2中运行而不会产生烦人的解决方法。
答案 1 :(得分:2)
我认为他希望你的Make_iterator
函数返回一个充当迭代器的函数。因此,您可以将当前Make_iterator
函数的内容包装在内部函数f
中并返回:
def Make_iterator(fn):
def f():
global x
x+=1
return fn(x)
return f
现在,如果您执行t = Make_iterator(fn)
,则每次调用t()
时,它都会返回迭代器的下一个值,在您的情况下0, 2, 4, 6, 8, etc...