A decision-making structure is a programming construct that evaluates one or more conditions and determines which block of code to execute based on the outcome of those conditions.
In Python, these structures implement logic, make decisions, and create dynamic applications. Choosing the right structure can optimize code while using the wrong one might complicate things unnecessarily.
This article will explore Python’s decision-making tools, when to use them, and when it’s better to opt for alternatives.
1. The if-elif-else Statement
The if-elif-else
structure is the most common decision-making tool in Python. It evaluates conditions sequentially and executes the first block that evaluates to True
.
Syntax and Example
Here is an example:
def determine_grade(score):
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
elif score >= 60:
return "D"
else:
return "F"
# Test the function
print(determine_grade(85)) # Output: B
When to Use if-elif-else
- When evaluating multiple conditions.
- When the conditions are ordered or depend on precedence (e.g., greater than 90, then greater than 80).
- Works well when dealing with dynamic or unknown values where conditions cannot be mapped in advance.
When Not to Use if-elif-else
- If the code has too many branches, the structure becomes hard to read. In such cases, consider a lookup table (dictionary) or Python’s
match-case
. - Not ideal for predefined, known values since other structures like dictionaries are more efficient.
2. The match-case Statement
Introduced in Python 3.10, match-case
is a cleaner alternative to multiple if-elif
statements. It works similarly to a “switch-case” structure found in other languages.
Syntax and Example
Below is an example:
def handle_command(command):
match command:
case "start":
print("Starting the process...")
case "stop":
print("Stopping the process...")
case "pause":
print("Pausing the process...")
case _: # Default case
print("Unknown command.")
# Test the function
handle_command("start") # Output: Starting the process...
When to Use match-case
- When you have known values to check against a single variable.
- When the
if-elif
chain is getting too long and repetitive. - When you need a default fallback case.
When Not to Use match-case
- If you are using Python versions earlier than 3.10.
- When you need complex condition evaluations (like
score > 90
).match-case
works best with simple, direct matches to known values. - Not ideal for unknown or dynamic inputs where values cannot be predicted.
3. Ternary (Conditional) Operator
A ternary operator is a one-liner decision-making structure. It simplifies if-else
statements when there are only two possible outcomes.
Syntax and Example
Here is an example:
def is_even(number):
return "Even" if number % 2 == 0 else "Odd"
# Test the function
print(is_even(4)) # Output: Even
print(is_even(7)) # Output: Odd
When to Use the Ternary Operator
- When you need a quick and simple
if-else
decision. - When the logic fits neatly on a single line.
- Works well with known values or direct comparisons.
When Not to Use the Ternary Operator
- Avoid it for complex or multi-line logic; it hurts readability.
- If outcomes depend on unknown conditions or require significant computation.
4. Dictionary Lookup for Decisions
Sometimes, instead of if-elif-else
, a dictionary can be used for cleaner decision-making. This is particularly useful when mapping values directly to specific outcomes or actions.
Syntax and Example
Here is an example:
def handle_error(code):
error_messages = {
404: "Not Found",
500: "Internal Server Error",
403: "Forbidden",
}
return error_messages.get(code, "Unknown Error")
# Test the function
print(handle_error(404)) # Output: Not Found
print(handle_error(123)) # Output: Unknown Error
When to Use a Dictionary Lookup
- When each condition corresponds to a known value (like error codes).
- When performance is a priority. Dictionaries are faster than sequential
if-elif
checks.
When Not to Use a Dictionary Lookup
- If conditions involve complex logic (like mathematical comparisons).
- When you are working with unknown or dynamic inputs.
5. Using lambda
and Functional Approaches
Python also allows decision-making using lambda
functions and functional tools like map()
, filter()
, and reduce()
.
Syntax and Example
Here’s an example:
people = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 15},
{"name": "Charlie", "age": 30}
]
# Filter adults using a lambda function
adults = list(filter(lambda person: person["age"] >= 18, people))
print(adults)
When to Use Functional Approaches
- When working with collections of data that need filtering or transformation.
- When the logic is simple enough to write in a single line.
When Not to Use Functional Approaches
- Avoid them when the logic becomes too complex, as it can hurt code readability.
Choosing the Right Decision-Making Structure
When deciding which structure to use, consider:
- Known vs Unknown Values:
- Use dictionary lookups or
match-case
for known, predefined values. - Use if-elif-else when dealing with unknown or dynamic conditions.
- Simplicity: If the logic can be expressed in one or two lines, use a ternary operator or dictionary lookup.
- Readability: For complex conditions, stick to
if-elif-else
ormatch-case
. - Performance: If performance is critical and the conditions are direct, use a dictionary lookup.
- Python Version: Remember that
match-case
requires Python 3.10 or newer.
Thank you for reading this article. I hope you found it helpful and informative. If you have any questions, or if you would like to suggest new Python code examples or topics for future tutorials, please feel free to reach out. Your feedback and suggestions are always welcome!
Happy coding!
C. C. Python Programming
You can also find this article at Medium.com