我正在撰寫一個回傳自身修改的迭代器物件,并且我希望原始物件成為迭代程序的一部分,因此需要在修改之前回傳它。
...但:
- 創建要回傳的物件的深層副本非常耗時。
- 該物件有很多屬性,因此定義輔助變數似乎不是一個優雅的解決方案。
yieldinside__next__將不起作用,因為它在每次迭代中回傳不同的型別(生成器)。- 我可以使用
yieldinside__iter__來獲得一個迭代器,但是我不能用它__next__來獲得按需迭代(我的物件是一個圖靈機,所以磁帶的受控逐步列印會很好)。
一個有效但低效的代碼示例:
from copy import deepcopy
class MyObject():
def __init__(self, n):
self.n = n
def __str__(self):
return str(self.n)
def __iter__(self):
return self
def __next__(self):
if self.n >= 10:
raise StopIteration
self_copy = deepcopy(self)
self.n = 1
return self_copy
for x in MyObject(n=7):
print(x)
輸出:
7
8
9
我可能在這里遺漏了一些東西,但我無法弄清楚。
uj5u.com熱心網友回復:
生成器似乎是個好主意。用這個替換你的__iter__和__next__:
def __iter__(self):
while not self.n >= 10:
yield self
self.n = 1
(在這種特殊情況下,我們當然可以這樣做while self.n < 10:。)
或者,要使您的物件本身成為它自己的迭代器,正如我們在下面的評論中所討論的,您可以使用一個標志:
class MyObject():
def __init__(self, n):
self.n = n
self.iterated_original = False
def __str__(self):
return str(self.n)
def __iter__(self):
return self
def __next__(self):
if not self.iterated_original:
self.iterated_original = True
else:
self.n = 1
if self.n >= 10:
raise StopIteration
return self
for x in MyObject(n=7):
print(x)
或者由于iterated_original理想情況下設定為True 在原始版本被迭代之后,所以我可以做到這一點:
def __next__(self):
if self.iterated_original:
self.n = 1
if self.n >= 10:
raise StopIteration
try:
return self
finally:
self.iterated_original = True
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/474880.html
下一篇:在PHP函式中回傳if陳述句的值
