---
title: "Intermediate Python: Writing Clean, Pythonic Code"
date: 2026-01-03T18:31:12Z
modified: 2026-01-04T19:50:10Z
permalink: "https://www.micheledpierri.com/python/intermediate/"
type: page
status: publish
excerpt: ""
wpid: 2517
featured_image: "https://www.micheledpierri.com/wp-content/uploads/2026/01/Python_11.webp"
featured_image_alt: Children dressed in lab coats are studying a python
timestamp: 2026-01-04T19:50:10Z
tags: []
---

##  Lesson Objectives

By the end of this lesson, you will be able to:

- Write concise and readable Python code
- Use list comprehensions instead of verbose loops
- Understand and apply lambda functions
- Use `args` and `*kwargs` to write flexible functions
- Recognize what “Pythonic” code means in practice

This lesson completes the transition:

**from writing Python that works to writing Python that is clean, expressive, and scalable**.

---

## 1️⃣ What Does “Pythonic” Mean

“Pythonic” code is:

- readable
- concise
- explicit
- idiomatic

Python favors **clarity over cleverness**.

Rule of thumb:

> If code is hard to read, it is probably not Pythonic.

---

## 2️⃣ List Comprehensions

List comprehensions provide a compact syntax for creating lists.

### Classic Loop

squares = []
for x in range(5):
    squares.append(x ** 2)

