Loops


Explanation: Python loops are used to execute a block of code repeatedly. They are fundamental constructs for automation, iteration over collections, and any task that involves repeating actions. Python provides two main types of loops: for loops for iterating over sequences, and while loops for repeating based on a condition.

  • for loop: Iterating over sequences (strings, lists, tuples, ranges)

    • Explanation: The for loop in Python is used to iterate over a sequence (such as a list, tuple, string, or range) or other iterable objects. It executes the body of the loop once for each item in the sequence. This is a very common and powerful construct for processing collections of data.

    • Syntax:

      for item in sequence:
          # Code to execute for each item
      
      
    • Note: python for loop tutorial, iterate over list python, loop through string python, python for loop examples, sequence iteration python.

    • Code Examples:

    # Example 1 (Beginner-Friendly): Iterating over a list of names
    # The 'for' loop assigns each element of the 'names' list to 'name' in turn.
    names = ["Alice", "Bob", "Charlie"]
    for name in names:
        print(f"Hello, {name}!")
    
    # Example 2 (Slightly More Complex): Iterating over characters in a string
    # A string is a sequence of characters, so you can loop through it.
    word = "Python"
    for char in word:
        print(f"Character: {char}")
    
    # Example 3 (Intermediate): Calculating sum of numbers in a tuple
    # Demonstrates accumulating a result by iterating over a tuple.
    numbers = (10, 20, 30, 40)
    total_sum = 0
    for num in numbers:
        total_sum += num # Add each number to total_sum
    print(f"The sum of numbers is: {total_sum}")
    
    # Example 4 (Advanced Beginner): Iterating over a dictionary (keys by default)
    # When iterating directly over a dictionary, the loop variable gets the keys.
    student_scores = {"Alice": 95, "Bob": 88, "Charlie": 72}
    for student in student_scores: # 'student' will be the key (e.g., "Alice")
        score = student_scores[student] # Access the value using the key
        print(f"{student} scored {score}.")
    
    # Example 5 (Intermediate): Iterating with a fixed number of times (range)
    # Using the range() function to perform an action a specific number of times.
    # range(5) generates numbers 0, 1, 2, 3, 4.
    for i in range(5):
        print(f"Loop iteration {i + 1}") # Print 1-based count
    
    # Example 6 (Advanced): Filtering items in a list (list comprehension concept)
    # Although list comprehensions are covered later, this shows a common for loop pattern.
    data_values = [1, -5, 10, -2, 7, -8, 0]
    positive_values = []
    for val in data_values:
        if val > 0:
            positive_values.append(val)
    print(f"Positive values: {positive_values}")
    
    # Example 7 (Advanced): Looping over nested data structures
    # Accessing elements within nested lists using nested for loops.
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    print("Matrix elements:")
    for row in matrix: # 'row' is a list (e.g., [1, 2, 3])
        for element in row: # 'element' is an individual number
            print(element, end=" ") # Print elements on the same line, separated by space
        print() # Move to the next line after each row
    
    
  • range() function

    • Explanation: The range() function is a built-in Python function that generates a sequence of numbers. It is commonly used with for loops to iterate a specific number of times or over a particular range of integer values. It's memory-efficient because it generates numbers on the fly, rather than creating a full list in memory.

    • Syntax:

      • range(stop): Generates numbers from 0 up to (but not including) stop.

      • range(start, stop): Generates numbers from start up to (but not including) stop.

      • range(start, stop, step): Generates numbers from start up to (but not including) stop, incrementing by step each time.

    • Note: python range function, loop fixed times python, python for loop numbers, range start stop step, python numeric sequence.

    • Code Examples:

    # Example 1 (Beginner-Friendly): range(stop) - count from 0
    # Loops 5 times, with 'i' taking values 0, 1, 2, 3, 4.
    print("Counting from 0 to 4:")
    for i in range(5):
        print(i)
    
    # Example 2 (Slightly More Complex): range(start, stop) - count from a specific number
    # Loops from 10 up to (but not including) 15, so 10, 11, 12, 13, 14.
    print("\nCounting from 10 to 14:")
    for num in range(10, 15):
        print(num)
    
    # Example 3 (Intermediate): range(start, stop, step) - custom increment
    # Loops from 0 to 10, incrementing by 2 (0, 2, 4, 6, 8, 10).
    print("\nCounting even numbers from 0 to 10:")
    for even_num in range(0, 11, 2): # Stop is 11 to include 10
        print(even_num)
    
    # Example 4 (Advanced Beginner): range with negative step (counting backwards)
    # Loops from 5 down to (but not including) 0, decrementing by 1 (5, 4, 3, 2, 1).
    print("\nCounting backwards from 5 to 1:")
    for j in range(5, 0, -1):
        print(j)
    
    # Example 5 (Intermediate): Using range for indexing lists (less Pythonic, but valid)
    # This is a common pattern in other languages; in Python, direct iteration is preferred.
    fruits = ["apple", "banana", "cherry"]
    print("\nAccessing fruits by index:")
    for index in range(len(fruits)): # len(fruits) is 3, so range(3) gives 0, 1, 2
        print(f"Index {index}: {fruits[index]}")
    
    # Example 6 (Advanced): Generating a sequence for mathematical series
    # Using range to generate terms for a series.
    # Sum of squares from 1 to 5: 1^2 + 2^2 + 3^2 + 4^2 + 5^2
    sum_of_squares = 0
    for k in range(1, 6): # Numbers from 1 to 5
        sum_of_squares += k ** 2
    print(f"\nSum of squares from 1 to 5: {sum_of_squares}") # 1 + 4 + 9 + 16 + 25 = 55
    
    # Example 7 (Advanced): Dynamic ranges based on user input
    # Combining input() with range() for interactive loops.
    try:
        start_val = int(input("\nEnter start number for loop: "))
        end_val = int(input("Enter end number for loop (exclusive): "))
        if start_val < end_val:
            print(f"Looping from {start_val} to {end_val - 1}:")
            for val in range(start_val, end_val):
                print(val)
        else:
            print("Start value must be less than end value.")
    except ValueError:
        print("Invalid input. Please enter integers.")
    
    
  • enumerate()

    • Explanation: The enumerate() function is a built-in Python function that adds a counter to an iterable and returns it as an enumerate object. This object can then be used directly in a for loop to get both the index (counter) and the value of each item in the iterable simultaneously. It's highly useful when you need to know the position of an item while iterating.

    • Syntax:

      for index, value in enumerate(iterable):
          # Code using both index and value
      
      

      You can also specify a start argument: enumerate(iterable, start=1).

    • Note: python enumerate function, loop with index python, python get index and value, iterate with counter python, python enumerate example.

    • Code Examples:

    # Example 1 (Beginner-Friendly): Basic enumerate with a list
    # Gets both the default 0-based index and the item value.
    my_fruits = ["apple", "banana", "cherry"]
    print("List items with default index:")
    for index, fruit in enumerate(my_fruits):
        print(f"Item {index}: {fruit}")
    
    # Example 2 (Slightly More Complex): Enumerate with custom start index
    # Starts counting from 1 instead of 0, which is often more user-friendly.
    tasks = ["Write code", "Test app", "Deploy", "Monitor"]
    print("\nTasks with 1-based numbering:")
    for task_num, task in enumerate(tasks, start=1):
        print(f"Task {task_num}: {task}")
    
    # Example 3 (Intermediate): Enumerate over a string
    # Accessing characters and their positions in a word.
    word_to_spell = "PROGRAM"
    print("\nSpelling out the word:")
    for pos, letter in enumerate(word_to_spell):
        print(f"Position {pos}: {letter}")
    
    # Example 4 (Advanced Beginner): Modifying elements at specific indices
    # Enumerate is useful when you need to update items in a list based on their index.
    # Note: Direct modification within the loop requires using the index.
    scores = [85, 92, 78, 65]
    print("\nScores before bonus:", scores)
    for idx, score in enumerate(scores):
        if score < 80:
            scores[idx] = score + 5 # Add 5 bonus points to scores less than 80
    print("Scores after bonus:", scores)
    
    # Example 5 (Intermediate): Enumerate with a dictionary (iterating over items())
    # While 'in' checks keys, you can iterate over (key, value) pairs using .items()
    # and then use enumerate if you also need a sequence number.
    student_data = {"Math": 90, "Science": 85, "History": 78}
    print("\nSubjects and scores with an index:")
    for i, (subject, score) in enumerate(student_data.items()):
        print(f"({i+1}) Subject: {subject}, Score: {score}")
    
    # Example 6 (Advanced): Using enumerate to create pairs or sub-sequences
    # Useful for comparing current item with next item, or creating pairs.
    reading = [10, 12, 15, 11, 13, 16]
    print("\nTemperature changes:")
    for i, temp in enumerate(reading):
        if i < len(reading) - 1: # Ensure there is a next element
            next_temp = reading[i+1]
            change = next_temp - temp
            print(f"  From {temp} to {next_temp}: Change = {change}")
    
    # Example 7 (Advanced): Conditional logic and enumerate for complex processing
    # Processing a log file line by line, identifying critical entries and their line numbers.
    log_lines = [
        "INFO: Application started.",
        "WARNING: Disk space low.",
        "DEBUG: User 'admin' logged in.",
        "ERROR: Database connection failed!",
        "INFO: Task completed."
    ]
    print("\nProcessing log file:")
    for line_num, line in enumerate(log_lines, start=1):
        if "ERROR" in line:
            print(f"CRITICAL ERROR on Line {line_num}: {line}")
        elif "WARNING" in line:
            print(f"Warning on Line {line_num}: {line}")
    
    
  • while loop: Based on a condition

    • Explanation: The while loop repeatedly executes a block of code as long as a given condition remains True. The loop continues until the condition evaluates to False. It's particularly useful when you don't know in advance how many times you need to loop, but rather you need to loop until a specific state is achieved. It's crucial for Python indefinite loops and game loops.

    • Syntax:

      while condition:
          # Code to execute while condition is True
          # Make sure to include code that eventually makes the condition False
      
      
    • Note: python while loop tutorial, infinite loop python, loop until condition python, while loop example, python game loop.

    • Code Examples:

    # Example 1 (Beginner-Friendly): Simple counter
    # Increments a counter until it reaches a certain value.
    count = 0
    while count < 5:
        print(f"Count is: {count}")
        count += 1 # Important: increment the counter to avoid infinite loop
    print("Loop finished.")
    
    # Example 2 (Slightly More Complex): User input validation loop
    # Continues to ask for input until a valid input is provided.
    password = ""
    while len(password) < 8:
        password = input("Enter a password (min 8 characters): ")
        if len(password) < 8:
            print("Password is too short. Try again.")
    print("Password set successfully!")
    
    # Example 3 (Intermediate): Simple game loop (guess the number)
    # Demonstrates a common pattern where the loop continues until a specific event.
    import random
    secret_number = random.randint(1, 10)
    guess = 0
    print("\nGuess the number between 1 and 10!")
    while guess != secret_number:
        try:
            guess = int(input("Your guess: "))
            if guess < secret_number:
                print("Too low!")
            elif guess > secret_number:
                print("Too high!")
        except ValueError:
            print("Invalid input. Please enter a number.")
    print(f"Congratulations! You guessed the number {secret_number}.")
    
    # Example 4 (Advanced Beginner): Sentinel value to stop loop
    # A specific value (sentinel) is used to signal the end of input.
    total_price = 0
    print("\nEnter item prices (type 0 to finish):")
    while True: # Loop indefinitely until 'break' is encountered
        try:
            price = float(input("Item price: $"))
            if price == 0:
                break # Exit loop if sentinel (0) is entered
            if price < 0:
                print("Price cannot be negative. Please try again.")
                continue # Skip to next iteration if price is invalid
            total_price += price
        except ValueError:
            print("Invalid input. Please enter a number.")
    print(f"Total price: ${total_price:.2f}")
    
    # Example 5 (Intermediate): While loop with an external condition change
    # The loop condition can be affected by external events or flags.
    is_running = True
    elapsed_time = 0
    max_time = 10 # seconds (for simulation)
    print("\nSimulating a timer...")
    while is_running and elapsed_time < max_time:
        print(f"Time elapsed: {elapsed_time}s")
        # In a real scenario, this would be a time.sleep() or event loop
        import time
        time.sleep(1) # Simulate passage of 1 second
        elapsed_time += 1
        if elapsed_time >= max_time:
            is_running = False # Set flag to False to stop the loop
    print("Timer finished!")
    
    # Example 6 (Advanced): Implementing exponential backoff with while loop
    # A common pattern for retrying operations with increasing delays.
    attempts = 0
    max_attempts = 5
    base_delay = 1 # seconds
    
    print("\nAttempting to connect to a service...")
    while attempts < max_attempts:
        attempts += 1
        print(f"Attempt {attempts}...")
        # Simulate a connection attempt (e.g., trying to fetch data from a server)
        connection_successful = random.choice([True, False, False]) # Simulate failure more often
    
        if connection_successful:
            print("Connection successful!")
            break # Exit the loop on success
        else:
            delay = base_delay * (2 ** (attempts - 1)) # Exponential backoff (1, 2, 4, 8...)
            print(f"Connection failed. Retrying in {delay} seconds...")
            if attempts < max_attempts:
                time.sleep(delay)
            else:
                print("Max attempts reached. Failed to connect.")