---
title: Functions and Code Reusability
date: 2026-01-03T17:57:28Z
modified: 2026-07-22T05:08:25Z
permalink: "https://www.micheledpierri.com/python/functions/"
type: page
status: publish
excerpt: ""
wpid: 2494
featured_image: "https://www.micheledpierri.com/wp-content/uploads/2026/01/Python_06.webp"
featured_image_alt: Children dressed in lab coats are studying a python
timestamp: 2026-07-22T05:08:25Z
tags: []
---

##  Lesson Objectives

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

- Define and call functions in Python
- Use parameters and return values correctly
- Understand variable scope (local vs global)
- Write reusable, testable code

This lesson is a **major turning point**:

functions are the foundation of _real_ analytical and machine learning code.

---

## 1️⃣ Why Functions Matter

Without functions, code becomes:

- repetitive
- hard to read
- difficult to debug
- impossible to scale

Functions allow you to:

- encapsulate logic
- reuse code
- express intent clearly

In data science, **every pipeline is a composition of functions**.

---

## 2️⃣ Defining a Function

Functions are defined using the `def` keyword.

def greet():
    print("Hello!")

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">greet</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Hello!</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

This code:

- defines a function called `greet`
- does not execute it

To run it:

greet()

```
<span class="line"><span style="color: #F8F8F2">greet()</span></span>
<span class="line"></span>
<span class="line"></span>
```

---

## 3️⃣ Functions with Parameters

Parameters allow functions to receive input.

def greet(name):
    print("Hello", name)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">greet</span><span style="color: #F8F8F2">(</span><span style="color: #FFB86C; font-style: italic">name</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Hello</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, name)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Calling the function:

greet("Michele")