```
<span class="line"><span style="color: #F8F8F2">squares </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> []</span></span>
<span class="line"><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">range</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    squares.append(x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### List Comprehension

squares = [x ** 2 for x in range(5)]

```
<span class="line"><span style="color: #F8F8F2">squares </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">range</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">)]</span></span>
<span class="line"></span>
<span class="line"></span>
```

Same result, clearer intent.

### With Conditions

even_numbers = [x for x in range(10) if x % 2 == 0]

```
<span class="line"><span style="color: #F8F8F2">even_numbers </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [x </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">range</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9">10</span><span style="color: #F8F8F2">) </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">%</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">==</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"></span>
```

This pattern is ubiquitous in data preprocessing.

---

## 3️⃣ Why List Comprehensions Matter in Data Analysis

They allow you to:

- transform data cleanly
- filter observations
- express logic in one readable line

They also reduce boilerplate and error-prone code.

---

## 4️⃣ Lambda Functions

Lambda functions are **anonymous, one-line functions**.

### Standard Function

def square(x):
    return x ** 2

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">square</span><span style="color: #F8F8F2">(</span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Lambda Version

square = lambda x: x ** 2

```
<span class="line"><span style="color: #F8F8F2">square </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">lambda</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">: x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span></span>
<span class="line"></span>
<span class="line"></span>
```

Use lambdas when:

- logic is simple
- function is used briefly

Avoid lambdas for complex logic.

---

## 5️⃣ Lambdas in Practice

Common use case: transformation functions.

values = [1, 2, 3]
squared = list(map(lambda x: x ** 2, values))

```
<span class="line"><span style="color: #F8F8F2">values </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">squared </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">list</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD">map</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">lambda</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">: x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, values))</span></span>
<span class="line"></span>
<span class="line"></span>
```

Later, this idea appears in:

- `pandas.apply`
- feature transformations
- model pipelines

---

## 6️⃣ `args`: Variable Positional Arguments

- `args` allows functions to accept **any number of positional arguments**.

def add_all(*args):
    return sum(args)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">add_all</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">*</span><span style="color: #FFB86C; font-style: italic">args</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">sum</span><span style="color: #F8F8F2">(args)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Usage:

add_all(1, 2, 3, 4)

```
<span class="line"><span style="color: #F8F8F2">add_all(</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

This increases flexibility without sacrificing clarity.

---

## 7️⃣ `*kwargs`: Variable Keyword Arguments

- `*kwargs` allows functions to accept **named arguments**.

def describe_person(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">describe_person</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">**</span><span style="color: #FFB86C; font-style: italic">kwargs</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> key, value </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> kwargs.items():</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(key, value)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Usage:

describe_person(name="Michele", age=40)

```
<span class="line"><span style="color: #F8F8F2">describe_person(</span><span style="color: #FFB86C; font-style: italic">name</span><span style="color: #FF79C6">=</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Michele</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">age</span><span style="color: #FF79C6">=</span><span style="color: #BD93F9">40</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

This is extremely common in libraries and frameworks.

---

## 8️⃣ Why `args` and `*kwargs` Matter

They allow you to:

- write extensible APIs
- forward arguments
- build configurable functions

In machine learning libraries, almost everything relies on them.

---

## 9️⃣ Putting It All Together

Example combining multiple concepts:

def transform(values, func):
    return [func(x) for x in values]

transform([1, 2, 3], lambda x: x * 2)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">transform</span><span style="color: #F8F8F2">(</span><span style="color: #FFB86C; font-style: italic">values</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">func</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> [func(x) </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> values]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">transform([</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">], </span><span style="color: #FF79C6">lambda</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">: x </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

This is a **functional programming pattern** that appears constantly in data science.

---

## FAQ — Frequently Asked Questions

**Q: Are list comprehensions always better than loops?**

A: No. Use them when they improve readability.

**Q: Are lambda functions faster?**

A: No. They are about conciseness, not speed.

**Q: Is `*args` required?**

A: No, but it makes functions more flexible.

**Q: What is the biggest Python mistake at this stage?**

A: Writing overly clever code that nobody can read.

---

## Exercises

### Exercise 1

Create a list of squares from 0 to 9 using a list comprehension.

### Exercise 2

Create a list of odd numbers from 0 to 20.

### Exercise 3

Rewrite a `for` loop as a list comprehension.

### Exercise 4

Write a lambda function that cubes a number.

### Exercise 5

Use `map` with a lambda to double values in a list.

### Exercise 6

Write a function using `*args` that computes the mean.

### Exercise 7

Write a function using `**kwargs` that prints key-value pairs.

### Exercise 8

Predict the output:

f = lambda x: x + 1
print(f(3))

```
<span class="line"><span style="color: #F8F8F2">f </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">lambda</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">: x </span><span style="color: #FF79C6">+</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">1</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(f(</span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 9

Explain when lambda functions should be avoided.

### Exercise 10

Explain what “Pythonic” code means.

---

## Solutions

### Exercise 1

squares = [x ** 2 for x in range(10)]

```
<span class="line"><span style="color: #F8F8F2">squares </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">range</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9">10</span><span style="color: #F8F8F2">)]</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 2

odds = [x for x in range(21) if x % 2 != 0]

```
<span class="line"><span style="color: #F8F8F2">odds </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [x </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">range</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9">21</span><span style="color: #F8F8F2">) </span><span style="color: #FF79C6">if</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">%</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">!=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 3

# Loop version
# squares = []
# for x in range(5):
#     squares.append(x ** 2)

# Comprehension
squares = [x ** 2 for x in range(5)]

```
<span class="line"><span style="color: #6272A4"># Loop version</span></span>
<span class="line"><span style="color: #6272A4"># squares = []</span></span>
<span class="line"><span style="color: #6272A4"># for x in range(5):</span></span>
<span class="line"><span style="color: #6272A4">#     squares.append(x ** 2)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># Comprehension</span></span>
<span class="line"><span style="color: #F8F8F2">squares </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> x </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">range</span><span style="color: #F8F8F2">(</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">)]</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 4

cube = lambda x: x ** 3

```
<span class="line"><span style="color: #F8F8F2">cube </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">lambda</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">: x </span><span style="color: #FF79C6">**</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">3</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 5

values = [1, 2, 3]
doubled = list(map(lambda x: x * 2, values))

```
<span class="line"><span style="color: #F8F8F2">values </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">]</span></span>
<span class="line"><span style="color: #F8F8F2">doubled </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">list</span><span style="color: #F8F8F2">(</span><span style="color: #8BE9FD">map</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">lambda</span><span style="color: #F8F8F2"> </span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">: x </span><span style="color: #FF79C6">*</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, values))</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 6

def mean(*args):
    return sum(args) / len(args)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">mean</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">*</span><span style="color: #FFB86C; font-style: italic">args</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">return</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">sum</span><span style="color: #F8F8F2">(args) </span><span style="color: #FF79C6">/</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">len</span><span style="color: #F8F8F2">(args)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 7

def show(**kwargs):
    for k, v in kwargs.items():
        print(k, v)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">show</span><span style="color: #F8F8F2">(</span><span style="color: #FF79C6">**</span><span style="color: #FFB86C; font-style: italic">kwargs</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #FF79C6">for</span><span style="color: #F8F8F2"> k, v </span><span style="color: #FF79C6">in</span><span style="color: #F8F8F2"> kwargs.items():</span></span>
<span class="line"><span style="color: #F8F8F2">        </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(k, v)</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 8

# Output: 4

```
<span class="line"><span style="color: #6272A4"># Output: 4</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 9

# When logic becomes complex or hard to read

```
<span class="line"><span style="color: #6272A4"># When logic becomes complex or hard to read</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 10

# Pythonic code is readable, explicit, and idiomatic

```
<span class="line"><span style="color: #6272A4"># Pythonic code is readable, explicit, and idiomatic</span></span>
<span class="line"></span>
<span class="line"></span>
```

---

## Course Wrap-Up

You now have:

- a solid Python foundation
- the ability to read and write clean code
- the conceptual tools required for: 
    - statistics
    - data analysis
    - machine learning

## From here on, Python stops being the subject and becomes **the instrument**.