Emulate a do-while loop in Python?

后端 未结 16 901
伪装坚强ぢ
伪装坚强ぢ 2020-11-22 06:47

I need to emulate a do-while loop in a Python program. Unfortunately, the following straightforward code does not work:

list_of_ints = [ 1, 2, 3 ]
iterator =         


        
16条回答
  •  心在旅途
    2020-11-22 07:38

    Here is a crazier solution of a different pattern -- using coroutines. The code is still very similar, but with one important difference; there are no exit conditions at all! The coroutine (chain of coroutines really) just stops when you stop feeding it with data.

    def coroutine(func):
        """Coroutine decorator
    
        Coroutines must be started, advanced to their first "yield" point,
        and this decorator does this automatically.
        """
        def startcr(*ar, **kw):
            cr = func(*ar, **kw)
            cr.next()
            return cr
        return startcr
    
    @coroutine
    def collector(storage):
        """Act as "sink" and collect all sent in @storage"""
        while True:
            storage.append((yield))
    
    @coroutine      
    def state_machine(sink):
        """ .send() new parts to be tokenized by the state machine,
        tokens are passed on to @sink
        """ 
        s = ""
        state = STATE_CODE
        while True: 
            if state is STATE_CODE :
                if "//" in s :
                    sink.send((TOKEN_COMMENT, s.split( "//" )[1] ))
                    state = STATE_COMMENT
                else :
                    sink.send(( TOKEN_CODE, s ))
            if state is STATE_COMMENT :
                if "//" in s :
                    sink.send(( TOKEN_COMMENT, s.split( "//" )[1] ))
                else
                    state = STATE_CODE
                    # re-evaluate same line
                    continue
            s = (yield)
    
    tokens = []
    sm = state_machine(collector(tokens))
    for piece in i:
        sm.send(piece)
    

    The code above collects all tokens as tuples in tokens and I assume there is no difference between .append() and .add() in the original code.

提交回复
热议问题