```
<span class="line"><span style="color: #F8F8F2">greet(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Michele</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Output:

Hello Michele

```
<span class="line"><span style="color: #F8F8F2">Hello Michele</span></span>
<span class="line"></span>
<span class="line"></span>
```

Parameters make functions **flexible and reusable**.

---

## 4️⃣ Return Values

Functions can return values using `return`.

def square(x):
    return x * x

```
<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"> x</span></span>
<span class="line"></span>
<span class="line"></span>
```

Using the returned value:

result = square(4)
print(result)

```
<span class="line"><span style="color: #F8F8F2">result </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> square(</span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">)</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(result)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Output:

16

```
<span class="line"><span style="color: #BD93F9">16</span></span>
<span class="line"></span>
<span class="line"></span>
```

Key rule:

> return sends data back to the caller and stops the function.

---

## 5️⃣ `print` vs `return` (Critical Distinction)

def f1(x):
    print(x * 2)

def f2(x):
    return x * 2

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">f1</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: #8BE9FD">print</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 style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">f2</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>
```

- `f1` **shows** a value
- `f2` **produces** a value

In analytical code:

- almost always prefer `return`
- `print` is for debugging only

---

## 6️⃣ Multiple Parameters

Functions can accept multiple parameters.

def add(a, b):
    return a + b

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">add</span><span style="color: #F8F8F2">(</span><span style="color: #FFB86C; font-style: italic">a</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">b</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"> a </span><span style="color: #FF79C6">+</span><span style="color: #F8F8F2"> b</span></span>
<span class="line"></span>
<span class="line"></span>
```

add(3, 5)

```
<span class="line"><span style="color: #F8F8F2">add(</span><span style="color: #BD93F9">3</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>
```

Parameter order matters unless specified explicitly.

---

## 7️⃣ Variable Scope (Local vs Global)

Variables defined inside a function are **local**.

def test():
    x = 10
    print(x)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">test</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    x </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">10</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(x)</span></span>
<span class="line"></span>
<span class="line"></span>
```

test()
print(x)   # ERROR

```
<span class="line"><span style="color: #F8F8F2">test()</span></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(x)   </span><span style="color: #6272A4"># ERROR</span></span>
<span class="line"></span>
<span class="line"></span>
```

Why this matters:

- avoids accidental overwrites
- improves code safety

Rule:

> Analytical functions should avoid global variables.

---

## 8️⃣ Functions in Data Analysis

Functions are used to:

- preprocess data
- compute statistics
- transform variables
- evaluate models

Example:

def mean(a, b):
    return (a + b) / 2

```
<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: #FFB86C; font-style: italic">a</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">b</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"> (a </span><span style="color: #FF79C6">+</span><span style="color: #F8F8F2"> b) </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>
```

This pattern scales naturally to vectors and datasets.

---

## 9️⃣ Writing Good Functions (Best Practices)

A good function:

- does one thing
- has a clear name
- returns a value
- avoids side effects

Bad function:

def process(x):
    print(x + 1)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">process</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: #8BE9FD">print</span><span style="color: #F8F8F2">(x </span><span style="color: #FF79C6">+</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

Better:

def increment(x):
    return x + 1

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">increment</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">1</span></span>
<span class="line"></span>
<span class="line"></span>
```

---

## FAQ — Frequently Asked Questions

**Q: Can a function return multiple values?**

A: Yes, using tuples (we’ll cover this later).

**Q: Can functions call other functions?**

A: Yes. This is how pipelines are built.

**Q: Should functions be short?**

A: Yes. Long functions usually hide multiple responsibilities.

**Q: Why avoid global variables?**

A: They make code unpredictable and hard to debug.

---

## Exercises

### Exercise 1

Write a function that prints `"Hello World"`.

### Exercise 2

Write a function that takes a name and prints a greeting.

### Exercise 3

Write a function that returns the square of a number.

### Exercise 4

Write a function that adds two numbers.

### Exercise 5

Store the result of a function call in a variable.

### Exercise 6

Predict the output:

def f(x):
    return x + 1

print(f(2))

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">f</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">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(f(</span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">))</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 7

Explain the difference between `print` and `return`.

### Exercise 8

Write a function that computes the mean of two numbers.

### Exercise 9

Why is this bad practice?

total = 0
def add_to_total(x):
    global total
    total += x

```
<span class="line"><span style="color: #F8F8F2">total </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span></span>
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">add_to_total</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">global</span><span style="color: #F8F8F2"> total</span></span>
<span class="line"><span style="color: #F8F8F2">    total </span><span style="color: #FF79C6">+=</span><span style="color: #F8F8F2"> x</span></span>
<span class="line"></span>
<span class="line"></span>
```

### Exercise 10

Rewrite Exercise 9 using a proper function.

---

## Solutions

## Exercise 1

def hello():
    print("Hello World")

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">hello</span><span style="color: #F8F8F2">():</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Hello World</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Exercise 2

def greet(name):
    print("Hello", name)

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">greet</span><span style="color: #F8F8F2">(</span><span style="color: #FFB86C; font-style: italic">name</span><span style="color: #F8F8F2">):</span></span>
<span class="line"><span style="color: #F8F8F2">    </span><span style="color: #8BE9FD">print</span><span style="color: #F8F8F2">(</span><span style="color: #E9F284">"</span><span style="color: #F1FA8C">Hello</span><span style="color: #E9F284">"</span><span style="color: #F8F8F2">, name)</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Exercise 3

def square(x):
    return x * x

```
<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"> x</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Exercise 4

def add(a, b):
    return a + b

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">add</span><span style="color: #F8F8F2">(</span><span style="color: #FFB86C; font-style: italic">a</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">b</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"> a </span><span style="color: #FF79C6">+</span><span style="color: #F8F8F2"> b</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Exercise 5

result = square(5)

```
<span class="line"><span style="color: #F8F8F2">result </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> square(</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">)</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Exercise 6

# Output: 3

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

## Exercise 7

# print shows output, return provides a value to use

```
<span class="line"><span style="color: #6272A4"># print shows output, return provides a value to use</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Exercise 8

def mean(a, b):
    return (a + b) / 2

```
<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: #FFB86C; font-style: italic">a</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">b</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"> (a </span><span style="color: #FF79C6">+</span><span style="color: #F8F8F2"> b) </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>
```

## Exercise 9

# Uses global state, unpredictable behavior

```
<span class="line"><span style="color: #6272A4"># Uses global state, unpredictable behavior</span></span>
<span class="line"></span>
<span class="line"></span>
```

## Exercise 10

def add(x, y):
    return x + y

```
<span class="line"><span style="color: #FF79C6">def</span><span style="color: #F8F8F2"> </span><span style="color: #50FA7B">add</span><span style="color: #F8F8F2">(</span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F8F8F2">, </span><span style="color: #FFB86C; font-style: italic">y</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"> y</span></span>
<span class="line"></span>
<span class="line"></span>
```

---

## Next Lesson Preview

In **Lesson 7**, we will cover:

- lists
- tuples
- sets
- dictionaries

## These data structures are the **bridge between basic Python and real-world data manipulation**.