## DEV Community is a community of 891,862 amazing developers

We're a place where coders share, stay up-to-date and grow their careers. Otu Michael

Posted on • Updated on

# Python3 Programming - Exercise 11 a - For Loop

## For Loop

There comes a need to repeat certain processes for a particular number of times or for as long as a particular condition holds as we write our codes. So, say we have,

``````print("hello world!")

``````

and we want to repeat this line three times, we would do,

``````print("hello world!")
print("hello world!")
print("hello world!")

``````

or we can do,

``````print("Hello world!\n" * 3)

``````

Say, we want a user to enter a positive number then maybe perform some computation on it, how do we keep prompting the user that we need a positive number?

``````# assume in all cases, the user enters a number
num = int(input("Enter a positive number: "))

if num > 0:
print(f"Great, {num} + 2 = {num + 2}")

``````

In this case, the user would have to run the program again, every time they enter a non-positive number.

What if we have to do it like 100 times, 1000 times? Would you appreciate rerun the code? We will need a loop for this repetitive task.

Here we would look into loops ( also known as iterations). There are two types of loops in Python. These are the:

• `for` loop
• `while` loop

## Range

A new keyword, not that strange, is `range`. `range` takes three arguments: `start, stop and jump`. `stop` can be called `end` and `jump`, `step`.

``````range(0, 5, 1) # start=0, end=5, step=1
range(-5, 2, 2) # start=5, end=2, step=2
``````

`range` produces a sequence of numbers from `start` to `end - 1`, increasing `start` `step` times. So `range(0, 5, 1)` will produce: `0, 1, 2, 3, 4`, starting from `0`, then `0 + 1`, which is the step. `range(-5, 2, 2)` will produce: `-5, -3, -1, 1`. This continues as far as the number is less than `end`. `range` can take `start and end` and by default, `step` is `1`. As such `range(0, 5)` is the same as `range(0, 5, 1)`. `range` can take `end` and by default, `start` is `0` and `step` is `1`. `range(0, 5, 1)` is the same as `range(5)`. `range(3) = 0, 1, 2`. One thing is that, the number are produced as far as `start` is less than `end`.

## For loop

Usually, a `for` loop is used when we know the number of times we need to loop. Something like when the loop should end - looping for a particular number of times.

### Structure of a `for` loop

``````for element in some_structure:
# do something
``````

The `element` is a name we have used to refer to the current object (element) in the `some_structure`. `index` or `i` is mostly used. `some_structure` is an object which can be iterated upon. Some example of iterable are `set` , `list` , `dict` , `str` , `range`, etc.

#### Range looping

Let's print numbers from `1 to 10`, using the range function.

``````for number in range(10):
print(number)
``````

This will print a vertical list of numbers from `0` to `9`. We wanted to print from `1` to `10`. We can add `1` to `number` then `print` it or we can `start` from `1` and `end` on `11`.

``````for number in range(10):
print(number + 1)

for number in range(1, 11):
print(number)
``````

We can print even numbers from `2` to `20` excluded.

``````for number in range(2, 20, 2):
print(number)
``````

You should modify the above code to print odd numbers.

Let's look at another snippet that prints the string, `<number> is even` if the number is even else it prints the number.

``````for number in range(20):
if number % 2 == 0:
print(f"{number} is even")
else:
print(number)
``````

`20` will be excluded. Modify the code to include `20`.

At this moment, we should be able to print a lot of `Hello world!`s without rewriting the print statement.

``````# print hello world three times
for i in range(3):
print("hello world!")
``````

#### Structure Looping

We have discussed `strings` already. Do you recall string indexing, where we pass some number into a square bracket to get a character of the string at that position?

``````name = "John Doe"

# looping through `name` using index
end = len(name)
for i in range(end):
print(name[i])

# looping through `name` without using index
# this is looping through the structure itself
for ch in name:
print(ch)
``````

#### Concept of iterating - lamely

Say we have a string and it is an iterable (this permits the looping on the string).

``````lang = "Python"

for ch in lang:
print(ch)
``````

There is a pointer, should we assume. This pointer here is `ch`, which points to the first element in the iterable (here, a string - lang) if there is any. The first character is `P` so `P` is printed out. The pointer then checks if there is another element. If there is, the pointer, `ch` is assigned that element. This process continues until there is no next element.

#### Example 1

A program the accepts five integer inputs from the user and prints the sum and average.

``````s = 0
for i in range(5):
n = int(input("Enter a positive number: "))

s = s + n
# s += n

avg = s / 5

print(f"Average: {avg}")
``````

With sample input and output

``````Enter a positive number: 2
Enter a positive number: 3
Enter a positive number: 4
Enter a positive number: 7
Enter a positive number: 8
Average: 4.8
``````

#### Example 2

In this snippet, we will take a long space-separated `string` and print out the words and their corresponding number of characters.

``````# we will not be using any function
text = "looping through name without index"

size = 0
word = ""

for ch in text:
if ch != " ":
size += 1
word += ch
else:
print(f"{word} = {size}")
size = 0
word = ""

``````

There above snippet can be reduced to just three lines.

``````text = "looping through name without index"

for word in text.split():
print(f"{word} = {len(word)}")

``````