我有家庭作業,我們需要做類似迭代器的事情,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())
我有家庭作業,我們需要做類似迭代器的事情,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())
我認爲他想你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...
我想你想的關閉,這是花葯功能的本地命名空間中定義的函數,以便它可以訪問外部函數的變量:
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中運行,而不需要煩人的解決方法。
damm你快tnx很多!!! – user3019872
這個答案使用最好的Python實踐,應該是被接受的答案。 – mVChr
damm u fast tnx alot !!! – user3019872