The `for` loop in Python is used to iterate over a sequence (list, tuple, string) or other iterable objects. Iterating over a sequence is called traversal.

## Syntax of Loop

```for val in sequence:
Body of for```

Here, `val` is the variable that takes the value of the item inside the sequence on each iteration. Loop continues until we reach the last item in the sequence. The body of `for` loop is separated from the rest of the code using indentation.

## Flowchart of Loop ## Example: Python Loop

```# Program to find
# the sum of all numbers
# stored in a list

# List of numbers
numbers = [6,5,3,8,4,2,5,4,11]

# variable to store the sum
sum = 0

# iterate over the list
for val in numbers:
sum = sum+val

# print the sum
print("The sum is",sum)```

Output

`The sum is 48`

## The range() function

We can generate a sequence of numbers using `range()` function. `range(10)` will generate numbers from 0 to 9 (10 numbers). We can also define the `start`, `stop` and `step size` as`range(start,stop,step size)`. `step size` defaults to 1 if not provided. This function does not store all the values in memory, it would be inefficient. So it remembers the `start`, `stop`, `step size`and generates the next number on the go. To force this function to output all the items, we can use the function `list()`.

The following example will clarify this.

```>>> range(10)
range(0, 10)
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(2,8))
[2, 3, 4, 5, 6, 7]
>>> list(range(2,20,3))
[2, 5, 8, 11, 14, 17]```

We can use the `range()` function in `for` loops to iterate through a sequence of numbers. It can be combined with the `len()` function to iterate though a sequence using indexing. Here is an example.

```# Program to iterate
# through a list
# using indexing

# List of genre
genre = ['pop','rock','jazz']

# iterate over the list using index
for i in range(len(genre)):
print("I like",genre[i])```

Output

```I like pop
I like rock
I like jazz```

## for loop with else

A `for` loop can have an optional `else` block as well. The `else` part is executed if the items in the sequence used in `for` loop exhausts. `break` statement can be used to stop a `for` loop. In such case, the `else` part is ignored. Hence, a `for` loop’s `else` part runs if no break occurs.

Here is an example to illustrate this.

```# Program to show
# the control flow
# when using else block
# in a for loop

# a list of digit
list_of_digits = [0,1,2,3,4,5,6]

# take input from user
input_digit = int(input("Enter a digit: "))

# search the input digit in our list
for i in list_of_digits:
if input_digit == i:
print("Digit is in the list")
break
else:

Output 1

```Enter a digit: 3
Digit is in the list```

Output 2

```Enter a digit: 9
Here, we have a list of digits from 0 to 6. We ask the user to enter a digit and check if the digit is in our list or not. If the digit is present, `for` loop breaks prematurely. So, the `else` part does not run. But if the items in our list exhausts (digit not found in our list), the program enters the `else` part.