python类型错误:';int';对象不可调用

python类型错误:';int';对象不可调用,python,Python,我有作业,我们需要做一些类似迭代器的事情,func工作得很好,但是技术人员告诉他用(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()) 我想他希望你的Make_iterator函数返回一个充当迭代器的函数。因此,您

我有作业,我们需要做一些类似迭代器的事情,func工作得很好,但是技术人员告诉他用(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())

我想他希望你的
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等等。
我想他希望您的
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等等。
我想您需要一个闭包,它是在另一个函数的本地命名空间中定义的函数,以便访问外部函数的变量:

def make_iterator(func):
    x = -1
    def helper():
        nonlocal x
        x += 1
        return func(x)
    return helper
非局部
语句允许内部函数修改在外部函数中声明的变量(否则会出现错误,或者在不更改外部变量的情况下绑定自己的局部变量)。它只是在Python3中添加的,因此如果您仍然使用Python2,则需要将
x
值包装在可变数据结构中,如列表

实现同样想法的另一种方法是编写类,而不是函数。如果类定义了
\uuu call\uu
方法,则类的实例可以调用(就像函数一样):

class MyIterator(object):
    def __init__(self, func):
        self.index = -1
        self.func = func

    def __call__(self):
        self.index += 1
        return self.func(self.index)

如果您需要跟踪的状态比本例中使用的简单整数索引更复杂(或者应该以更复杂的方式更改),那么这将非常有用。它在Python2中也可以工作,没有烦人的解决方法。

我想您需要一个闭包,它是在另一个函数的本地名称空间中定义的函数,以便它可以访问外部函数的变量:

def make_iterator(func):
    x = -1
    def helper():
        nonlocal x
        x += 1
        return func(x)
    return helper
非局部
语句允许内部函数修改在外部函数中声明的变量(否则会出现错误,或者在不更改外部变量的情况下绑定自己的局部变量)。它只是在Python3中添加的,因此如果您仍然使用Python2,则需要将
x
值包装在可变数据结构中,如列表

实现同样想法的另一种方法是编写类,而不是函数。如果类定义了
\uuu call\uu
方法,则类的实例可以调用(就像函数一样):

class MyIterator(object):
    def __init__(self, func):
        self.index = -1
        self.func = func

    def __call__(self):
        self.index += 1
        return self.func(self.index)

如果您需要跟踪的状态比本例中使用的简单整数索引更复杂(或者应该以更复杂的方式更改),那么这将非常有用。它在Python2中也可以工作,没有烦人的变通方法。

此答案使用最佳Python实践,应该是公认的答案。此答案使用最佳Python实践,应该是公认的答案。