Python Function Return Values: Complete Guide & Examples

Master Python function return statements with comprehensive examples, best practices, and common pitfalls to avoid in your code.

Returning Values from Functions in Python

Table of Contents

1. [Introduction to Function Return Values](#introduction) 2. [Basic Return Statement](#basic-return-statement) 3. [Types of Return Values](#types-of-return-values) 4. [Multiple Return Values](#multiple-return-values) 5. [Conditional Returns](#conditional-returns) 6. [Return vs Print](#return-vs-print) 7. [Advanced Return Patterns](#advanced-return-patterns) 8. [Best Practices](#best-practices) 9. [Common Pitfalls](#common-pitfalls) 10. [Practical Examples](#practical-examples)

Introduction to Function Return Values {#introduction}

Functions in Python are designed to perform specific tasks and optionally return results back to the caller. The return statement is a fundamental concept that allows functions to send data back to the code that invoked them. Understanding how to properly return values from functions is crucial for writing effective and reusable code.

When a function executes a return statement, it immediately exits the function and sends the specified value back to the calling code. If no return statement is specified, Python functions automatically return None.

Basic Syntax

`python def function_name(parameters): # Function body return value # Optional `

Basic Return Statement {#basic-return-statement}

The return statement serves multiple purposes in Python functions:

1. Terminates function execution: Once a return statement is encountered, the function immediately stops executing 2. Returns a value: Sends data back to the caller 3. Provides function output: Allows functions to produce results that can be used elsewhere

Simple Return Examples

`python

Function returning a single integer

def add_numbers(a, b): result = a + b return result

Usage

sum_result = add_numbers(5, 3) print(sum_result) # Output: 8

Function returning a string

def greet_user(name): greeting = f"Hello, {name}!" return greeting

Usage

message = greet_user("Alice") print(message) # Output: Hello, Alice!

Function returning a boolean

def is_even(number): return number % 2 == 0

Usage

result = is_even(4) print(result) # Output: True `

Functions Without Explicit Return

`python

Function without return statement

def print_message(text): print(f"Message: {text}")

This function returns None

result = print_message("Hello World") print(result) # Output: None

Function with empty return

def process_data(data): if not data: return # Returns None # Process data here print("Data processed")

result = process_data([]) print(result) # Output: None `

Types of Return Values {#types-of-return-values}

Python functions can return various data types. Here's a comprehensive overview:

Return Value Types Table

| Data Type | Description | Example | |-----------|-------------|---------| | Integer | Whole numbers | return 42 | | Float | Decimal numbers | return 3.14 | | String | Text data | return "Hello" | | Boolean | True/False values | return True | | List | Ordered collection | return [1, 2, 3] | | Tuple | Immutable sequence | return (1, 2, 3) | | Dictionary | Key-value pairs | return {"key": "value"} | | Set | Unique elements | return {1, 2, 3} | | None | No value | return None | | Custom Objects | User-defined classes | return MyClass() |

Detailed Examples for Each Type

`python

Integer return

def calculate_age(birth_year, current_year): return current_year - birth_year

age = calculate_age(1990, 2024) print(f"Age: {age}") # Output: Age: 34

Float return

def calculate_bmi(weight, height): bmi = weight / (height 2) return round(bmi, 2)

bmi_value = calculate_bmi(70, 1.75) print(f"BMI: {bmi_value}") # Output: BMI: 22.86

String return

def format_name(first, last): return f"{first.title()} {last.title()}"

full_name = format_name("john", "doe") print(full_name) # Output: John Doe

Boolean return

def is_valid_email(email): return "@" in email and "." in email

valid = is_valid_email("user@example.com") print(f"Valid email: {valid}") # Output: Valid email: True

List return

def get_even_numbers(numbers): even_nums = [] for num in numbers: if num % 2 == 0: even_nums.append(num) return even_nums

evens = get_even_numbers([1, 2, 3, 4, 5, 6]) print(evens) # Output: [2, 4, 6]

Dictionary return

def create_user_profile(name, age, city): return { "name": name, "age": age, "city": city, "profile_created": True }

profile = create_user_profile("Alice", 25, "New York") print(profile) # Output: {'name': 'Alice', 'age': 25, 'city': 'New York', 'profile_created': True}

Tuple return (multiple values)

def get_statistics(numbers): if not numbers: return None, None, None minimum = min(numbers) maximum = max(numbers) average = sum(numbers) / len(numbers) return minimum, maximum, average

min_val, max_val, avg_val = get_statistics([1, 2, 3, 4, 5]) print(f"Min: {min_val}, Max: {max_val}, Average: {avg_val}")

Output: Min: 1, Max: 5, Average: 3.0

`

Multiple Return Values {#multiple-return-values}

Python allows functions to return multiple values using tuples. This is achieved through tuple packing and unpacking.

Tuple Packing and Unpacking

`python

Function returning multiple values

def divide_with_remainder(dividend, divisor): quotient = dividend // divisor remainder = dividend % divisor return quotient, remainder # Tuple packing

Tuple unpacking

q, r = divide_with_remainder(17, 5) print(f"Quotient: {q}, Remainder: {r}") # Output: Quotient: 3, Remainder: 2

Alternative: receive as tuple

result = divide_with_remainder(17, 5) print(f"Result tuple: {result}") # Output: Result tuple: (3, 2) print(f"Quotient: {result[0]}, Remainder: {result[1]}") `

Advanced Multiple Return Examples

`python

Function returning different data types

def analyze_text(text): word_count = len(text.split()) char_count = len(text) is_long = word_count > 10 words = text.split() return word_count, char_count, is_long, words

Unpacking multiple return values

wc, cc, long_text, word_list = analyze_text("This is a sample text for analysis") print(f"Words: {wc}, Characters: {cc}, Long text: {long_text}") print(f"Word list: {word_list}")

Function with conditional multiple returns

def get_user_info(user_id): # Simulated database lookup users = { 1: ("Alice", "alice@email.com", 25), 2: ("Bob", "bob@email.com", 30) } if user_id in users: name, email, age = users[user_id] return True, name, email, age else: return False, None, None, None

Usage with conditional unpacking

found, name, email, age = get_user_info(1) if found: print(f"User: {name}, Email: {email}, Age: {age}") else: print("User not found") `

Multiple Return Values Best Practices

| Practice | Good Example | Poor Example | |----------|--------------|--------------| | Limit return values | return x, y, z (3 values) | return a, b, c, d, e, f, g (7+ values) | | Use meaningful names | name, email, age = get_user_data() | a, b, c = get_user_data() | | Consider named tuples | return Point(x=1, y=2) | return 1, 2 | | Document return values | Use docstrings to explain | No documentation |

`python from collections import namedtuple

Using named tuples for better readability

Point = namedtuple('Point', ['x', 'y']) UserInfo = namedtuple('UserInfo', ['name', 'email', 'age'])

def get_coordinates(): return Point(x=10, y=20)

def get_user_details(user_id): # Simulated lookup return UserInfo(name="Alice", email="alice@email.com", age=25)

Usage

coords = get_coordinates() print(f"X: {coords.x}, Y: {coords.y}")

user = get_user_details(1) print(f"Name: {user.name}, Email: {user.email}, Age: {user.age}") `

Conditional Returns {#conditional-returns}

Functions can have multiple return statements based on different conditions. This allows for complex logic and early exits from functions.

Basic Conditional Returns

`python def grade_calculator(score): if score >= 90: return "A" elif score >= 80: return "B" elif score >= 70: return "C" elif score >= 60: return "D" else: return "F"

Usage

grade = grade_calculator(85) print(f"Grade: {grade}") # Output: Grade: B

def validate_age(age): if age < 0: return False, "Age cannot be negative" elif age > 150: return False, "Age seems unrealistic" else: return True, "Valid age"

Usage

is_valid, message = validate_age(25) print(f"Valid: {is_valid}, Message: {message}") `

Early Return Pattern

`python def process_user_data(user_data): # Early returns for error conditions if not user_data: return {"error": "No data provided"} if "email" not in user_data: return {"error": "Email is required"} if "@" not in user_data["email"]: return {"error": "Invalid email format"} # Main processing logic processed_data = { "name": user_data.get("name", "Unknown"), "email": user_data["email"].lower(), "status": "processed" } return {"success": True, "data": processed_data}

Usage examples

result1 = process_user_data({}) print(result1) # Output: {'error': 'No data provided'}

result2 = process_user_data({"name": "Alice", "email": "Alice@Example.com"}) print(result2) # Output: {'success': True, 'data': {'name': 'Alice', 'email': 'alice@example.com', 'status': 'processed'}} `

Guard Clauses

`python def calculate_discount(price, customer_type, years_customer): # Guard clauses for invalid inputs if price <= 0: return 0, "Invalid price" if customer_type not in ["regular", "premium", "vip"]: return 0, "Invalid customer type" if years_customer < 0: return 0, "Invalid years as customer" # Calculate discount based on conditions discount = 0 if customer_type == "premium": discount += 0.10 elif customer_type == "vip": discount += 0.15 if years_customer >= 5: discount += 0.05 discount_amount = price * discount return discount_amount, "Discount calculated successfully"

Usage

discount, message = calculate_discount(100, "premium", 6) print(f"Discount: ${discount:.2f}, Message: {message}") `

Return vs Print {#return-vs-print}

Understanding the difference between return and print is crucial for Python developers.

Comparison Table

| Aspect | return | print | |--------|----------|---------| | Purpose | Send value back to caller | Display value on screen | | Function termination | Terminates function | Continues execution | | Value availability | Value can be stored/used | Value is only displayed | | Testing | Easy to test | Difficult to test | | Flexibility | High (value can be processed) | Low (only visual output) | | Default return | Returns specified value | Returns None |

Practical Examples

`python

Using print (less flexible)

def add_and_print(a, b): result = a + b print(f"The sum is: {result}") # Only displays, doesn't return

Using return (more flexible)

def add_and_return(a, b): result = a + b return result

Comparison

print("=== Using print function ===") add_and_print(5, 3) # Displays: The sum is: 8

Cannot store or manipulate the result

print("\n=== Using return function ===") sum_result = add_and_return(5, 3) print(f"The sum is: {sum_result}") # Can format as needed print(f"Double the sum: {sum_result * 2}") # Can manipulate the result

Chain operations with return values

def multiply(a, b): return a * b

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

Chaining operations

result = multiply(add(2, 3), 4) # (2+3) * 4 = 20 print(f"Chained result: {result}")

This wouldn't work with print-only functions

def multiply_and_print(a, b): result = a * b print(result)

def add_and_print_only(a, b): result = a + b print(result)

Cannot chain these operations

result = multiply_and_print(add_and_print_only(2, 3), 4) # Error!

`

When to Use Each

`python

Use return when:

1. You need to use the result elsewhere

def calculate_tax(amount, rate): return amount * rate

tax = calculate_tax(100, 0.08) total = 100 + tax # Using the returned value

2. You're writing testable functions

def is_palindrome(text): cleaned = text.lower().replace(" ", "") return cleaned == cleaned[::-1]

Easy to test

assert is_palindrome("A man a plan a canal Panama") == True

3. You're building reusable components

def format_currency(amount): return f"${amount:.2f}"

prices = [10.5, 25.99, 100] formatted_prices = [format_currency(price) for price in prices]

Use print when:

1. You want to display information to users

def display_menu(): print("1. Add item") print("2. Remove item") print("3. View items") print("4. Exit")

2. You're debugging

def complex_calculation(data): intermediate_result = sum(data) / len(data) print(f"Debug: Average = {intermediate_result}") # Debug info final_result = intermediate_result * 1.1 return final_result

3. You're creating user interfaces

def welcome_user(name): print(f"Welcome to our application, {name}!") print("Please select an option from the menu below:") `

Advanced Return Patterns {#advanced-return-patterns}

Returning Functions

`python

Functions that return other functions

def create_multiplier(factor): def multiplier(number): return number * factor return multiplier

Usage

double = create_multiplier(2) triple = create_multiplier(3)

print(double(5)) # Output: 10 print(triple(4)) # Output: 12

Returning lambda functions

def create_validator(min_length): return lambda text: len(text) >= min_length

Usage

password_validator = create_validator(8) print(password_validator("short")) # Output: False print(password_validator("longenough")) # Output: True `

Returning Classes and Objects

`python class Calculator: def __init__(self, initial_value=0): self.value = initial_value def add(self, number): self.value += number return self # Return self for method chaining def multiply(self, number): self.value *= number return self def get_result(self): return self.value

Method chaining

result = Calculator(5).add(3).multiply(2).get_result() print(f"Result: {result}") # Output: Result: 16

Function returning class instances

def create_user(name, email): class User: def __init__(self, name, email): self.name = name self.email = email def display_info(self): return f"User: {self.name}, Email: {self.email}" return User(name, email)

Usage

user = create_user("Alice", "alice@example.com") print(user.display_info()) `

Generator Functions

`python

Functions that return generators

def fibonacci_generator(n): a, b = 0, 1 count = 0 while count < n: yield a a, b = b, a + b count += 1

Usage

fib_gen = fibonacci_generator(10) fib_numbers = list(fib_gen) print(f"First 10 Fibonacci numbers: {fib_numbers}")

Generator expression return

def get_even_squares(numbers): return (x2 for x in numbers if x % 2 == 0)

Usage

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] even_squares = get_even_squares(numbers) print(f"Even squares: {list(even_squares)}") `

Best Practices {#best-practices}

Documentation and Type Hints

`python from typing import Tuple, Optional, List, Dict, Union

def calculate_statistics(numbers: List[float]) -> Tuple[float, float, float]: """ Calculate basic statistics for a list of numbers. Args: numbers: List of numeric values Returns: Tuple containing (mean, minimum, maximum) Raises: ValueError: If the input list is empty """ if not numbers: raise ValueError("Cannot calculate statistics for empty list") mean = sum(numbers) / len(numbers) minimum = min(numbers) maximum = max(numbers) return mean, minimum, maximum

def find_user(user_id: int) -> Optional[Dict[str, Union[str, int]]]: """ Find user by ID. Args: user_id: The unique identifier for the user Returns: Dictionary with user information if found, None otherwise """ users = { 1: {"name": "Alice", "age": 25, "email": "alice@example.com"}, 2: {"name": "Bob", "age": 30, "email": "bob@example.com"} } return users.get(user_id)

Usage with type checking

stats = calculate_statistics([1.0, 2.0, 3.0, 4.0, 5.0]) print(f"Mean: {stats[0]:.2f}, Min: {stats[1]}, Max: {stats[2]}")

user = find_user(1) if user: print(f"Found user: {user['name']}") else: print("User not found") `

Error Handling in Return Values

`python from typing import Tuple, Optional import logging

def safe_divide(dividend: float, divisor: float) -> Tuple[bool, Optional[float], Optional[str]]: """ Safely divide two numbers with error handling. Returns: Tuple of (success, result, error_message) """ try: if divisor == 0: return False, None, "Division by zero is not allowed" result = dividend / divisor return True, result, None except TypeError: return False, None, "Invalid input types for division" except Exception as e: logging.error(f"Unexpected error in safe_divide: {e}") return False, None, f"Unexpected error: {str(e)}"

Usage

success, result, error = safe_divide(10, 2) if success: print(f"Division result: {result}") else: print(f"Error: {error}")

Alternative approach using exceptions

def divide_with_exception(dividend: float, divisor: float) -> float: """ Divide two numbers, raising exceptions for errors. Raises: ZeroDivisionError: If divisor is zero TypeError: If inputs are not numeric """ if not isinstance(dividend, (int, float)) or not isinstance(divisor, (int, float)): raise TypeError("Both arguments must be numeric") if divisor == 0: raise ZeroDivisionError("Cannot divide by zero") return dividend / divisor

Usage with exception handling

try: result = divide_with_exception(10, 2) print(f"Division result: {result}") except (ZeroDivisionError, TypeError) as e: print(f"Error: {e}") `

Common Pitfalls {#common-pitfalls}

Pitfall 1: Modifying Mutable Default Arguments

`python

WRONG: Mutable default argument

def add_item_wrong(item, item_list=[]): item_list.append(item) return item_list

Problem: The same list is reused across function calls

list1 = add_item_wrong("apple") list2 = add_item_wrong("banana") print(f"List1: {list1}") # Output: ['apple', 'banana'] print(f"List2: {list2}") # Output: ['apple', 'banana']

CORRECT: Use None as default and create new list inside function

def add_item_correct(item, item_list=None): if item_list is None: item_list = [] item_list.append(item) return item_list

Now each call gets its own list

list3 = add_item_correct("apple") list4 = add_item_correct("banana") print(f"List3: {list3}") # Output: ['apple'] print(f"List4: {list4}") # Output: ['banana'] `

Pitfall 2: Forgetting to Return Values

`python

WRONG: Function modifies but doesn't return

def process_data_wrong(data): data.sort() data.reverse() # Missing return statement

numbers = [3, 1, 4, 1, 5] result = process_data_wrong(numbers) print(f"Result: {result}") # Output: None print(f"Original numbers: {numbers}") # Output: [5, 4, 3, 1, 1] (modified)

CORRECT: Return the processed data

def process_data_correct(data): # Create a copy to avoid modifying original processed = data.copy() processed.sort() processed.reverse() return processed

numbers = [3, 1, 4, 1, 5] result = process_data_correct(numbers) print(f"Result: {result}") # Output: [5, 4, 3, 1, 1] print(f"Original numbers: {numbers}") # Output: [3, 1, 4, 1, 5] (unchanged) `

Pitfall 3: Inconsistent Return Types

`python

WRONG: Inconsistent return types

def get_user_age_wrong(user_id): users = {1: 25, 2: 30} if user_id in users: return users[user_id] # Returns integer else: return "User not found" # Returns string

This can cause issues

age = get_user_age_wrong(1) print(age + 5) # Works: 30

age = get_user_age_wrong(999)

print(age + 5) # Error: can't add string and integer

CORRECT: Consistent return types

def get_user_age_correct(user_id): users = {1: 25, 2: 30} if user_id in users: return users[user_id], None # Returns (age, None) else: return None, "User not found" # Returns (None, error_message)

Usage

age, error = get_user_age_correct(1) if error is None: print(f"User age: {age}") else: print(f"Error: {error}") `

Practical Examples {#practical-examples}

Example 1: File Processing Function

`python import os from typing import Tuple, List, Optional

def process_text_file(filename: str) -> Tuple[bool, Optional[dict], Optional[str]]: """ Process a text file and return statistics. Returns: Tuple of (success, statistics_dict, error_message) """ try: if not os.path.exists(filename): return False, None, f"File '{filename}' does not exist" with open(filename, 'r', encoding='utf-8') as file: content = file.read() # Calculate statistics lines = content.split('\n') words = content.split() characters = len(content) stats = { 'filename': filename, 'lines': len(lines), 'words': len(words), 'characters': characters, 'average_words_per_line': len(words) / len(lines) if lines else 0 } return True, stats, None except PermissionError: return False, None, f"Permission denied accessing '{filename}'" except UnicodeDecodeError: return False, None, f"Unable to decode '{filename}' as UTF-8" except Exception as e: return False, None, f"Unexpected error: {str(e)}"

Usage example

def analyze_files(filenames: List[str]) -> None: """Analyze multiple files and display results.""" for filename in filenames: success, stats, error = process_text_file(filename) if success: print(f"\n=== Analysis of {stats['filename']} ===") print(f"Lines: {stats['lines']}") print(f"Words: {stats['words']}") print(f"Characters: {stats['characters']}") print(f"Avg words per line: {stats['average_words_per_line']:.2f}") else: print(f"\nError processing {filename}: {error}")

Example usage (would work with actual files)

analyze_files(['document1.txt', 'document2.txt', 'nonexistent.txt'])

`

Example 2: Data Validation System

`python from typing import Dict, List, Tuple, Any import re

def validate_user_data(user_data: Dict[str, Any]) -> Tuple[bool, List[str]]: """ Validate user registration data. Args: user_data: Dictionary containing user information Returns: Tuple of (is_valid, list_of_errors) """ errors = [] # Required fields required_fields = ['name', 'email', 'password', 'age'] for field in required_fields: if field not in user_data or not user_data[field]: errors.append(f"'{field}' is required") # If required fields are missing, return early if errors: return False, errors # Name validation name = user_data['name'] if len(name) < 2: errors.append("Name must be at least 2 characters long") if not name.replace(' ', '').isalpha(): errors.append("Name can only contain letters and spaces") # Email validation email = user_data['email'] email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

Python Function Return Values: Complete Guide &amp; Examples

if not re.match(email_pattern, email): errors.append("Invalid email format") # Password validation password = user_data['password'] if len(password) < 8: errors.append("Password must be at least 8 characters long") if not re.search(r'[A-Z]', password): errors.append("Password must contain at least one uppercase letter") if not re.search(r'[a-z]', password): errors.append("Password must contain at least one lowercase letter") if not re.search(r'\d', password): errors.append("Password must contain at least one digit") # Age validation try: age = int(user_data['age']) if age < 13: errors.append("User must be at least 13 years old") elif age > 120: errors.append("Please enter a valid age") except ValueError: errors.append("Age must be a valid number") return len(errors) == 0, errors

def register_user(user_data: Dict[str, Any]) -> Dict[str, Any]: """ Register a new user after validation. Returns: Dictionary with registration result """ is_valid, errors = validate_user_data(user_data) if not is_valid: return { 'success': False, 'message': 'Validation failed', 'errors': errors } # Simulate user registration user_id = hash(user_data['email']) % 10000 # Simple ID generation return { 'success': True, 'message': 'User registered successfully', 'user_id': user_id, 'data': { 'name': user_data['name'], 'email': user_data['email'], 'age': user_data['age'] } }

Example usage

test_users = [ { 'name': 'John Doe', 'email': 'john@example.com', 'password': 'SecurePass123', 'age': '25' }, { 'name': 'J', 'email': 'invalid-email', 'password': 'weak', 'age': '10' } ]

for i, user_data in enumerate(test_users, 1): print(f"\n=== Testing User {i} ===") result = register_user(user_data) if result['success']: print(f"✓ {result['message']}") print(f"User ID: {result['user_id']}") print(f"Registered: {result['data']['name']} ({result['data']['email']})") else: print(f"✗ {result['message']}") for error in result['errors']: print(f" - {error}") `

Example 3: Mathematical Operations with Error Handling

`python import math from typing import Union, Tuple, Optional

def safe_math_operation(operation: str, *args) -> Tuple[bool, Optional[float], Optional[str]]: """ Perform mathematical operations safely with error handling. Args: operation: The mathematical operation to perform *args: Arguments for the operation Returns: Tuple of (success, result, error_message) """ try: if operation == "sqrt": if len(args) != 1: return False, None, "Square root requires exactly one argument" if args[0] < 0: return False, None, "Cannot calculate square root of negative number" return True, math.sqrt(args[0]), None elif operation == "log": if len(args) not in [1, 2]: return False, None, "Logarithm requires 1 or 2 arguments" if args[0] <= 0: return False, None, "Logarithm argument must be positive" if len(args) == 1: result = math.log(args[0]) # Natural log else: if args[1] <= 0 or args[1] == 1: return False, None, "Logarithm base must be positive and not equal to 1" result = math.log(args[0], args[1]) return True, result, None elif operation == "power": if len(args) != 2: return False, None, "Power operation requires exactly two arguments" base, exponent = args if base == 0 and exponent < 0: return False, None, "Cannot raise zero to negative power" result = math.pow(base, exponent) if math.isinf(result): return False, None, "Result is infinite" if math.isnan(result): return False, None, "Result is not a number" return True, result, None elif operation == "divide": if len(args) != 2: return False, None, "Division requires exactly two arguments" if args[1] == 0: return False, None, "Division by zero" return True, args[0] / args[1], None else: return False, None, f"Unknown operation: {operation}" except OverflowError: return False, None, "Result too large to represent" except Exception as e: return False, None, f"Unexpected error: {str(e)}"

def calculate_with_history(*operations) -> Dict[str, Any]: """ Perform multiple mathematical operations and keep history. Args: operations: Tuples of (operation_name, args) Returns: Dictionary with results and history """ results = [] errors = [] for i, operation_data in enumerate(operations): if not operation_data: errors.append(f"Operation {i+1}: Empty operation data") continue operation_name = operation_data[0] operation_args = operation_data[1:] success, result, error = safe_math_operation(operation_name, *operation_args) operation_result = { 'operation': operation_name, 'arguments': operation_args, 'success': success, 'result': result, 'error': error } results.append(operation_result) if not success: errors.append(f"Operation {i+1} ({operation_name}): {error}") return { 'total_operations': len(operations), 'successful_operations': sum(1 for r in results if r['success']), 'failed_operations': len(errors), 'results': results, 'errors': errors }

Example usage

operations_to_test = [ ("sqrt", 16), ("sqrt", -4), # Should fail ("log", 100, 10), ("log", 0), # Should fail ("power", 2, 3), ("power", 0, -1), # Should fail ("divide", 10, 2), ("divide", 5, 0), # Should fail ]

print("=== Mathematical Operations Test ===") calculation_results = calculate_with_history(*operations_to_test)

print(f"\nSummary:") print(f"Total operations: {calculation_results['total_operations']}") print(f"Successful: {calculation_results['successful_operations']}") print(f"Failed: {calculation_results['failed_operations']}")

print(f"\nDetailed Results:") for i, result in enumerate(calculation_results['results'], 1): if result['success']: print(f"{i}. {result['operation']}{result['arguments']} = {result['result']:.4f}") else: print(f"{i}. {result['operation']}{result['arguments']} - ERROR: {result['error']}")

if calculation_results['errors']: print(f"\nErrors encountered:") for error in calculation_results['errors']: print(f" - {error}") `

This comprehensive guide covers the essential aspects of returning values from functions in Python. The examples demonstrate practical applications, best practices, and common pitfalls to avoid. Understanding these concepts will help you write more effective, maintainable, and robust Python code.

Tags

  • Functions
  • Programming Basics
  • Python
  • code examples
  • return-statement

Related Articles

Related Books - Expand Your Knowledge

Explore these Python books to deepen your understanding:

Browse all IT books

Popular Technical Articles & Tutorials

Explore our comprehensive collection of technical articles, programming tutorials, and IT guides written by industry experts:

Browse all 8+ technical articles | Read our IT blog

Python Function Return Values: Complete Guide &amp; Examples