python TypeError:' int'对象不可调用

时间:2013-11-22 00:47:53

标签: python

我有功课,我们需要做像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())

2 个答案:

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