Python 如何重置产量并停止迭代
我面临一些关于发电机的问题。我有1000个元素的列表。我想一项一项地阅读,并做一些操作。该操作类似于与某个特定值进行比较。如果我能从列表中找到那个值,我想停止迭代并再次重置收益率 我正在寻找如何在生成器中重置Python 如何重置产量并停止迭代,python,generator,Python,Generator,我面临一些关于发电机的问题。我有1000个元素的列表。我想一项一项地阅读,并做一些操作。该操作类似于与某个特定值进行比较。如果我能从列表中找到那个值,我想停止迭代并再次重置收益率 我正在寻找如何在生成器中重置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我还必须在运行时创建100个对象FN\u SOVLS class FN_SOV1S: def __init__(self,elementl
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我还必须在运行时创建100个对象FN\u SOVLS
class FN_SOV1S:
def __init__(self,elementlist,idxNo):
self._elementlist = elementlist
self._idxNo =idxNo
setup()
process()
def setup(self):
try:
self.df = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='Valve1S')
for tag,col in self.readcmd():
if col==4:
self.cmd = tag
if col == 5:
self.openFB = tag
if col == 6:
self.clsFB = tag
if col == 7:
self.delaytime = tag
except Exception as e:
log_exception(e)
def process(self):
for tagname,tagvalue in self.searchValueBytag():
if tagname == self.cmd:
if tagvalue == 1:
sleep(self.delaytime)
gen.writegeneral.writenodevalue(self.openFB,1)
gen.writegeneral.writenodevalue(self.clsFB,0)
else:
gen.writegeneral.writenodevalue(self.openFB, 0)
gen.writegeneral.writenodevalue(self.clsFB, 1)
def searchValueBytag(self):
n = 0
while n < len(self._elementlist):
tagname, tagvalue = self._elementlist[n]
yield tagname, tagvalue
n =+ 1
不能“重置”正在运行的生成器
您可以做的是将从使用生成器的for
-循环中断开
稍后,您可以再次调用searchValueBytag
重新创建生成器。我不完全理解您的问题,但希望这能有所帮助。这将使用一个标志,该标志将继续重新启动生成器,直到不再找到self.cmd值
显然,这与您的代码不同,需要更多才能使其完美工作,但您可以轻松使用此标志重置生成器
def generator():
# arbitrary length
length = 100
n = 0
while n < length:
yield n
n += 1
# create a complete flag that is only true when the end of the iteration is reached
complete = False
# keep trying until complete is true
while not complete:
# restarts the generator by making a new one
g = generator()
# keeps going until 'break'
while True:
# try/catch because next returns error when the end of the generator is reached
# when the end is reached we know that to turn complete to true
try:
# get the next val in the iterator
value = next(g)
# if value is the reset flag, then break out of while loop and restart generator
if value == RESET_FLAG:
break
except:
# StopIteration exeption received, job finished
complete = True
break
def generator():
length = 100
n = 0
while n < length:
yield n
n += 1
def生成器():
#任意长度
长度=100
n=0
当n<长度时:
产量
n+=1
#创建一个只有在迭代结束时才为真的完整标志
完成=错误
#继续尝试直到完成是真的
虽然尚未完成:
#通过创建新的发电机重新启动发电机
g=发电机()
#一直持续到“休息”
尽管如此:
#try/catch,因为到达生成器末尾时next返回错误
#当我们到达终点时,我们知道要把完成变成现实
尝试:
#获取迭代器中的下一个val
值=下一个(g)
#如果值是重置标志,则中断while循环并重新启动发电机
如果值==重置标志:
打破
除:
#已收到StopIteration验证,作业已完成
完成=正确
打破
def生成器():
长度=100
n=0
当n<长度时:
产量
n+=1
okye的可能重复,这是可以理解的,但问题是假设我的elementlist包含1000个元素。如果我发现这个标记名==cmd,那么我不需要任何迭代,我想重置产量。
def generator():
# arbitrary length
length = 100
n = 0
while n < length:
yield n
n += 1
# create a complete flag that is only true when the end of the iteration is reached
complete = False
# keep trying until complete is true
while not complete:
# restarts the generator by making a new one
g = generator()
# keeps going until 'break'
while True:
# try/catch because next returns error when the end of the generator is reached
# when the end is reached we know that to turn complete to true
try:
# get the next val in the iterator
value = next(g)
# if value is the reset flag, then break out of while loop and restart generator
if value == RESET_FLAG:
break
except:
# StopIteration exeption received, job finished
complete = True
break
def generator():
length = 100
n = 0
while n < length:
yield n
n += 1