Stopping an iteration without using `break` in Python 3

后端 未结 4 1413
春和景丽
春和景丽 2021-01-20 12:02

For example, can this code be rewritten without break (and without continue or return)?

import logging

for i, x in en         


        
相关标签:
4条回答
  • 2021-01-20 12:21

    You could use a boolean value to check if you are done. It will still iterate the rest of the loop but not execute the code. When it is done it will continue on its way without a break. Example Pseudo code below.

    doneLogging = False
    for i, x in enumerate(x):
        if not doneLogging:
            logging.info("Processing `x` n.%s...", i)
            y = do_something(x)
            if y == A:
                logging.info("Doing something else...")
                do_something_else(x)
            elif y == B:
                logging.info("Done.")
                doneLogging = True
    
    0 讨论(0)
  • 2021-01-20 12:39

    You could always use a function and return from it:

    import logging
    
    def func():
        for i, x in enumerate(x):
            logging.info("Processing `x` n.%s...", i)
            y = do_something(x)
            if y == A:
                logging.info("Doing something else...")
                do_something_else(x)
            elif y == B:
                logging.info("Done.")
                return # Exit the function and stop the loop in the process.
    func()
    

    Although using break is more elegant in my opinion because it makes your intent clearer.

    0 讨论(0)
  • 2021-01-20 12:42

    You can also use sys.exit()

    import logging
    import sys
    
    for i, x in enumerate(x):
        logging.info("Processing `x` n.%s...", i)
        y = do_something(x)
        if y == A:
            logging.info("Doing something else...")
            do_something_else(x)
        elif y == B:
            logging.info("Done.")
            sys.exit(0)
    
    0 讨论(0)
  • 2021-01-20 12:46

    The break and continue keywords only have meaning inside a loop, elsewhere they are an error.

    for grooble in spastic():
        if hasattr(grooble, '_done_'):
            # no need for futher processing of this element
            continue
        elif grooble is TheWinner:
            # we have a winner!  we're done!
            break
        else:
            # process this grooble's moves
            ...
    

    Anyone who says break and continue should not be used is not teaching good Python.

    0 讨论(0)
提交回复
热议问题