Forum Archive

'for loop' exit at first passage

mibradoc

Hello,

I have this 'for loop' in my script, where box_altex == 8 :
...
for num_box in range ( (box_altex//33) , (box_altex//33)+3) :
print (num_box)
...
actual range : (6,9)
three print lines expected : 6,7,8
Only first occurs, then the code jumps to the first line after the for loop
How is it possible ?
Regards

cvp

@mibradoc this code works but I don't understand yours: why ==8 and the "*3" is not visible

Édit: visually, all between the two "*" becomes italic

box_altex = 8 
for num_box in range ( (box_altex//3*3) , (box_altex//3*3)+3) : 
    print (num_box) 
cvp

@mibradoc Sure that all lines in the loop are showed here?

mibradoc

Yes, I'am. And loop works fine diretly in shell, but fails in my script, checked with stop points

stephen

@mibradoc code prints


>>> 6
>>> 7
>>> 8

as requested. are you wanting this to print that resault 3 times?


>>> 6
>>> 7
>>> 8

>>> 6
>>> 7
>>> 8

>>> 6
>>> 7
>>> 8

stephen

@cvp

i do want to add that the original post is saying


where box_altex == 8:
    for num_box in range ( (box_altex//3*3) , (box_altex//*33)+3) :
        print (num_box)

of course that throws error so im assuming that its ( (box_altex//3*3) , (box_altex//3*3)+3)

im guessing a few things:
- im thinking @mibradoc is tryingbto run a while do while loop possibly since it seems likenhe wants it to run more than once?
- the where box_altex == 8: was meant box_altex = 8 and this states the loop should run once.

i tried many implementations and other than obvious i get the 123 type ressult. so im not sure how his code in script would alter the outcome. unless example givin differs from actuall..

sorry @mibradoc

JonB

@stephen he said where, not while...

stephen

@JonB

yes sir i was just giving my input on "if" it was a typo. similar to his missplacement of the asterisk. this is why i used i think and ?. when helping i try to be as thorough as i can..

cvp

@JonB & @stephen I think that "where box_altex == 8" is not part of the script, only to say that this variable has the value 8. The script is between the 2 "..." lines

cvp

@mibradoc You say that the code jumps to the line after the loop. I think that we need the full code, if it is possible

mibradoc

here is full code :
https://www.dropbox.com/sh/puqht9zcmjfrzsh/AAA1_zJt1Kt0YFU3avW2dHeja?dl=0

stephen

UPDATED

@mibradoc output:


grille à résoudre ? libre

[[1 4 0 0 7 0 9 2 0]
 [3 0 0 0 0 2 8 5 4]
 [0 0 0 0 5 0 6 0 7]
 [0 0 0 2 0 0 0 7 0]
 [9 0 6 0 0 0 4 0 1]
 [0 5 0 0 0 6 0 0 0]
 [0 0 9 0 6 0 0 0 0]
 [5 3 0 7 0 0 0 0 8]
 [0 8 0 0 2 0 0 3 9]]
50
(1, 1) [3, 4] 2
0
1
2
(3, 2) [3, 5] 0
0
1
2
(5, 4) [3, 5] 3
3
4
5
(7, 5) [0, 2] 4
3
4
5
(9, 3) [4, 5] 5
3
4
5
(3, 4) [3, 4] 3
3
4
5
(8, 0) [3, 5] 2
0
1
2
(8, 0) [3, 5] 2
0
1
2

[[1 4 3 0 7 0 9 2 3]
 [3 0 0 0 0 2 8 5 4]
 [0 0 0 0 5 0 6 1 7]
 [0 0 5 2 3 5 3 7 0]
 [9 7 6 0 0 7 4 0 1]
 [0 5 0 0 0 6 0 9 0]
 [0 0 9 0 6 0 0 0 0]
 [5 3 0 7 0 0 0 0 8]
 [0 8 0 0 2 0 0 3 9]]
40
3

cvp

@mibradoc run gives an error

grille à résoudre ? libre

[[1 4 0 0 7 0 9 2 0]
 [3 0 0 0 0 2 8 5 4]
 [0 0 0 0 5 0 6 0 7]
 [0 0 0 2 0 0 0 7 0]
 [9 0 6 0 0 0 4 0 1]
 [0 5 0 0 0 6 0 0 0]
 [0 0 9 0 6 0 0 0 0]
 [5 3 0 7 0 0 0 0 8]
 [0 8 0 0 2 0 0 3 9]]
50
(1, 1) [3, 4] 2
0
Traceback (most recent call last):
  File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/aa.py", line 147, in <module>
    for colonne in range((numero_carre_sans_chiffre % 3)*3,(numero_carre_sans_chiffre % 3)*3 + 3) :
NameError: name 'numero_carre_sans_chiffre' is not defined
cvp

@stephen did you change code?

cvp

@mibradoc you say
"The for loop is line # 141
using breakpoint you 'll see the jump to line 147 after the first print "

but line 147 is still in the loop, due to its indentation

stephen

@cvp yes im sorry, didnt realize it didnt paste in

I CHANGED:
- for colonne in range((numero_carre % 3)*3,(numero_carre % 3)*3 + 3) :
- #colonnes_possibles=[]colonnes_possibles=[]

not sure what expected outcome isnexpected tho

for numero_carre in range ( (numcarre_altex // 3) * 3,((numcarre_altex//3)*3) + 3 ) :
                print (numero_carre) # BUG !!  sortie de la boucle for après le 1er passage !! 
                #if numero_carre != numcarre_altex and key[0] not in carrint(numero_carre) :
                    #numero_carre_sans_chiffre = numero_carre

                colonnes_possibles=[]
                for colonne in range((numero_carre % 3)*3,(numero_carre % 3)*3 + 3) :
                        if puzzle[ ligne_a_analyser , colonne ] == 0 and key[0] not in puzzle[:9,colonne]:
                            colonnes_possibles.append(colonne)
                if len(colonnes_possibles)  == 1 :
                    fn_remplir_case ( ligne_a_analyser , colonnes_possibles[0] , key[0] )
                        #print()
                        #print (puzzle)
                        #print ()

cvp

@stephen understood, we will wait on réaction about my last post.

stephen

@cvp this feels more like what hes probably looking for? comented out print (numero_carre)
on line 143

grille à résoudre ? libre

[[1 4 0 0 7 0 9 2 0]
 [3 0 0 0 0 2 8 5 4]
 [0 0 0 0 5 0 6 0 7]
 [0 0 0 2 0 0 0 7 0]
 [9 0 6 0 0 0 4 0 1]
 [0 5 0 0 0 6 0 0 0]
 [0 0 9 0 6 0 0 0 0]
 [5 3 0 7 0 0 0 0 8]
 [0 8 0 0 2 0 0 3 9]]
50
(1, 1) [3, 4] 2
(3, 2) [3, 5] 0
(5, 4) [3, 5] 3
(7, 5) [0, 2] 4
(9, 3) [4, 5] 5
(3, 4) [3, 4] 3
(8, 0) [3, 5] 2
(8, 0) [3, 5] 2

[[1 4 3 0 7 0 9 2 3]
 [3 0 0 0 0 2 8 5 4]
 [0 0 0 0 5 0 6 1 7]
 [0 0 5 2 3 5 3 7 0]
 [9 7 6 0 0 7 4 0 1]
 [0 5 0 0 0 6 0 9 0]
 [0 0 9 0 6 0 0 0 0]
 [5 3 0 7 0 0 0 0 8]
 [0 8 0 0 2 0 0 3 9]]
40
3

cvp

@stephen I don't know, up to @mibradoc to tell us more

mibradoc

That 's correct, line 147 is still in the loop. But I 've commented lines 143 and 144 because the nameError and insert line 142 in order to debug. I don't need this print line in my script.
If you uncomment 143 and 144 and if the loop works fine, the name error would dissapear.
Wich version of Pythonista do you use? Mine is 3.3

cvp

@mibradoc Pythonista 3.3 too
You need also to uncomment 146

cvp

This

            for numero_carre in range ( (numcarre_altex // 3) * 3,((numcarre_altex//3)*3) + 3 ) :
                print ('x:',numero_carre) # BUG !!  sortie de la boucle for après le 1er passage !! 
                if numero_carre != numcarre_altex and key[0] not in carrint(numero_carre) :
                    numero_carre_sans_chiffre = numero_carre

                colonnes_possibles=[]
                for colonne in range((numero_carre_sans_chiffre % 3)*3,(numero_carre_sans_chiffre % 3)*3 + 3) : 

also crashes with

grille à résoudre ? libre

[[1 4 0 0 7 0 9 2 0]
 [3 0 0 0 0 2 8 5 4]
 [0 0 0 0 5 0 6 0 7]
 [0 0 0 2 0 0 0 7 0]
 [9 0 6 0 0 0 4 0 1]
 [0 5 0 0 0 6 0 0 0]
 [0 0 9 0 6 0 0 0 0]
 [5 3 0 7 0 0 0 0 8]
 [0 8 0 0 2 0 0 3 9]]
50
(1, 1) [3, 4] 2
x: 0
Traceback (most recent call last):
  File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/aa.py", line 147, in <module>
    for colonne in range((numero_carre_sans_chiffre % 3)*3,(numero_carre_sans_chiffre % 3)*3 + 3) :
NameError: name 'numero_carre_sans_chiffre' is not defined
cvp

Your loop on colonne uses numero_carre_sans_chiffre which is only defined in a if.

Are sure you don't need to indent more this loop?

                if numero_carre != numcarre_altex and key[0] not in carrint(numero_carre) :
                    numero_carre_sans_chiffre = numero_carre

                    colonnes_possibles=[]
                    for colonne in range((numero_carre_sans_chiffre % 3)*3,(numero_carre_sans_chiffre % 3)*3 + 3) : 
mibradoc

@cvp you're right, but the bug remains on my iPad
It's strange that the same code runs without error on your device.
Thanks a lot to you and to @stephen

cvp

@mibradoc As we have made some changes in your code to let it run without name error, I'm not sure we use exactly the same code.
I also have an iPad (Mini 4) and I don't think comes from that.
Could you post a code which runs without name error on your device but which stops after one loop

stephen

pas de problème @mibradoc

here is translated script incase anyone needed/wanted
gist

stephen

@cvp i beleive the error is the issue originaly. i say this only because it raises after one pass of for loop

cvp

@stephen it is possible but as you have also changed some lines (comment, loop on colonne indentation), I just want to be sure that he and us try exactly the same code.

mibradoc

The code on Dropbox stops after one loop. Whith a breakpoint on line 141 and then step by step you will see that the loop is executed only one time, not three as expected. The name error comes because the bypass over the lines 143 and 144 where the variable 'numero_carre_sans_chiffre' is assigned.

cvp

@mibradoc yes, but as the name error occurs in the loop, it is normal the loop is stopped, isn'it?

mibradoc

@stephen Thanks for the translation.

mibradoc

@stephen and your code runs without errors ! Have you made some change other than translate ?

cvp

@mibradoc it was like I said, a problem of indentation of you loop on colonne!

mibradoc

@cvp I think the errors occurs in line 147, after the loop. This cannot prevent the loop from executing three times.

cvp

@mibradoc the problem in your original code is that the loop on colonne was in the loop On numéro and this crashed in the first occurrence in loop.
If you indent left the colonne loop, there is no crash...

Your code

for numéro...
  ...
  For colonne..

correction

for numéro...
  ...
for colonne...
mibradoc

@cvp OK, I'll check indentation

cvp

@mibradoc

See my previous post, edited

mibradoc

@cvp Great, It'works. Merci les amis ;-)

stephen

@mibradoc

I CHANGED:

for colonne in range((numero_carre % 3)3,(numero_carre % 3)3 + 3) :

colonnes_possibles=[] ⇒ colonnes_possibles=[]



for numero_carre in range ( (numcarre_altex // 3) * 3,((numcarre_altex//3)*3) + 3 ) :
                print (numero_carre) # BUG !!  sortie de la boucle for après le 1er passage !! 
                #if numero_carre != numcarre_altex and key[0] not in carrint(numero_carre) :
                    #numero_carre_sans_chiffre = numero_carre

                colonnes_possibles=[]
                for colonne in range((numero_carre % 3)*3,(numero_carre % 3)*3 + 3) :
                        if puzzle[ ligne_a_analyser , colonne ] == 0 and key[0] not in puzzle[:9,colonne]:
                            colonnes_possibles.append(colonne)
                if len(colonnes_possibles)  == 1 :
                    fn_remplir_case ( ligne_a_analyser , colonnes_possibles[0] , key[0] )
                        #print()
                        #print (puzzle)
                        #print ()

mibradoc

@stephen All is fine now, thank you.