for-else

### What is the `for-else` structure?

The `for-else` structure is a unique combination that allows you to run a loop (the `for` part) and then execute a block of code (the `else` part) if the loop completes normally, without being interrupted by a `break` statement.

### How does it work?

1. **The `for` part**: This is just like any other `for` loop, where you iterate over a sequence (like a list, tuple, or string) or any other iterable object.

2. **The `else` part**: This block of code executes only if the `for` loop completed all its iterations without encountering a `break` statement. If a `break` is hit, the `else` block is skipped.

### Example 1: Searching in a list

Let's say you have a list of names, and you're looking for a specific name. If you find the name, you want to print a message. If you don't find the name after checking the whole list, you want to print a different message.

names = ["Alice", "Bob", "Charlie", "Diana"]

search_name = "Charlie"

for name in names:
    if name == search_name:
        print(f"{search_name} found!")
        break
else:
    # This part runs if the name was not found
    print(f"{search_name} not found in the list.")
Charlie found!
In this example, if `search_name` is in the `names` list, it prints that the name was found and exits the loop with `break`, skipping the `else` block. If the loop completes without finding the name, it then runs the `else` block.

### Example 2: Prime number checker

Let's use the `for-else` structure to check if a number is prime. A prime number is a number greater than 1 that has no positive divisors other than 1 and itself.

def is_prime(number):
    if number <= 1:
        return False
    for i in range(2, int(number**0.5) + 1):
        if number % i == 0:
            print(f"{number} is not a prime number.")
            break
    else:
        # This part runs if the number has no divisors other than 1 and itself
        print(f"{number} is a prime number.")

is_prime(11)  # This should print that 11 is a prime number.
is_prime(10)  # This should print that 10 is not a prime number.
11 is a prime number.
10 is not a prime number.
In this prime number checker, the `for` loop checks for divisors of the given `number`. If it finds a divisor, it prints that the number is not prime and breaks out of the loop. If the loop completes without finding any divisors (other than 1 and the number itself), the `else` block runs, indicating the number is prime.

### Why use the `for-else` structure?

It is particularly useful in search operations and conditions where completing a loop without interruptions is a significant condition.

The `for-else` structure can make your code cleaner and more readable by eliminating the need for additional flags or checks outside the loop to determine if the loop completed normally.