Python : While True or False

48,684

Solution 1

Use break to exit a loop:

while True:
    ser = serial.Serial("/dev/ttyUSB0", 4800, timeout =1)
    checking = ser.readline();
    if checking.find(",,,,"):
        print "not locked yet"
    else:
        print "locked and loaded"
        break

The True and False line didn't do anything in your code; they are just referencing the built-in boolean values without assigning them anywhere.

Solution 2

You can use a variable as condition for your while loop instead of just while True. That way you can change the condition.

So instead of having this code:

while True:
    ...
    if ...:
        True
    else:
        False    

... try this:

keepGoing = True
while keepGoing:
    ser = serial.Serial("/dev/ttyUSB0", 4800, timeout =1)
    checking = ser.readline();
    if checking.find(",,,,"):
        print "not locked yet"
        keepGoing = True
    else:
        keepGoing = False    
        print "locked and loaded"

EDIT:

Or as another answerer suggests, you can just break out of the loop :)

Share:
48,684
Tolga Varol
Author by

Tolga Varol

Updated on October 27, 2020

Comments

  • Tolga Varol
    Tolga Varol over 3 years

    I am not an experienced programmer, I have a problem with my code, I think it's a logical mistake of mine but I couldn't find an answer at http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/whilestatements.html . What I want is to check if the serial device is locked, and the different between conditions that "it is locked" and "it isn't locked" is that there are 4 commas ,,,, in the line which contains GPGGA letters. So I want my code to start if there isn't ,,,, but I guess my loop is wrong. Any suggestions will be appreciated. Thanks in advance.

    import serial
    import time
    import subprocess
    
    
    file = open("/home/pi/allofthedatacollected.csv", "w") #"w" will be "a" later
    file.write('\n')
    while True:
        ser = serial.Serial("/dev/ttyUSB0", 4800, timeout =1)
        checking = ser.readline();
        if checking.find(",,,,"):
            print "not locked yet"
            True
        else:
            False    
            print "locked and loaded"
    

    . . .

  • Tolga Varol
    Tolga Varol over 9 years
    Thank you for your answer, I couldn't think of assigning them to a variable :)
  • Martijn Pieters
    Martijn Pieters over 9 years
    @TolgaVarol: Using break is far less error prone and straightforward, however.
  • Tolga Varol
    Tolga Varol over 9 years
    @MartijnPieters You might be right and your solution is simpler and thank you again for that, but I asked the question as True or False, so if someone look at this post and if their problem is about only True False conditions his answer would be better for them.
  • Martijn Pieters
    Martijn Pieters over 9 years
    @TolgaVarol: I disagree with that; the correct way to solve the problem you are trying to solve is to use break. I tried to both answer why your code didn't work and how to do it correctly; both are important.
  • Erich
    Erich about 3 years
    This answer worked for me because I have an inner for loop, so assigning a variable to the outer while statement enabled me to exit both when the for loop succeeded.