簡體   English   中英

python TypeError:'int'對象不可調用

[英]python TypeError: 'int' object is not callable

我有家庭作業,我們需要做類似迭代器的事情,功能很好,但技術人員告訴他使用(t = Make_iterator())這樣運行功能,我做錯了什么? 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())

我認為您想要一個閉包,這是在另一個函數的本地名稱空間內定義的函數,以便它可以訪問外部函數的變量:

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中運行,而無需煩人的解決方法。

我認為他想你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() ,它將返回迭代器的下一個值,在您的情況下t = Make_iterator(fn) 0, 2, 4, 6, 8, etc...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM