我覺得我一定遺漏了一些明顯的東西,但我似乎找不到一種簡潔的方法來創建一個可呼叫物件,該可呼叫物件按每次呼叫的順序回傳串列的元素。例如
In [1]: class CallableList:
...: def __init__(self, list_):
...: self.list = list_
...: self.pos = -1
...: def __call__(self):
...: self.pos = 1
...: return self.list[self.pos]
...:
In [2]: x = CallableList([5, 7, 2])
In [3]: x()
Out[3]: 5
In [4]: x()
Out[4]: 7
In [5]: x()
Out[5]: 2
...但沒有課程。
生成器(這是我首先想到的地方)是不可呼叫的,所以這似乎不起作用,除非我錯過了一些東西。
uj5u.com熱心網友回復:
您可以使用iter()
來獲取串列的迭代器。然后您可以使用next()
來獲取連續的元素。例如:
>>> x = [1, 2, 3]
>>> r = iter(x)
>>> next(r)
1
>>> next(r)
2
>>> next(r)
3
>>>
這幾乎是您所要求的,但不完全是,因為您需要將r
其作為引數提供給next
.
要使可呼叫,您可以將其包裝在lambda
:
>>> x = [1, 2, 3]
>>> r = iter(x)
>>> c = lambda: next(r)
>>> c()
1
>>> c()
2
>>> c()
3
>>>
uj5u.com熱心網友回復:
這是使用具有函式屬性的閉包的解決方案:
def callable_list(param):
def f():
if not hasattr(f, 'iter'):
f.iter = iter(param)
return next(f.iter)
return f
x = callable_list([5, 7, 2])
print(x())
print(x())
print(x())
結果:
5
7
2
uj5u.com熱心網友回復:
對@TomKarzes anwer 稍作修改,將iter()
/包裝next()
到一個函式中:
def CallableList(lst):
i = iter(lst)
return lambda: next(i)
x = CallableList([5, 7, 2])
print(x())
print(x())
print(x())
印刷:
5
7
2
或單線:
CallableList = lambda lst: lambda _i=iter(lst): next(_i)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505413.html