0

I am still a beginner but does not know why the "return True" in a "for loop" stop the loop after the first pass. If I use something else than "return", everything is fine.

def roc_valid(self,cote_x,cote_y):
    from graph_chess import board
    p = board()
    side=(side_x,side_y)

    if side == (0,0):
        for (x,y) in (0,1),(0,2),(0,3):
            print(King.ok_to_move(self,x,y))
            if p.getPiece(x,y)=="" and king.ok_to_move(self,x,y):
                return True
mdml
  • 22,442
  • 8
  • 58
  • 66
  • my goal is not to break the loop, but to return True" –  Nov 16 '13 at 03:26
  • 1
    It stops the `for` loop because when the `return` statement is encountered, the function immediately returns, ending the loop. – alan Nov 16 '13 at 03:27
  • Return True from what? That's what it does. It makes roc_valid return True. – FogleBird Nov 16 '13 at 03:27
  • Still learning...:) So I should modify the last "if" to return False". Once roc_valid is False, it is ok to stop the loop in that case. Thanks. Got it –  Nov 16 '13 at 03:32

3 Answers3

1

return statement is to return a value from a function. So, if you use return the control will be transferred to the calling function.

If you want to break out of the loop, you need to use break statement.

For example,

def tempFunc1():
    i = 1
    return i
    print "leaving tempFunc1"

print tempFunc1()

It prints just 1. It doesnt print leaving tempFunc1 because, the function has returned to the caller before executing the print "leaving tempFunc1" statement.

thefourtheye
  • 233,700
  • 52
  • 457
  • 497
1

You can use the yield statement. A return statement stops the function and immediately and returns the value while yield statement will return the value and but continues where it left.

if side == (0,0):
    for (x,y) in (0,1),(0,2),(0,3):
        print(King.ok_to_move(self,x,y))
        if p.getPiece(x,y)=="" and king.ok_to_move(self,x,y):
            yield True

Now use: list(roc_valid(self,cote_x,cote_y)) to get a list of all returned values or just next(roc_valid(self,cote_x,cote_y)) to get only the first value.

Demo:

def func():
    for i in xrange(5):
        if i % 2: 
            yield True
...             
>>> list(func())          #all returned values
[True, True]
>>> next(func())          #Just the first returned value
True

Related: The Python yield keyword explained

Community
  • 1
  • 1
Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504
1

If you want to return True, but still keep looping, you may need a pattern like this. I'm calling the variable retval but you can call it anything that makes sense

def roc_valid(self,cote_x,cote_y):
    from graph_chess import board
    p = board()
    side=(side_x,side_y)
    retval = False

    if side == (0,0):
        for (x,y) in (0,1),(0,2),(0,3):
            print(King.ok_to_move(self,x,y))
            if p.getPiece(x,y)=="" and king.ok_to_move(self,x,y):
                retval = True

    return retval
John La Rooy
  • 295,403
  • 53
  • 369
  • 502