2013-11-22 54 views
0

我有家庭作業,我們需要做類似迭代器的事情,func的工作很好,但techer告訴他像這樣運行func(t = Make_iterator()),我做錯了? TNX!python TypeError:'int'對象不可調用

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

我認爲他想你Make_iterator函數返回一個功能充當迭代器。所以,你可以一個內部函數f內包你當前Make_iterator功能的內容,並返回:

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

+0

damm u fast tnx alot !!! – user3019872

4

我想你想的關閉,這是花葯功能的本地命名空間中定義的函數,以便它可以訪問外部函數的變量:

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

+0

damm你快tnx很多!!! – user3019872

+0

這個答案使用最好的Python實踐,應該是被接受的答案。 – mVChr