Loop Control Statements


 

Explanation: Python loop control statements (break, continue, pass) alter the normal execution flow of loops. They give you finer control over when to exit a loop prematurely, skip an iteration, or act as a placeholder. Mastering these can make your Python loops more efficient and robust.

  • break

    # Example 1 (Beginner-Friendly): Breaking a for loop when an item is found
    # Iterates through a list of numbers and stops as soon as a specific number is found.
    numbers = [1, 5, 8, 12, 15, 20]
    search_value = 12
    print("Searching for 12 in the list:")
    for num in numbers:
        if num == search_value:
            print(f"Found {search_value}! Exiting loop.")
            break # Stop the loop immediately
        print(f"Checking {num}...")
    print("Search complete.")
    
    # Example 2 (Slightly More Complex): Breaking a while loop after specific attempts
    # Used in scenarios like limited login attempts or retries.
    max_attempts = 3
    attempts_made = 0
    correct_pin = "1234"
    
    while attempts_made < max_attempts:
        user_pin = input(f"Enter PIN ({max_attempts - attempts_made} attempts remaining): ")
        if user_pin == correct_pin:
            print("PIN accepted. Access granted!")
            break # Exit on success
        else:
            attempts_made += 1
            print("Incorrect PIN.")
    else: # This 'else' block for while loop executes if the loop completes normally (without a break)
        print("Too many incorrect attempts. Account locked.")
    
    # Example 3 (Intermediate): Breaking from a nested loop
    # If a break is inside an inner loop, it only terminates the inner loop, not the outer one.
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    target_value = 5
    found = False
    print("\nSearching in a matrix:")
    for row_idx, row in enumerate(matrix):
        for col_idx, value in enumerate(row):
            if value == target_value:
                print(f"Found {target_value} at ({row_idx}, {col_idx})")
                found = True
                break # Breaks out of the inner loop only
        if found: # Check if value was found in the inner loop
            break # Breaks out of the outer loop too
    print("Matrix search finished.")
    
    # Example 4 (Advanced Beginner): Processing stream of data until a 'stop' signal
    # Simulating reading data chunks until an end-of-stream marker.
    data_stream = ["chunk_a", "chunk_b", "STOP", "chunk_c", "chunk_d"]
    processed_data = []
    print("\nProcessing data stream:")
    for data_chunk in data_stream:
        if data_chunk == "STOP":
            print("Stop signal received. Halting data processing.")
            break
        processed_data.append(data_chunk)
        print(f"Processed: {data_chunk}")
    print(f"Final processed data: {processed_data}")
    
    # Example 5 (Intermediate): Breaking for performance optimization
    # If you only need one result from a search, breaking early saves computation.
    import math
    number_to_check = 100
    is_prime = True
    if number_to_check <= 1:
        is_prime = False
    else:
        # Only need to check divisibility up to the square root of the number
        for i in range(2, int(math.sqrt(number_to_check)) + 1):
            if number_to_check % i == 0:
                is_prime = False
                print(f"{number_to_check} is divisible by {i}. Not prime. Breaking early.")
                break # Found a divisor, no need to check further
    print(f"{number_to_check} is prime: {is_prime}")
    
    # Example 6 (Advanced): Breaking for user choice in a menu loop
    # Common in CLI applications where a loop presents options until user quits.
    menu_options = ["View", "Edit", "Save", "Quit"]
    print("\nApplication Menu:")
    while True:
        print("Options:", ", ".join(menu_options))
        choice = input("Enter your choice: ").capitalize() # Capitalize for easier comparison
        if choice == "Quit":
            print("Exiting application. Goodbye!")
            break # Exit the menu loop
        elif choice == "View":
            print("Displaying data...")
        elif choice == "Edit":
            print("Entering edit mode...")
        elif choice == "Save":
            print("Saving changes...")
        else:
            print("Invalid choice. Please select from the menu.")
        print("-" * 20) # Separator for next prompt
    
    
    • Explanation: The break statement is used to exit a loop immediately. When break is encountered, the loop terminates, and program execution continues with the statement immediately following the loop. It's often used when a certain condition is met and no further iterations of the loop are needed.

    • Note: python break statement, exit loop python, stop for loop, terminate while loop python, break keyword python.

    • Code Examples:

  • continue

    # Example 1 (Beginner-Friendly): Skipping even numbers
    # Iterates through numbers 1 to 10, but only prints odd numbers.
    print("Printing odd numbers (1-10):")
    for i in range(1, 11):
        if i % 2 == 0: # If 'i' is even
            continue # Skip the rest of this iteration and go to the next 'i'
        print(i) # This line only executes for odd numbers
    
    # Example 2 (Slightly More Complex): Skipping invalid data entries
    # Processes a list of data, ignoring malformed or unwanted entries.
    data_points = [10, 5, -3, 0, 12, -7, 20]
    valid_sum = 0
    print("\nCalculating sum of positive numbers:")
    for value in data_points:
        if value <= 0: # If value is non-positive
            print(f"Skipping non-positive value: {value}")
            continue # Skip to the next value
        valid_sum += value
        print(f"Added {value}. Current sum: {valid_sum}")
    print(f"Final sum of valid numbers: {valid_sum}")
    
    # Example 3 (Intermediate): Processing user input, skipping blanks
    # Ensures that only non-empty inputs are processed.
    comments = []
    print("\nEnter comments (press Enter on empty line to finish):")
    while True:
        user_comment = input("> ")
        if not user_comment: # Check if input is empty
            print("Empty comment. Stopping input.")
            break # Exit if an empty line is entered
        if user_comment.isspace(): # Check if input contains only whitespace
            print("Comment contains only spaces. Skipping.")
            continue # Skip this iteration
        comments.append(user_comment)
    print(f"Collected comments: {comments}")
    
    # Example 4 (Advanced Beginner): Skipping specific elements in a string processing
    # Processing a string character by character, ignoring vowels.
    sentence = "Python Programming is Fun!"
    consonants_only = ""
    vowels = "aeiouAEIOU"
    print("\nExtracting consonants:")
    for char in sentence:
        if char in vowels or not char.isalpha(): # If it's a vowel or not an alphabet
            continue # Skip this character
        consonants_only += char
    print(f"Consonants only: {consonants_only}")
    
    # Example 5 (Intermediate): Applying discounts selectively
    # Iterating through products and applying a discount only to specific categories.
    products = [
        {"name": "Laptop", "category": "Electronics", "price": 1200},
        {"name": "Chair", "category": "Furniture", "price": 150},
        {"name": "Mouse", "category": "Electronics", "price": 25},
        {"name": "Table", "category": "Furniture", "price": 300}
    ]
    discount_percentage = 0.10 # 10%
    
    print("\nApplying discounts to Electronics:")
    for product in products:
        if product["category"] != "Electronics":
            print(f"  Skipping {product['name']} (not Electronics).")
            continue # Skip to next product if not Electronics
    
        discounted_price = product["price"] * (1 - discount_percentage)
        print(f"  {product['name']} ({product['category']}): Old Price ${product['price']:.2f}, New Price ${discounted_price:.2f}")
    
    # Example 6 (Advanced): Conditional logging based on event type
    # Processing a list of events, logging only events of a certain severity.
    event_log = [
        "INFO: User login successful",
        "DEBUG: Data fetched from cache",
        "WARNING: Low disk space on /dev/sda1",
        "INFO: Report generated",
        "ERROR: Database connection lost"
    ]
    print("\nFiltered Log Entries (only Warnings and Errors):")
    for entry in event_log:
        if "INFO" in entry or "DEBUG" in entry:
            continue # Skip informational and debug messages
        print(entry)
    
    # Example 7 (Advanced): Optimizing loop for finding first valid item
    # Combine `break` and `continue` to handle complex search/processing.
    data_records = [
        {"id": 1, "status": "pending", "value": 100},
        {"id": 2, "status": "error", "value": None},
        {"id": 3, "status": "processed", "value": 250},
        {"id": 4, "status": "pending", "value": 50},
        {"id": 5, "status": "error", "value": None},
        {"id": 6, "status": "processed", "value": 300}
    ]
    first_pending_valid_value = None
    print("\nSearching for first valid pending record:")
    for record in data_records:
        if record["status"] == "error" or record["value"] is None:
            print(f"  Skipping record ID {record['id']} due to error or missing value.")
            continue # Skip invalid/error records
    
        if record["status"] == "pending":
            first_pending_valid_value = record["value"]
            print(f"  Found first valid pending record ID {record['id']} with value {first_pending_valid_value}.")
            break # Stop after finding the first one
        else:
            print(f"  Record ID {record['id']} is {record['status']}.")
    
    if first_pending_valid_value is not None:
        print(f"Result: The first valid pending value found is: {first_pending_valid_value}")
    else:
        print("Result: No valid pending record found.")
    
    
    • Explanation: The continue statement is used to skip the rest of the current iteration of a loop and move to the next iteration. When continue is encountered, the code immediately jumps to the beginning of the loop (to re-evaluate the condition for while or fetch the next item for for). It's useful when you want to skip processing certain items or conditions within a loop without stopping the entire loop.

    • Note: python continue statement, skip loop iteration python, python skip current iteration, continue keyword python, loop next iteration.

    • Code Examples:

  • pass

    # Example 1 (Beginner-Friendly): Placeholder in a function definition
    # You might define a function signature but postpone its implementation.
    def greet_user(name):
        # TODO: Implement actual greeting logic here later
        pass # This function currently does nothing
    print("Calling greet_user():")
    greet_user("Alice") # Nothing is printed or done
    
    # Example 2 (Slightly More Complex): Placeholder in an if-else block
    # If you want to handle specific conditions but only react to a subset initially.
    status = "maintenance"
    if status == "active":
        print("System is running normally.")
    elif status == "maintenance":
        pass # Do nothing specific for maintenance mode yet, but acknowledge it
    else:
        print("Unknown system status.")
    
    # Example 3 (Intermediate): Placeholder in a loop (during development)
    # You're planning to process items in a loop but haven't written the processing logic.
    data_items = [10, 20, 30, 40]
    print("\nProcessing data items (placeholder):")
    for item in data_items:
        # Placeholder for complex data processing logic
        if item % 10 == 0:
            pass # Just acknowledge, no special action needed here
        else:
            print(f"Item {item} needs attention!")
        # The loop continues normally
    print("Finished placeholder processing.")
    
    # Example 4 (Advanced Beginner): Handling an exception without action
    # Sometimes, you might catch an exception but decide that no specific action
    # is needed, effectively ignoring it. Use with caution!
    my_dict = {"a": 1, "b": 2}
    key_to_check = "c"
    try:
        value = my_dict[key_to_check]
        print(f"Value found: {value}")
    except KeyError:
        pass # Ignore the KeyError, don't print anything or raise further
    print("Program continues after potential KeyError.")
    
    # Example 5 (Intermediate): Empty class definition
    # Defining a class structure that will be filled in later.
    class UserProfile:
        # This class will hold user data and methods later.
        pass
    print("\nUserProfile class defined (currently empty).")
    # You can still create an instance, though it has no attributes/methods yet
    user = UserProfile()
    print(f"Created a UserProfile object: {user}")
    
    # Example 6 (Advanced): Conditional 'pass' to preserve flow
    # When you have a complex 'if-elif-else' and for certain branches,
    # you genuinely want no action, but need the structure.
    temperature = 22 # Celsius
    if temperature > 30:
        print("It's very hot.")
    elif temperature < 0:
        print("It's freezing cold.")
    elif 10 <= temperature <= 25:
        pass # Pleasant temperature range, no special message needed
    else:
        print("Temperature is outside the comfortable range.")
    print("Weather check complete.")
    
    # Example 7 (Advanced): Using pass in abstract methods (conceptual, for advanced OOP)
    # In Abstract Base Classes (ABCs), you might define abstract methods that must be
    # implemented by subclasses, but the parent method itself has no logic.
    from abc import ABC, abstractmethod
    
    class Shape(ABC):
        @abstractmethod
        def area(self):
            pass # Abstract method, must be implemented by concrete subclasses
    
        @abstractmethod
        def perimeter(self):
            pass # Abstract method, must be implemented by concrete subclasses
    
    class Circle(Shape):
        def __init__(self, radius):
            self.radius = radius
        def area(self):
            return 3.14159 * self.radius ** 2
        def perimeter(self):
            return 2 * 3.14159 * self.radius
    
    # This shows that 'pass' is used where an implementation is expected but not yet defined.
    # a_shape = Shape() # This would raise an error because Shape is abstract
    my_circle = Circle(5)
    print(f"\nCircle area: {my_circle.area():.2f}")
    print(f"Circle perimeter: {my_circle.perimeter():.2f}")
    
    • Explanation: The pass statement is a null operation in Python. It does nothing. It's used as a placeholder when the syntax requires a statement but you don't want any code to execute. This is common when you're defining a new function, class, or conditional block that you plan to implement later, or when you need to fulfill syntax requirements without adding any logic. It's often used during Python development for scaffolding.

    • Note: python pass keyword, do nothing in python, placeholder statement python, empty block python, python syntax placeholder.

    • Code Examples: