Python Forum

Full Version: Confusing in [for loop] topic
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
Hi,

I read a book with this below question and answer.
However I cant get the meaning of the explanation.

x = 0
n = 5
for i in range(1, n):
    for j in range(1, n):
        if((i+j) == 2):
            x = x + 2
        if((i+j) == 3):
            x = x + 3
        if((i+j) == 4):
            x = x + 4
print(x)
Output:
20
The explanation was:
First loop are 1,1 ; 1,2 ; 1,3.
Second loop are 2,1 ; 2,2.
Third loop are 3,1.
Fourth loop is nothing.
>>> So x = 2 + 3 + 4 + 3 + 4 + 4 = 20

Why there is nothing in the fourth loop? Huh
How is the logic of this loop ? Huh
You're going to need to be clearer about what you mean. There are two loops there, not four. Trace through execution of the program by hand, writing down the values of the variables as you go. That will help you understand what's going on. You can also add extra calls to print to see what the values are.
You are using the wrong term. Your program has two loops. The outer loop ITERATES 4 times: (0, 1, 2, 3). The inner loop iterates 16 times: 4x(0, 1, 2, 3). Some would also say (correctly) that the inner loop ITERATES 4 times and this is repeated 4 times.

Add a print statement to the loop:
x = 0
n = 5
for i in range(1, n):
    for j in range(1, n):
        if((i+j) == 2):
            x = x + 2
        if((i+j) == 3):
            x = x + 3
        if((i+j) == 4):
            x = x + 4
        print(i, j, i+j, x)
print(x)
Output:
1 1 2 2 <- Three changes while i = 1 1 2 3 5 <- 1 3 4 9 <- 1 4 5 9 2 1 3 12 <- Two changes while i = 2 2 2 4 16 <- 2 3 5 16 2 4 6 16 3 1 4 20 <- Only one change while i = 3 3 2 5 20 3 3 6 20 3 4 7 20 4 1 5 20 <- No changes while i = 4 4 2 6 20 4 3 7 20 4 4 8 20
Focusing on the last two columns you can see that the value of the last column (x) only changes when the value in the 3rd column (i+j) is 2, 3 or 4.

I would explain this as "x only increases if the value of i+j is 2, 3 or 4", but if you wanted to describe it using loops you could say:

When i is 1 you add values for j = 1, 2 and 3 (2, 3, 4)
When i is 2 you add values for j = 1 and 2 (3, 4)
When i is 3 you add values for j = 1 (4)
When i is 4 you don't add any values
x = 2 + 2*3 + 3*4 = 2 + 6 + 12 = 20
(Jul-31-2021, 11:23 AM)ndc85430 Wrote: [ -> ]You're going to need to be clearer about what you mean. There are two loops there, not four. Trace through execution of the program by hand, writing down the values of the variables as you go. That will help you understand what's going on. You can also add extra calls to print to see what the values are.

Thanks for your reply.
I'm new to Python, so I have a lot of confusing.
(Jul-31-2021, 01:45 PM)Sherine Wrote: [ -> ]"i in range (1, n)"
the n = 5,
so why the loop is not going until 4? it's only 3.

How are you determining that the loop only goes up to 3 and not 4? Have you printed out the value of i on each iteration? Show us that output; it should be going to 4.
From the documents:

https://docs.python.org/3/library/stdtypes.html#range

Quote:class range(start, stop[, step])
The arguments to the range constructor must be integers (either built-in int or any object that implements the __index__ special method). If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. If step is zero, ValueError is raised.

For a positive step, the contents of a range r are determined by the formula r[i] = start + step*i where i >= 0 and r[i] < stop.
In your example the range starts with i = 1 and continues while i < 5. Since it is not specified the step size defaults to 1. This results in i having values [1, 2, 3, 4].
print(list(range(1, 5)))
Output:
[1, 2, 3, 4]
(Jul-31-2021, 01:41 PM)deanhystad Wrote: [ -> ]You are using the wrong term. Your program has two loops. The outer loop ITERATES 4 times: (0, 1, 2, 3). The inner loop iterates 16 times: 4x(0, 1, 2, 3). Some would also say (correctly) that the inner loop ITERATES 4 times and this is repeated 4 times.

Add a print statement to the loop:
x = 0
n = 5
for i in range(1, n):
    for j in range(1, n):
        if((i+j) == 2):
            x = x + 2
        if((i+j) == 3):
            x = x + 3
        if((i+j) == 4):
            x = x + 4
        v
print(x)
Output:
1 1 2 2 <- Three changes while i = 1 1 2 3 5 <- 1 3 4 9 <- 1 4 5 9 2 1 3 12 <- Two changes while i = 2 2 2 4 16 <- 2 3 5 16 2 4 6 16 3 1 4 20 <- Only one change while i = 3 3 2 5 20 3 3 6 20 3 4 7 20 4 1 5 20 <- No changes while i = 4 4 2 6 20 4 3 7 20 4 4 8 20
Focusing on the last two columns you can see that the value of the last column (x) only changes when the value in the 3rd column (i+j) is 2, 3 or 4.

I would explain this as "x only increases if the value of i+j is 2, 3 or 4", but if you wanted to describe it using loops you could say:

When i is 1 you add values for j = 1, 2 and 3 (2, 3, 4)
When i is 2 you add values for j = 1 and 2 (3, 4)
When i is 3 you add values for j = 1 (4)
When i is 4 you don't add any values
x = 2 + 2*3 + 3*4 = 2 + 6 + 12 = 20

Thank you for your reply.
I understood with your statement
print(i, j, i+j, x)
,
this output make me clear.

This "x = 2 + 2*3 + 3*4 = 2 + 6 + 12 = 20" calculation I can't understand. Think
But it's okay, I really appreciate to your statement, let me know how this statement work.

Thanks Smile
(Jul-31-2021, 01:51 PM)deanhystad Wrote: [ -> ]From the documents:

https://docs.python.org/3/library/stdtypes.html#range

Quote:class range(start, stop[, step])
The arguments to the range constructor must be integers (either built-in int or any object that implements the __index__ special method). If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. If step is zero, ValueError is raised.

For a positive step, the contents of a range r are determined by the formula r[i] = start + step*i where i >= 0 and r[i] < stop.
In your example the range starts with i = 1 and continues while i < 5. Since it is not specified the step size defaults to 1. This results in i having values [1, 2, 3, 4].
print(list(range(1, 5)))
Output:
[1, 2, 3, 4]

Thanks for your document link.
(Jul-31-2021, 01:47 PM)ndc85430 Wrote: [ -> ]
(Jul-31-2021, 01:45 PM)Sherine Wrote: [ -> ]"i in range (1, n)"
the n = 5,
so why the loop is not going until 4? it's only 3.

How are you determining that the loop only goes up to 3 and not 4? Have you printed out the value of i on each iteration? Show us that output; it should be going to 4.

Since the quiz explanation are
1,1 ; 1,2 ; 1,3
2,1 ; 2,2
3,1
so I just wondering why no 4 in this explanation.

However, now I clear with that already.
Thanks for your reply.
When i is 1 you add values for j = 1, 2 and 3 (2, 3, 4)
When i is 2 you add values for j = 1 and 2 (3, 4)
When i is 3 you add values for j = 1 (4)
When i is 4 you don't add any values

x = (2 + 3 + 4) + (3 + 4) + (4)
x = 2 + 3 + 4 + 3 + 4 + 4
x = 2 + 3 + 3 + 4 + 4 + 4
x = 2 + 2 * 3 + 3 * 4
Pages: 1 2