Python coding
53 subscribers
24 files
11 links
​A technical hub dedicated to Python programming, web development, and software engineering. Learn core syntax, build full-stack projects, and master backend development.
Download Telegram
πŸ“’ New Chapter Started

The lessons are finished.

Now we focus on what matters most:

Building.

Expect daily Python content:
βœ“ Projects
βœ“ Useful Scripts
βœ“ Coding Challenges
βœ“ AI Tools
βœ“ Python Tips
βœ“ Career Advice
βœ“ Advanced Concepts

Don't become someone who completed a course.

Become someone who uses what they learned.

Stay tuned.
🐍 Python Tip #1: List Comprehensions

List comprehensions allow you to create lists in a shorter and cleaner way.

Instead of:

numbers = []

for i in range(1, 6):
numbers.append(i)

print(numbers)

You can write:

numbers = [i for i in range(1, 6)]

print(numbers)

Output:

[1, 2, 3, 4, 5]

---

You can also perform operations while creating the list.

Example:

squares = [x**2 for x in range(1, 6)]

print(squares)

Output:

[1, 4, 9, 16, 25]

---

Using conditions:

even_numbers = [
x for x in range(1, 11)
if x % 2 == 0
]

print(even_numbers)

Output:

[2, 4, 6, 8, 10]

---

Why use list comprehensions?

βœ“ Cleaner code
βœ“ Fewer lines
βœ“ Faster execution
βœ“ Widely used in Data Science and AI

Challenge:

Create a list comprehension that generates:

[10, 20, 30, 40, 50]

without manually typing the numbers.
Python coding
🐍 Python Tip #1: List Comprehensions List comprehensions allow you to create lists in a shorter and cleaner way. Instead of: numbers = [] for i in range(1, 6): numbers.append(i) print(numbers) You can write: numbers = [i for i in range(1, 6)] print(numbers)…
πŸ’‘ Python Tip #2: The enumerate() Function

When looping through a list, you often need both the item's index and its value.

Instead of writing:

fruits = ["Apple", "Banana", "Orange"]

for i in range(len(fruits)):
print(i, fruits[i])

You can use enumerate():

fruits = ["Apple", "Banana", "Orange"]

for index, fruit in enumerate(fruits):
print(index, fruit)

Output:

0 Apple
1 Banana
2 Orange

---

Starting the Index from a Different Number

By default, enumerate() starts counting from 0.

You can change the starting number:

fruits = ["Apple", "Banana", "Orange"]

for index, fruit in enumerate(fruits, start=1):
print(index, fruit)

Output:

1 Apple
2 Banana
3 Orange

---

Why use enumerate()?

βœ“ Cleaner and more readable code
βœ“ No need to manually manage indexes
βœ“ Reduces common indexing mistakes
βœ“ Frequently used in real-world Python projects

---

Challenge:

Without using range(len()), print the following output using enumerate():

Student 1: Ahmed
Student 2: Sara
Student 3: John

using this list:

students = ["Ahmed", "Sara", "John"]
Python coding
πŸ’‘ Python Tip #2: The enumerate() Function When looping through a list, you often need both the item's index and its value. Instead of writing: fruits = ["Apple", "Banana", "Orange"] for i in range(len(fruits)): print(i, fruits[i]) You can use enumerate():…
πŸ”₯ Python Trick #3: Multiple Variable Assignment

Python allows you to assign multiple variables in a single line.

Instead of:

name = "Yehya"
age = 16
country = "Ethiopia"

You can write:

name, age, country = "Yehya", 16, "Ethiopia"

---

You can also assign the same value to multiple variables.

Example:

x = 0
y = 0
z = 0

Simplified:

x = y = z = 0

---

Unpacking a Collection

Python can unpack a list or tuple directly into variables.

Example:

languages = ["Python", "Java", "C++"]

first, second, third = languages

print(first)
print(second)
print(third)

Output:

Python
Java
C++

---

Ignoring Values

If you only need some values, use _ for the ones you don't care about.

Example:

numbers = (10, 20, 30)

first, _, third = numbers

print(first)
print(third)

Output:

10
30

---

Why use multiple assignment?

βœ“ Cleaner code
βœ“ Less typing
βœ“ Easier to read
βœ“ Commonly used in professional Python code

---

Challenge:

