Python 如何重置产量并停止迭代

Python 如何重置产量并停止迭代,python,generator,Python,Generator,我面临一些关于发电机的问题。我有1000个元素的列表。我想一项一项地阅读,并做一些操作。该操作类似于与某个特定值进行比较。如果我能从列表中找到那个值,我想停止迭代并再次重置收益率 我正在寻找如何在生成器中重置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我还必须在运行时创建100个对象FN\u SOVLS class FN_SOV1S: def __init__(self,elementl

我面临一些关于发电机的问题。我有1000个元素的列表。我想一项一项地阅读,并做一些操作。该操作类似于与某个特定值进行比较。如果我能从列表中找到那个值,我想停止迭代并再次重置收益率

我正在寻找如何在生成器中重置
\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