AiTechWorlds
AiTechWorlds
Control flow is the set of statements — if, elif, else, match/case — that let a program choose which code runs based on a condition. Think of it like a fork in a hiking trail: the path (the outcome) depends entirely on which sign (condition) is true when you reach the junction.
Without control flow, code just executes line by line. With it, a program can make decisions, react to different inputs, and branch into completely different paths.
score = 78
if score >= 90:
print("Grade: A")
elif score >= 80:
print("Grade: B")
elif score >= 70:
print("Grade: C")
elif score >= 60:
print("Grade: D")
else:
print("Grade: F")
# Output: Grade: CPython uses indentation (4 spaces) to define blocks — no curly braces. This is not optional formatting; it's part of the syntax.
In Python, many values besides False are "falsy":
# These all evaluate to False:
bool(0) # False
bool(0.0) # False
bool("") # False — empty string
bool([]) # False — empty list
bool({}) # False — empty dict
bool(None) # False
# These all evaluate to True:
bool(1) # True
bool(-1) # True — any non-zero number
bool("hello") # True
bool([0]) # True — non-empty list (even if it contains 0)This means you can write very Pythonic conditions:
name = input("Enter your name: ")
# Instead of: if name != "":
if name:
print(f"Hello, {name}!")
else:
print("No name provided.")
# Instead of: if len(items) > 0:
items = []
if items:
print(f"Processing {len(items)} items")
else:
print("Nothing to process")# Comparison
x = 10
print(x > 5) # True
print(x == 10) # True
print(x != 5) # True
print(x >= 10) # True
# Logical operators
age = 25
has_id = True
if age >= 18 and has_id:
print("Entry allowed")
if age < 18 or not has_id:
print("Entry denied")
# Chaining comparisons (Python-specific, very readable)
temperature = 22
if 18 <= temperature <= 26:
print("Comfortable temperature")Python's one-line conditional:
# Syntax: value_if_true if condition else value_if_false
age = 20
status = "adult" if age >= 18 else "minor"
print(status) # "adult"
# Another example
score = 75
result = "pass" if score >= 60 else "fail"Use it sparingly — for simple cases only. If the logic is complex, use a regular if/else block for readability.
def classify_number(n):
if n > 0:
if n % 2 == 0:
return "positive even"
else:
return "positive odd"
elif n < 0:
return "negative"
else:
return "zero"
print(classify_number(4)) # positive even
print(classify_number(-3)) # negative
print(classify_number(0)) # zeroAvoid deep nesting — more than 2-3 levels makes code hard to read. Use early returns instead:
# Deeply nested — hard to read
def process_order(user, order):
if user is not None:
if user.is_active:
if order is not None:
if order.total > 0:
# actual logic...
return "processed"
# Better: early returns (guard clauses)
def process_order(user, order):
if user is None:
return "error: no user"
if not user.is_active:
return "error: inactive user"
if order is None:
return "error: no order"
if order.total <= 0:
return "error: invalid total"
# actual logic with no nesting
return "processed"Python's match/case is similar to switch statements in other languages but more powerful:
command = "quit"
match command:
case "quit":
print("Exiting...")
case "help":
print("Commands: quit, help, start")
case "start":
print("Starting application...")
case _: # _ is the default/wildcard
print(f"Unknown command: {command}")Match with patterns:
point = (0, 1)
match point:
case (0, 0):
print("Origin")
case (x, 0):
print(f"On x-axis at {x}")
case (0, y):
print(f"On y-axis at {y}")
case (x, y):
print(f"Point at ({x}, {y})")def authenticate(username, password, users_db):
"""Authenticate a user and return their role."""
# Guard clauses first
if not username or not password:
return None, "Username and password required"
if username not in users_db:
return None, "Invalid credentials" # Don't say "user not found" — security
user = users_db[username]
if not user['active']:
return None, "Account is disabled"
if user['password'] != hash_password(password):
return None, "Invalid credentials"
return user['role'], "Login successful"
users_db = {
"alice": {"password": "hashed_pw_1", "role": "admin", "active": True},
"bob": {"password": "hashed_pw_2", "role": "user", "active": True},
"carol": {"password": "hashed_pw_3", "role": "user", "active": False},
}
role, message = authenticate("alice", "correctpassword", users_db)
print(f"Role: {role}, Message: {message}")if name: not if name != "" — Pythonic truthiness checks are cleanerelif over nested if when conditions are mutually exclusiveif/else for anything elseNext lesson: Loops — mastering for, while, and Python's powerful comprehensions.
Get this course's notes on Telegram!
Free cheat sheets, summaries & practice exercises