Without creating temporary variables, write Python code that swaps the values of:

a = 15
b = 40

so the final output becomes:

a = 40
b = 15
Python coding
πŸ”₯ Python Trick #3: Multiple Variable Assignment Python allows you to assign multiple variables in a single line. Instead of: name = "Yehya" age = 16 country = "Ethiopia" You can write: name, age, country = "Yehya", 16, "Ethiopia" --- You can also assign…
🐍 Python Tip #4: The zip() Function

The zip() function combines two or more iterables element by element.

Example:

names = ["Ahmed", "Sara", "John"]
scores = [95, 88, 91]

for name, score in zip(names, scores):
print(name, score)

Output:

Ahmed 95
Sara 88
John 91

---

Using zip() with Three Lists

You can combine more than two lists.

Example:

names = ["Ahmed", "Sara", "John"]
ages = [18, 19, 20]
countries = ["Egypt", "Ethiopia", "Canada"]

for name, age, country in zip(names, ages, countries):
print(name, age, country)

Output:

Ahmed 18 Egypt
Sara 19 Ethiopia
John 20 Canada

---

Converting zip() to a List

The zip() function returns a zip object.

To see all paired values, convert it into a list.

Example:

letters = ["A", "B", "C"]
numbers = [1, 2, 3]

result = list(zip(letters, numbers))

print(result)

Output:

[('A', 1), ('B', 2), ('C', 3)]

---

Why use zip()?

βœ“ Iterate over multiple lists at the same time
βœ“ Write cleaner and shorter code
βœ“ Avoid manual indexing with range()
βœ“ Frequently used in data processing and automation

---

Challenge:

Using zip(), print the following output:

Ali scored 90
Sara scored 85
John scored 95

using these lists:

students = ["Ali", "Sara", "John"]
marks = [90, 85, 95]
Python coding
🐍 Python Tip #4: The zip() Function The zip() function combines two or more iterables element by element. Example: names = ["Ahmed", "Sara", "John"] scores = [95, 88, 91] for name, score in zip(names, scores): print(name, score) Output: Ahmed 95 Sara…
⚑ Python Tip #5: The any() and all() Functions

Python provides two useful built-in functions for checking multiple conditions: any() and all().

---

Using any()

The any() function returns True if at least one value is True.

Example:

values = [False, False, True]

print(any(values))

Output:

True

---

Using all()

The all() function returns True only if every value is True.

Example:

values = [True, True, True]

print(all(values))

Output:

True

---

Another Example

numbers = [10, 20, 30, 40]

print(all(num > 5 for num in numbers))

Output:

True

Since every number is greater than 5, all() returns True.

---

Example with any()

numbers = [10, 20, 30, 40]

print(any(num > 35 for num in numbers))

Output:

True

Only one number (40) is greater than 35, so any() returns True.

---

Why use any() and all()?

βœ“ Makes code shorter and cleaner
βœ“ Eliminates unnecessary loops
βœ“ Easy way to evaluate multiple conditions
βœ“ Commonly used in data validation and filtering

---

Challenge:

Given the list:

numbers = [12, 18, 25, 30]

1. Check if all numbers are even.
2. Check if any number is greater than 20.

Try solving it before running the code!
Python coding
⚑ Python Tip #5: The any() and all() Functions Python provides two useful built-in functions for checking multiple conditions: any() and all(). --- Using any() The any() function returns True if at least one value is True. Example: values = [False, False…
πŸš€ Python Tip #6: The *args and **kwargs Parameters

Sometimes you don't know how many arguments a function will receive.

Python provides *args and **kwargs to handle this flexibly.

---

Using *args

The *args parameter allows a function to accept any number of positional arguments.

Example:

def add_numbers(*args):
print(sum(args))

add_numbers(5, 10)
add_numbers(1, 2, 3, 4, 5)

Output:

15
15

---

Using **kwargs

The **kwargs parameter allows a function to accept any number of keyword arguments.

Example:

def student_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")

student_info(
name="Ahmed",
age=18,
country="Ethiopia"
)

Output:

name: Ahmed
age: 18
country: Ethiopia

---

Using Both Together

A function can use both *args and **kwargs.

Example:

def display(*args, **kwargs):
print(args)
print(kwargs)

display(
10,
20,
name="Sara",
age=19
)

Output:

(10, 20)
{'name': 'Sara', 'age': 19}

---

Why use *args and **kwargs?

βœ“ Accept a flexible number of arguments
βœ“ Build reusable functions
βœ“ Useful for libraries and frameworks
βœ“ Commonly used in Flask, Django, and AI libraries

---

Challenge:

Create a function called multiply() that accepts any number of numbers using *args and returns their product.

Example:

multiply(2, 3, 4)

Expected Output:

24
Python coding
πŸš€ Python Tip #6: The *args and **kwargs Parameters Sometimes you don't know how many arguments a function will receive. Python provides *args and **kwargs to handle this flexibly. --- Using *args The *args parameter allows a function to accept any number…
🐍 Python Tip #7: The enumerate() Function

When looping through a list, you sometimes need both the index and the value.

Instead of manually tracking the index, Python provides the enumerate() function.

---

Without enumerate()

fruits = ["Apple", "Banana", "Orange"]

index = 0

for fruit in fruits:
print(index, fruit)
index += 1

Output:

0 Apple
1 Banana
2 Orange

---

With enumerate()

fruits = ["Apple", "Banana", "Orange"]

for index, fruit in enumerate(fruits):
print(index, fruit)

Output:

0 Apple
1 Banana
2 Orange

---

Starting from a Different Number

You can choose where the counting begins.

Example:

fruits = ["Apple", "Banana", "Orange"]

for index, fruit in enumerate(fruits, start=1):
print(index, fruit)

Output:

1 Apple
2 Banana
3 Orange

---

Why use enumerate()?

βœ“ Cleaner code
βœ“ No need for a manual counter
βœ“ Easier to read and maintain
βœ“ Commonly used in Python projects

---

Challenge:

Using enumerate(), print the following output:

Question 1: What is Python?
Question 2: What is a List?
Question 3: What is a Dictionary?

using this list:

questions = [
"What is Python?",
"What is a List?",
"What is a Dictionary?"
]
Python coding
🐍 Python Tip #7: The enumerate() Function When looping through a list, you sometimes need both the index and the value. Instead of manually tracking the index, Python provides the enumerate() function. --- Without enumerate() fruits = ["Apple", "Banana"…
⚑ Python Tip #8: The sorted() Function

The sorted() function returns a new sorted list without modifying the original one.

---

Basic Example

numbers = [5, 2, 8, 1, 9]

result = sorted(numbers)

print(result)

Output:

[1, 2, 5, 8, 9]

The original list remains unchanged.

---

Sorting in Descending Order

Use the reverse=True parameter.

numbers = [5, 2, 8, 1, 9]

result = sorted(numbers, reverse=True)

print(result)

Output:

[9, 8, 5, 2, 1]

---

Sorting Strings

fruits = ["Orange", "Apple", "Banana", "Mango"]

print(sorted(fruits))

Output:

['Apple', 'Banana', 'Mango', 'Orange']

---

Difference Between sorted() and sort()

sorted()

numbers = [3, 1, 2]

new_numbers = sorted(numbers)

print(numbers)
print(new_numbers)

Output:

[3, 1, 2]
[1, 2, 3]

---

`list.sort()

``
python
numbers = [3, 1, 2]

numbers.sort()

print(numbers)

Output:

python
[1, 2, 3]

Unlike `sorted()`, the `sort()` method modifies the original list.

---

Why use `sorted()`?

βœ“ Keeps the original data unchanged
βœ“ Easy to sort numbers and strings
βœ“ Supports ascending and descending order
βœ“ Commonly used in data processing and reporting

---

Challenge:

Given the list:

python
scores = [88, 95, 72, 100, 67]
`

1. Print the scores in ascending order.
2. Print the scores in descending order.
3. Verify that the original list remains unchanged after using `sorted()`.
Python coding
⚑ Python Tip #8: The sorted() Function The sorted() function returns a new sorted list without modifying the original one. --- Basic Example numbers = [5, 2, 8, 1, 9] result = sorted(numbers) print(result) Output: [1, 2, 5, 8, 9] The original list remains…
πŸ’‘ Python Tip #9: Lambda Functions

A lambda function is a small anonymous function that can have any number of arguments but only one expression.

Lambda functions are useful when you need a simple function for a short period of time.

---

Basic Syntax

lambda arguments: expression

---

Example

Instead of writing:

def square(x):
return x ** 2

print(square(5))

You can write:

square = lambda x: x ** 2

print(square(5))

Output:

25

---

Multiple Arguments

Lambda functions can accept multiple arguments.

Example:

multiply = lambda a, b: a * b

print(multiply(6, 4))

Output:

24

---

Using lambda with sorted()

You can sort complex data using a custom key.

Example:

students = [
("Ali", 85),
("Sara", 95),
("John", 78)
]

result = sorted(
students,
key=lambda student: student[1]
)

print(result)

Output:

[('John', 78), ('Ali', 85), ('Sara', 95)]

---

Why use Lambda Functions?

βœ“ Write short functions quickly
βœ“ Useful with sorted(), map(), and filter()
βœ“ Makes code more concise
βœ“ Commonly used in data analysis and automation

---

Challenge:

Using a lambda function, create a function that returns the cube of a number.

Example:

cube = lambda x: x ** 3

print(cube(4))

Expected Output:

64
Python coding
πŸ’‘ Python Tip #9: Lambda Functions A lambda function is a small anonymous function that can have any number of arguments but only one expression. Lambda functions are useful when you need a simple function for a short period of time. --- Basic Syntax lambda…
πŸš€ Python Tip #10: The collections.Counter Class

Counting how many times items appear in a list is a common task.

Instead of writing loops manually, Python provides the Counter class from the collections module.

---

Importing Counter

from collections import Counter

---

Basic Example

from collections import Counter

fruits = [
"apple",
"banana",
"apple",
"orange",
"banana",
"apple"
]

count = Counter(fruits)

print(count)

Output:

Counter({
'apple': 3,
'banana': 2,
'orange': 1
})

---

Counting Characters

from collections import Counter

text = "programming"

count = Counter(text)

print(count)

Output:

Counter({
'g': 2,
'r': 2,
'm': 2,
'p': 1,
'o': 1,
'a': 1,
'i': 1,
'n': 1
})

---

Finding the Most Common Items

Use the most_common() method.

Example:

from collections import Counter

votes = [
"Python",
"Java",
"Python",
"C++",
"Python",
"Java"
]

count = Counter(votes)

print(count.most_common(1))

Output:

[('Python', 3)]

---

Why use Counter?

βœ“ Count items with a single line of code
βœ“ Find the most common elements quickly
βœ“ Useful for text analysis and data processing
βœ“ Frequently used in Data Science and Machine Learning

---

Challenge:

Given the following list:

numbers = [1, 2, 2, 3, 3, 3, 4, 4, 5]

1. Count how many times each number appears.
2. Print the most common number.
3. Which number appears exactly once?
Python coding
πŸš€ Python Tip #10: The collections.Counter Class Counting how many times items appear in a list is a common task. Instead of writing loops manually, Python provides the Counter class from the collections module. --- Importing Counter from collections import…
πŸ”₯ Python Tip #11: The setdefault() Dictionary Method

When working with dictionaries, you may need to access a key that doesn't exist.

Instead of checking if the key exists first, Python provides the setdefault() method.

---

Basic Example

student = {
"name": "Ahmed",
"age": 18
}

print(student.setdefault("age", 20))

Output:

18

Since `"age" already exists, its value remains unchanged.

---

Adding a New Key

If the key does not exist,
setdefault() creates it using the default value.

Example:

``
python
student = {
"name": "Ahmed"
}

student.setdefault("country", "Ethiopia")

print(student)

Output:

python
{
'name': 'Ahmed',
'country': 'Ethiopia'
}

---

Without `setdefault()`

python
if "country" not in student:
student["country"] = "Ethiopia"

---

With `setdefault()`

python
student.setdefault("country", "Ethiopia")

Both produce the same result, but `setdefault()` is shorter and cleaner.

---

Practical Example

Count words without worrying about missing keys.

python
words = ["apple", "banana", "apple"]

counts = {}

for word in words:
counts.setdefault(word, 0)
counts[word] += 1

print(counts)

Output:

python
{
'apple': 2,
'banana': 1
}

---

Why use `setdefault()`?

βœ“ Avoids `KeyError`
βœ“ Reduces repetitive code
βœ“ Automatically creates missing keys
βœ“ Useful when counting, grouping, or organizing data

---

Challenge:

Given the list:

python
cities = [
"Addis Ababa",
"Adama",
"Addis Ababa",
"Hawassa",
"Adama"
]
`

Use `setdefault()` to count how many times each city appears.
Python coding
πŸ”₯ Python Tip #11: The setdefault() Dictionary Method When working with dictionaries, you may need to access a key that doesn't exist. Instead of checking if the key exists first, Python provides the setdefault() method. --- Basic Example student = { …
🐍 Python Tip #12: The pathlib Module

Working with files and folders is a common task in Python.

Instead of using traditional string paths, Python provides the pathlib module, which offers a cleaner and more object-oriented approach.

---

Importing Path

from pathlib import Path

---

Creating a Path

from pathlib import Path

file = Path("notes.txt")

print(file)

Output:

notes.txt

---

Checking if a File Exists

from pathlib import Path

file = Path("notes.txt")

print(file.exists())

Output:

True

or

```python
False

depending on whether the file exists.

---

Getting File Information

python
from pathlib import Path

file = Path("report.pdf")

print(file.name)
print(file.stem)
print(file.suffix)

Output:

python
report.pdf
report
.pdf

---

Creating a Folder

python
from pathlib import Path

folder = Path("Projects")

folder.mkdir(exist_ok=True)

The `exist_ok=True` argument prevents an error if the folder already exists.

---

Joining Paths

Instead of writing:

python
path = "Projects/" + "Python/" + "main.py"

Use:

python
from pathlib import Path

path = Path("Projects") / "Python" / "main.py"

print(path)

Output:

python
Projects/Python/main.py

---

Why use `pathlib`?

βœ“ Cleaner and easier to read
βœ“ Works across Windows, Linux, and macOS
βœ“ Object-oriented design
βœ“ Recommended for modern Python projects

---

Challenge:

Create a program that:

1. Creates a folder named:

python
Python_Practice

2. Checks whether a file named:

python
notes.txt

exists inside that folder.

3. Prints:

text
File found

or

text
File not found
`

based on the result.
πŸ€”1
Python coding
🐍 Python Tip #12: The pathlib Module Working with files and folders is a common task in Python. Instead of using traditional string paths, Python provides the pathlib module, which offers a cleaner and more object-oriented approach. --- Importing Path…
πŸ§ͺ Python Tip #13: Using MagicMock for Testing

When writing unit tests, you don't always want to call real databases, APIs, or external services.

Instead, you can use MagicMock from Python's unittest.mock module to simulate their behavior.

---

Importing MagicMock

from unittest.mock import MagicMock

---

Why Use MagicMock?

Imagine you have a function that connects to a database.

In a real application, this function might:

- Take several seconds to execute
- Require an internet connection
- Access a real database
- Return different results each time

During testing, this is slow and unreliable.

---

Without MagicMock

def get_user_from_db(user_id):
# Slow database query
pass

user = get_user_from_db(1)

print(user)

This would execute the real database logic.

---

With MagicMock

from unittest.mock import MagicMock

def get_user_from_db(user_id):
# Slow database query
pass

get_user_from_db = MagicMock(
return_value={
"id": 1,
"name": "John Doe"
}
)

user = get_user_from_db(1)

print(user)

Output:

{'id': 1, 'name': 'John Doe'}

---

How It Works

MagicMock(return_value=...)

Creates a fake version of the function.

Whenever the function is called, it immediately returns the specified value instead of executing the original code.

---

Why use MagicMock?

βœ“ Makes tests run much faster
βœ“ No need for a real database or API
βœ“ Produces predictable results
βœ“ Essential for professional unit testing

---

Challenge:

Create a MagicMock that simulates a weather API and returns:

{
"city": "Addis Ababa",
"temperature": 22,
"condition": "Sunny"
}

Then print the returned dictionary.
Python coding
πŸ§ͺ Python Tip #13: Using MagicMock for Testing When writing unit tests, you don't always want to call real databases, APIs, or external services. Instead, you can use MagicMock from Python's unittest.mock module to simulate their behavior. --- Importing…
⚑ Python Tip #14: The Walrus Operator (:=)

Introduced in Python 3.8, the walrus operator allows you to assign a value to a variable as part of an expression.

This can make your code shorter and avoid repeating calculations.

---

Without the Walrus Operator

name = input("Enter your name: ")

while name != "exit":
print(f"Hello, {name}!")
name = input("Enter your name: ")

---

With the Walrus Operator

while (name := input("Enter your name: ")) != "exit":
print(f"Hello, {name}!")

The program behaves exactly the same but requires fewer lines of code.

---

Another Example

Without the walrus operator:

numbers = [5, 8, 12, 20]

length = len(numbers)

if length > 3:
print(f"The list contains {length} items.")

---

With the walrus operator:

numbers = [5, 8, 12, 20]

if (length := len(numbers)) > 3:
print(f"The list contains {length} items.")

---

When Should You Use It?

The walrus operator is useful when:

- A value is needed more than once
- You want to avoid repeating a function call
- You want cleaner and more efficient code

However, don't overuse it. Sometimes a normal assignment is easier to read.

---

Why use the Walrus Operator?

βœ“ Reduces repeated calculations
βœ“ Makes some loops cleaner
βœ“ Can improve performance in certain situations
βœ“ Useful in data processing and file handling

---

Challenge:

Using the walrus operator, write a program that repeatedly asks the user to enter a number until they type:

quit

Print each number entered before the program exits.
Python coding
⚑ Python Tip #14: The Walrus Operator (:=) Introduced in Python 3.8, the walrus operator allows you to assign a value to a variable as part of an expression. This can make your code shorter and avoid repeating calculations. --- Without the Walrus Operator…
πŸ’‘ Python Tip #15: The is vs == Operators

Many beginners confuse is and ==, but they have different purposes.

---

Using ==

The == operator checks whether two values are equal.

Example:

a = [1, 2, 3]
b = [1, 2, 3]

print(a == b)

Output:

True

Both lists contain the same values.

---

Using is

The is operator checks whether two variables refer to the exact same object in memory.

Example:

a = [1, 2, 3]
b = [1, 2, 3]

print(a is b)

Output:

False

Although the values are equal, they are stored as different objects.

---

Same Object Example

a = [1, 2, 3]
b = a

print(a is b)
print(a == b)

Output:

True
True

Both variables point to the same object.

---

Checking for None

The recommended way to check for None is with is.

Correct:

name = None

if name is None:
print("No name provided")

Avoid:

if name == None:
print("No name provided")

Using `is None is the Pythonic approach.

---

Why does this matter?

βœ“ Prevents subtle bugs
βœ“ Improves code readability
βœ“ Follows Python best practices
βœ“ Commonly used in professional Python projects

---

Challenge:

What will this code print?

``
python
x = [10, 20]
y = x
z = [10, 20]

print(x == z)
print(x is z)
print(x is y)
`

Try to predict the output before running the code.
Python coding
πŸ’‘ Python Tip #15: The is vs == Operators Many beginners confuse is and ==, but they have different purposes. --- Using == The == operator checks whether two values are equal. Example: a = [1, 2, 3] b = [1, 2, 3] print(a == b) Output: True Both lists…
πŸ”₯ Python Tip #16: The with Statement

When working with files, it's important to close them after you're done.

Python's with statement automatically handles this for you.

---

Without with

file = open("notes.txt", "r")

content = file.read()

print(content)

file.close()

If an error occurs before file.close(), the file may remain open.

---

With with

with open("notes.txt", "r") as file:
content = file.read()
print(content)

Once the block ends, Python automatically closes the file.

---

Writing to a File

with open("hello.txt", "w") as file:
file.write("Hello, Python!")

This creates the file if it doesn't exist, or overwrites it if it does.

---

Appending to a File

Use "a" mode to add new content without deleting the existing content.

with open("hello.txt", "a") as file:
file.write("\nWelcome back!")

---

Why use the with statement?

βœ“ Automatically closes files
βœ“ Prevents resource leaks
βœ“ Cleaner and more readable code
βœ“ Recommended for all file operations

---

Challenge:

Create a program that:

1. Creates a file named:

tasks.txt

2. Writes three tasks into the file.

3. Opens the same file and prints all its contents using the with statement.
Python coding
πŸ”₯ Python Tip #16: The with Statement When working with files, it's important to close them after you're done. Python's with statement automatically handles this for you. --- Without with file = open("notes.txt", "r") content = file.read() print(content)…
🎯 Python Tip #17: The match-case Statement

Introduced in Python 3.10, the match-case statement provides a cleaner alternative to long chains of if...elif...else.

It is similar to the "switch" statement found in many other programming languages.

---

Without match-case

day = 3

if day == 1:
print("Monday")
elif day == 2:
print("Tuesday")
elif day == 3:
print("Wednesday")
else:
print("Invalid day")

---

With match-case

day = 3

match day:
case 1:
print("Monday")
case 2:
print("Tuesday")
case 3:
print("Wednesday")
case _:
print("Invalid day")

Output:

Wednesday

---

Matching Strings

command = "start"

match command:
case "start":
print("Program started")
case "stop":
print("Program stopped")
case "restart":
print("Program restarted")
case _:
print("Unknown command")

---

The Wildcard _

The underscore (_) acts as the default case.

Example:

case _:
print("No match found")

It is equivalent to the else statement.

---

Why use match-case?

βœ“ Cleaner than multiple if...elif statements
βœ“ Easier to read and maintain
βœ“ Perfect for menus and command handling
βœ“ Great for pattern matching in modern Python

> Note: match-case is available only in Python 3.10 and later.

---

Challenge:

Write a program that asks the user to enter one of these commands:

add
remove
update
list

Use `match-case to print the corresponding action. If the command is not recognized, print:

``
text
Invalid command
`
Python coding
🎯 Python Tip #17: The match-case Statement Introduced in Python 3.10, the match-case statement provides a cleaner alternative to long chains of if...elif...else. It is similar to the "switch" statement found in many other programming languages. --- Without…
🐍 Python Tip #18: The for...else Statement

Most Python programmers know about if...else, but fewer know that loops can also have an else block.

The else block executes only if the loop finishes normally (without encountering a break).

---

Basic Example

for i in range(5):
print(i)
else:
print("Loop completed successfully!")

Output:

0
1
2
3
4
Loop completed successfully!

---

Using break

If the loop is interrupted with break, the else block will not execute.

Example:

for i in range(5):
if i == 3:
break
print(i)
else:
print("Loop completed successfully!")

Output:

0
1
2

Notice that "Loop completed successfully!" is never printed.

---

Searching Example

The for...else statement is especially useful when searching for an item.

numbers = [10, 20, 30, 40]

target = 25

for number in numbers:
if number == target:
print("Number found!")
break
else:
print("Number not found!")

Output:

Number not found!

---

When is for...else Useful?

βœ“ Searching for an item
βœ“ Validating data
βœ“ Avoiding extra boolean variables
βœ“ Writing cleaner search algorithms

---

Challenge:

Given the following list:

students = ["Ali", "Sara", "John", "Mariam"]

Search for:

"Ahmed"

If the student exists, print:

Student found!

Otherwise, use the else block to print:

Student not found!
Python coding
🐍 Python Tip #18: The for...else Statement Most Python programmers know about if...else, but fewer know that loops can also have an else block. The else block executes only if the loop finishes normally (without encountering a break). --- Basic Example…
πŸ’‘ Python Tip #19: The dict.get() Method

When accessing dictionary values, using square brackets ([]) can raise an error if the key doesn't exist.

Python provides the get() method as a safer alternative.

---

Using Square Brackets

student = {
"name": "Ali",
"age": 18
}

print(student["name"])

Output:

Ali

---

What Happens if the Key Doesn't Exist?

student = {
"name": "Ali"
}

print(student["country"])

Output:

KeyError: 'country'

The program stops because the key doesn't exist.

---

Using get()

student = {
"name": "Ali"
}

print(student.get("country"))

Output:

None

Instead of raising an error, get() returns None.

---

Providing a Default Value

You can specify a default value if the key is missing.

student = {
"name": "Ali"
}

print(student.get("country", "Unknown"))

Output:

Unknown

---

Practical Example

settings = {
"theme": "Dark"
}

theme = settings.get("theme", "Light")
language = settings.get("language", "English")

print(theme)
print(language)

Output:

Dark
English

---

Why use get()?

βœ“ Prevents KeyError
βœ“ Makes your code more reliable
βœ“ Allows default values
βœ“ Commonly used when working with JSON data and APIs

---

Challenge:

Given the dictionary:

book = {
"title": "Python Basics",
"author": "Yehya"
}

Use the get() method to print:

- The value of "title"
- The value of "price" (use "Not Available" as the default value)