Guide to Python’s Switch Case Statement

Learn how to handle conditional logic using Python’s match case statement.

Introduction to Conditional Logic in Python

In programming, handling multiple conditional statements effectively is key to writing clean and maintainable code. Languages like C, Java, and Go achieve this through the switch-case statement, which offers a structured way of handling different conditions.

However, Python initially relied on the if-elif-else construct for conditional logic, which can result in less readable code, especially when dealing with complex conditions.

In Python 3.10, the introduction of the match-case statement made handling conditional logic much more elegant, expressive, and Pythonic. The match-case statement helps improve code readability and maintainability, offering a more concise solution to the issues faced with if-elif-else constructs.

With the if-elif-else construct, conditions are checked in sequence. The first condition to evaluate as true is executed. If no conditions evaluate to True, the else block is executed, if it exists.

Here’s the syntax demonstrating this logic:

if condition1:
# Code to be executed if condition1 is True
elif condition2:
# Code to be executed if condition2 is True
elif condition3:
# Code to be executed if condition3 is True
else:
# Code to execute if none of the above conditions are True

As an example, consider a scenario where we’re verifying user commands. We can use if-elif-else to determine which action should be taken based on the input:

user_input = input("Enter a command: ")
if user_input == "start":
print("Starting the process.")
elif user_input == "stop":
print("Stopping the process.")
elif user_input == "pause":
print("Pausing the process.")
else:
print("Invalid command.")

Here, the program asks the user to “Enter a command.”

Depending on the user’s input, the code prints “start,” “stop,” or “pause.” If an input is not detected, the default message is “Invalid command.”

If the user enters the command start the output will be:

Enter a command: start
Starting the process.

Long chains of if-elif-else can become difficult to follow as complexity increases, reducing readability and making maintenance more challenging due to the need for widespread adjustments. Here’s where match-case is helpful, offering a cleaner and more efficient way to handle scenarios like this.

Understanding the Syntax of Python match-case

Python’s match-case statement was introduced in Python version 3.10, enabling clean and efficient handling of conditional logic. The match-case statement replaces long if-elif-else constructs and allows developers to match values or structures against a specific pattern using a _ wildcard for unmatched cases. This feature significantly improves code readability, maintainability, and versatility. Here’s the syntax to understand the match-case statement in Python:

match expression: 

    case pattern1: 

        # Code block for pattern1 

    case pattern2: 

        # Code block for pattern2 

    case patternN: 

        # Code block for patternN 

    case _: 

        # Default code block (optional) 

Key Components of match-case:

  • match: The starting point of the statement that evaluates a variable or expression and checks it against the patterns in the case blocks.
  • case: Defines a pattern to match the value, executing the corresponding code block if a match is found.
  • Wildcard(_): The default case handles unmatched patterns, similar to the else block in if-elif-else.

The match-case statement supports nesting, which means we can place match-case statements within individual cases. This feature enables the handling of more complex and hierarchical logic, making it easier to manage intricate conditions while keeping the code clean and readable.

Here is an example that defines a function, process_command(), that takes a command as input and uses the match-case statement to evaluate it.

def process_command(command):
match command:
case "start":
print("Starting the process.")
case "stop":
print("Stopping the process.")
case "pause":
print("Pausing the process.")
case _:
print("Invalid command.")
command = input("Enter a command: ")
process_command(command)
  • If the command is “start”, it prints “Starting the process.”
  • If the command is “stop”, it prints “Stopping the process.”
  • If the command is “pause” it prints “Pausing the process.”
  • If the command doesn’t match any of the predefined cases, the wildcard _ is used to catch all the other commands, printing “Invalid command.”

When the user enters the command pause at the prompt, the code produces the following output:

Enter a command: pause
Pausing the process.

Using Python match-case statements with Constants

The simplest implementation of match-case involves matching constants. Here’s an example that maps day_ numbers to day_ names:

def get_day_name(day_number):
match day_number:
case 1:
return "Monday"
case 2:
return "Tuesday"
case 3:
return "Wednesday"
case 4:
return "Thursday"
case 5:
return "Friday"
case 6:
return "Saturday"
case 7:
return "Sunday"
case _:
return "Invalid day number"
# Example usage
print(get_day_name(1))
print(get_day_name(5))
print(get_day_name(9))

The output of the get_day_name() function is as follows:

  • For day number 1, the output is: Monday
  • For day number 5, the output is: Friday
  • For day number 9, the output is: Invalid day number
Monday
Friday
Invalid day number

Using Python match-case Statement with the OR Operator

In scenarios where handling multiple values individually results in repetitive code, the match-case statement offers a concise and efficient solution. If developers encounter values that need the same treatment, they can group them in one case using the OR operator (|), making the code more efficient, streamlined, and readable.

Now, let’s apply this concept with an example where we classify days of the week as weekdays or weekends using the match-case statement and the OR operator:

def get_day_type(day):
match day:
# Match weekdays
case "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday":
return "Weekday"
case "Saturday" | "Sunday":
# Match weekends
return "Weekend"
case _:
# Default case for invalid input
return "Invalid day"
# Example usage
print(get_day_type("Monday"))
print(get_day_type("Sunday"))
print(get_day_type("Holiday"))

The output will be:

Weekday
Weekend
Invalid day

Applications of Python Switch Statement

The match-case statement simplifies handling complex conditional logic in a way that is structured and readable. Such statements are exceptionally good for handling multiple conditions or data structures and are perfect for controlling multiple conditions or data structures, they can help manage decision trees.

Here are some key advantages of using the match-case statement in Python to enhance code readability and efficiency:

  • Controlling Multiple Conditions: When we deal with multiple conditions, match-case is a very concise and readable solution. It helps avoid long chains of if-elif-else, making the code easier to understand and maintain.
  • Handling Specific Patterns in Data Structures: match-case simplifies handling complex data structures like dictionaries, lists, and tuples by directly matching specific patterns, making the code cleaner and more efficient.
  • Simplifying Complex Decision Trees: match-case simplifies nested decision logic, especially for hierarchical conditions or scenarios with multiple patterns.

Limitations of Python Switch Statement

Although match-case has many advantages, there are situations where it might not be the ideal solution:

  • Performance on Large Datasets: For situations involving large datasets, match-case might not always be the optimal choice. Its sequential pattern evaluation can lead to performance bottlenecks, where traditional structures like if-elif-else or hash-based lookups (e.g., dictionaries) may perform better.
  • Not a universal fit: While match-case excels in handling structured and hierarchical data. For less complex scenarios, if-elif-else constructs are often more concise and intuitive.
  • Readability Trade-Offs in Complex Patterns: Overly intricate or deeply nested patterns in match-case can reduce readability, especially for developers who are unfamiliar with this construct.

Following these best practices and keeping its limitations in mind, we can make good use of Python’s match-case statement. Although it does enhance the readability and structure of code, proper usage is necessary.

Conclusion

In this article, we explored the modern and structured way of using Python’s match-case statement and how it handles conditional logic. We walked through its syntax, key components, and some practical applications that illustrate how it makes complicated decision-making easier and improves code readability by using pattern matching effectively. match-case provides a versatile tool for managing various scenarios, from handling data structures to replacing traditional if-elif-else chains.

For further insights into Python programming and advanced techniques, explore Codecademy’s Learn intermediate Python 3 course.

Author

Codecademy Team

'The Codecademy Team, composed of experienced educators and tech experts, is dedicated to making tech skills accessible to all. We empower learners worldwide with expert-reviewed content that develops and enhances the technical skills needed to advance and succeed in their careers.'

Meet the full team