Skip to main content

Function Return Values: The `return` Statement

In our last article, we learned how to define functions and pass information to them using **[parameters and arguments]**. So far, our functions have only performed actions, like printing to the console. But what if we need a function to give us a result back? This is where the return statement comes in, and it's a game-changer for writing powerful, modular code.


📚 Prerequisites

Ensure you are comfortable with the following before proceeding:

  • Defining a function using the def keyword.
  • Passing arguments to a function.
  • Basic Python data types (strings, numbers, booleans).

🎯 Article Outline: What You'll Master

In this article, you will learn:

  • The Core Purpose: Understand what the return statement does and why it's essential.
  • Getting Data Back: How to use return to get a value from a function and store it in a variable.
  • Returning Anything: See how functions can return any Python data type (numbers, strings, lists, dictionaries).
  • Multiple Return Values: A Pythonic way to return more than one value from a single function.
  • The Implicit None: What happens when a function has no return statement.
  • Early Returns: A common pattern for writing cleaner, more readable functions.

🧠 Section 1: What is a return Statement?

A return statement does two very important things:

  1. It immediately stops the execution of the function.
  2. It sends a value back to the place where the function was called.

Think of it like ordering a coffee. You (the caller) go to the barista (the function) and give them your order (the arguments). The barista makes the coffee. The return statement is the moment they hand you the finished drink. You can then take that coffee and do something with it (like store it in a variable).

Without a return statement, a function performs its task and then you walk away empty-handed.


💻 Section 2: Basic Implementation

Let's write a function that performs a calculation and returns the result.

# function_with_return.py

def calculate_square(number):
"""Calculates the square of a number and returns it."""
result = number * number
return result

# Call the function and capture the output
squared_value = calculate_square(5)

print(f"The function was called, and it returned: {squared_value}")
print(f"We can now use this value: {squared_value + 10}")

# Output:
# The function was called, and it returned: 25
# We can now use this value: 35

Code Breakdown:

  1. We define calculate_square which takes one parameter, number.
  2. Inside the function, we calculate the square and store it in result.
  3. return result sends the value of result back.
  4. squared_value = calculate_square(5): We call the function with the argument 5. The function executes, and the returned value (25) is assigned to the squared_value variable.
  5. We can now use the squared_value variable anywhere else in our code.

🛠️ Section 3: Advanced Return Scenarios

The return statement is incredibly versatile. Let's explore some more advanced use cases.

3.1 - Returning Different Data Types

A function can return any Python object.

# returning_different_types.py

def get_weather_report(city):
if city == "New York":
# Return a dictionary
return {"city": "New York", "temperature": 75, "condition": "Sunny"}
elif city == "London":
# Return a string
return "It's probably raining."
else:
# Return a boolean
return False

ny_report = get_weather_report("New York")
print(f"Report for New York: {ny_report}")

london_report = get_weather_report("London")
print(f"Report for London: {london_report}")
# Output:
# Report for New York: {'city': 'New York', 'temperature': 75, 'condition': 'Sunny'}
# Report for London: It's probably raining.

3.2 - Returning Multiple Values

What if you need to get more than one piece of information back from a function? Python makes this incredibly easy. You just list the values you want to return, separated by commas.

When you do this, Python automatically bundles them into a tuple.

# returning_multiple_values.py

def get_user_stats(user_id):
"""A mock function to get user stats."""
username = "coder_cat"
score = 1250
is_active = True
return username, score, is_active

# Unpack the returned tuple into multiple variables
user, points, status = get_user_stats(101)

print(f"Username: {user}")
print(f"Points: {points}")
print(f"Is Active: {status}")

# Output:
# Username: coder_cat
# Points: 1250
# Is Active: True

This technique, known as "unpacking," is a clean and highly readable way to handle multiple return values.

3.3 - The Implicit return None

What happens if a function doesn't have a return statement? It still returns something: the special value None.

None represents the absence of a value.

# implicit_none.py

def simple_greeter(name):
"""This function prints a greeting but does not return a value."""
print(f"Hello, {name}!")

return_value = simple_greeter("Bob")

print(f"The function returned: {return_value}")
# Output:
# Hello, Bob!
# The function returned: None

This is an important concept. If you call a function expecting a value but get None, it's likely because the function "fell off the end" without hitting a return statement.

3.4 - Early Returns for Cleaner Code

You can have multiple return statements in a function. This is often used to exit a function early if a certain condition is met. This pattern can make your code much cleaner by reducing nested if statements.

The Nested Way:

def process_item(item):
if item is not None:
if isinstance(item, str):
# Complex logic here...
return f"Processed string: {item.upper()}"
else:
return "Error: Item is not a string."
else:
return "Error: Item is None."

The Cleaner "Early Return" Way:

def process_item_clean(item):
"""Processes an item using early returns for validation."""
if item is None:
return "Error: Item is None." # Exit early

if not isinstance(item, str):
return "Error: Item is not a string." # Exit early

# If we get here, we know the data is valid
# No more nesting needed!
return f"Processed string: {item.upper()}"

print(process_item_clean(None))
print(process_item_clean(123))
print(process_item_clean("hello"))
# Output:
# Error: Item is None.
# Error: Item is not a string.
# Processed string: HELLO

By handling the error conditions first and returning early, the main "happy path" logic is left un-nested and is much easier to read.


✨ Conclusion & Key Takeaways

The return statement transforms functions from simple command-runners into powerful data processors. By returning values, you can create modular, testable, and reusable components that form the backbone of any significant Python application.

Let's summarize the key takeaways:

  • return is for Output: It's the primary mechanism for a function to send data back to its caller.
  • Any Data Type: Functions can return numbers, strings, lists, dictionaries, and any other Python object.
  • Multiple Values via Tuples: Use comma-separated values to return multiple items, which are automatically packed into a tuple.
  • No return Means None: A function that completes without an explicit return statement implicitly returns None.
  • Return Early, Return Often: Use early return statements to validate data and reduce nesting, making your code cleaner.

Challenge Yourself: Create a function get_circle_info that takes a radius as input. It should calculate and return both the area (π * r²) and the circumference (2 * π * r) of the circle. You can use 3.14159 for π.


➡️ Next Steps

Now that you can get data out of functions, the next logical step is to learn about making your function inputs more flexible. In the next article, we will explore "Default Arguments and Keyword Arguments."

Keep experimenting with return statements. They are a key ingredient in writing effective Python code!


Glossary (Python Terms)

  • Return Value: The value that a function sends back to its caller.
  • Tuple: An ordered, immutable collection of Python objects. Often used to return multiple values from a function.
  • None: A special singleton object in Python that represents the absence of a value.
  • Unpacking: A convenient way to assign the items of an iterable (like a tuple) to multiple variables in a single statement.

Further Reading (Python Resources)