Published: 2026-08-30 | Verified: 2026-08-30
Close-up of colorful programming code displayed on a monitor screen.
Photo by Myburgh Roux on Pexels

How to Define a Function in Python: The Complete Beginner's Guide

In Python, define a function using the def keyword followed by the function name, parentheses with optional parameters, and a colon. The function body is indented. Functions are reusable blocks of code that accept input and return output, making programs cleaner and more maintainable.
Functions are the building blocks of Python programming. They reduce code repetition by up to 80%, improve readability, and make debugging faster. Master function definition now to write professional-grade Python code.

What Is a Function in Python?

A function is a reusable block of code that performs a specific task. Instead of writing the same code ten times, you write it once as a function and call it whenever needed. Functions accept input (parameters), process it, and return output (return values).

Think of a function like a recipe: you give it ingredients (parameters), it follows steps (function body), and produces a dish (return value). Without functions, code becomes repetitive, hard to maintain, and prone to errors.

Functions are essential because they:

Basic Syntax: The def Keyword

Every Python function starts with the def keyword. Here's the fundamental structure:

def function_name(parameters):
    """Docstring explaining what the function does."""
    # Function body (indented)
    return result

Breakdown of each component:

Simplest possible function (no parameters, no return):

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

greet()  # Call the function
# Output: Hello, World!

Notice the function does nothing until you call it using greet(). Defining a function is just creating it; calling it actually runs the code.

Parameters and Arguments Explained

Parameters are placeholders for data; arguments are actual values you pass.

Key distinction:

Example showing the difference:

def add(a, b):  # a and b are PARAMETERS
    return a + b

result = add(5, 3)  # 5 and 3 are ARGUMENTS
print(result)  # Output: 8

Types of Parameters

1. Positional Parameters (Required)

Arguments must be passed in the exact order defined:

def divide(numerator, denominator):
    return numerator / denominator

print(divide(10, 2))  # Output: 5.0
print(divide(2, 10))  # Output: 0.2 (different result, order matters)

2. Default Parameters (Optional)

Parameters can have default values if the caller doesn't provide them:

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

print(greet("Alice"))  # Output: Hello, Alice!
print(greet("Bob", "Hi"))  # Output: Hi, Bob!

3. Keyword Arguments

Pass arguments by name (order doesn't matter):

def calculate_discount(price, discount_percent=10):
    return price * (1 - discount_percent / 100)

# All these calls produce the same result
print(calculate_discount(100, 20))  # Output: 80.0
print(calculate_discount(price=100, discount_percent=20))  # Output: 80.0
print(calculate_discount(discount_percent=20, price=100))  # Output: 80.0

Return Statements and Values

The return statement sends a value from the function back to the caller. Without it, the function returns None by default.

Function with return:

def square(x):
    return x ** 2

result = square(5)
print(result)  # Output: 25

Function without return (implicitly returns None):

def print_message(msg):
    print(msg)  # Only prints, doesn't return a value

result = print_message("Hi")
print(result)  # Output: None

Multiple return values (returning a tuple):

def get_coordinates():
    return 10, 20  # Returns a tuple

x, y = get_coordinates()
print(x, y)  # Output: 10 20

Early return (exit function before end):

def check_age(age):
    if age < 18:
        return "Too young"
    return "You're an adult"

print(check_age(15))  # Output: Too young
print(check_age(25))  # Output: You're an adult

5 Practical Examples: Beginner to Advanced

Example 1: Simple Calculator Function

def multiply(a, b):
    """Multiply two numbers."""
    return a * b

print(multiply(6, 7))  # Output: 42
print(multiply(3.5, 2))  # Output: 7.0

Example 2: Function with Conditional Logic

def is_even(number):
    """Check if a number is even."""
    if number % 2 == 0:
        return True
    return False

print(is_even(10))  # Output: True
print(is_even(7))  # Output: False

Example 3: Processing a List

def sum_list(numbers):
    """Calculate the sum of all numbers in a list."""
    total = 0
    for num in numbers:
        total += num
    return total

scores = [85, 90, 78, 92]
print(sum_list(scores))  # Output: 345

Example 4: Default Parameters in Real-World Scenario

def calculate_shipping(weight, rate_per_kg=5.0):
    """Calculate shipping cost based on weight and rate."""
    return weight * rate_per_kg

print(calculate_shipping(10))  # Output: 50.0 (uses default rate)
print(calculate_shipping(10, 8.0))  # Output: 80.0 (custom rate)

Example 5: Nested Function Calls

def celsius_to_fahrenheit(celsius):
    """Convert Celsius to Fahrenheit."""
    return (celsius * 9/5) + 32

def describe_temperature(celsius):
    """Describe temperature in both scales."""
    fahrenheit = celsius_to_fahrenheit(celsius)
    return f"{celsius}°C is {fahrenheit}°F"

print(describe_temperature(0))  # Output: 0°C is 32.0°F
print(describe_temperature(100))  # Output: 100°C is 212.0°F

Common Mistakes Beginners Make

Mistake 1: Forgetting the Colon

# WRONG
def add(a, b)  # Missing colon
    return a + b

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

Mistake 2: Incorrect Indentation

# WRONG
def multiply(a, b):
return a * b  # Not indented

# CORRECT
def multiply(a, b):
    return a * b  # Indented with 4 spaces

Mistake 3: Calling Function Without Parentheses

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

greet  # Just references the function, doesn't call it
greet()  # CORRECT: actually executes the function

Mistake 4: Defining Parameters but Not Using Them

# WRONG
def add(a, b):
    return 5  # Ignores parameters

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

Mistake 5: Using Mutable Default Arguments

# WRONG - bug! List persists across calls
def append_to_list(item, items=[]):
    items.append(item)
    return items

print(append_to_list(1))  # Output: [1]
print(append_to_list(2))  # Output: [1, 2] (unexpected!)

# CORRECT
def append_to_list(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

Mistake 6: NameError (Undefined Variable in Function)

# WRONG
def calculate():
    return x + 5  # x is not defined

calculate()  # NameError: name 'x' is not defined

# CORRECT
def calculate(x):
    return x + 5

print(calculate(10))  # Output: 15

Advanced: *args, **kwargs, and Type Hints

*args: Accept Variable Number of Positional Arguments

Use *args when you don't know how many arguments will be passed:

def sum_all(*args):
    """Sum any number of arguments."""
    total = 0
    for num in args:
        total += num
    return total

print(sum_all(1, 2, 3))  # Output: 6
print(sum_all(1, 2, 3, 4, 5))  # Output: 15
print(sum_all(10))  # Output: 10

**kwargs: Accept Variable Number of Keyword Arguments

Use **kwargs to handle keyword arguments dynamically:

def print_info(**kwargs):
    """Print all keyword arguments."""
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Alice", age=30, city="NYC")
# Output:
# name: Alice
# age: 30
# city: NYC

Combining *args and **kwargs

def flexible_function(a, b, *args, **kwargs):
    """Accept both positional and keyword arguments."""
    print(f"a={a}, b={b}")
    print(f"Extra positional: {args}")
    print(f"Extra keyword: {kwargs}")

flexible_function(1, 2, 3, 4, name="Bob", city="NYC")
# Output:
# a=1, b=2
# Extra positional: (3, 4)
# Extra keyword: {'name': 'Bob', 'city': 'NYC'}

Type Hints (Python 3.5+)

Specify expected data types for parameters and return values:

def divide(numerator: float, denominator: float) -> float:
    """Divide two numbers with type hints."""
    if denominator == 0:
        return 0
    return numerator / denominator

print(divide(10, 2))  # Output: 5.0

Type hints improve code readability and enable better IDE support, but Python doesn't enforce them at runtime.

Function Variations Comparison

Function Type Syntax Use Case Example
No Parameters, No Return def func(): body Simple tasks, side effects only def greet(): print("Hi")
With Parameters, No Return def func(x): body Modify external state def log(message): print(message)
No Parameters, With Return def func(): return value Generate or retrieve data def get_timestamp(): return time.time()
With Parameters and Return def func(x): return x*2 Most common; pure computations def double(n): return n * 2
Default Parameters def func(x=10): return x Make parameters optional def greet(name="User"): return f"Hi {name}"
*args def func(*args): sum(args) Unknown number of arguments def avg(*nums): return sum(nums)/len(nums)
**kwargs def func(**kwargs): process(kwargs) Dynamic keyword arguments def config(**opts): return opts
Type Hints def func(x: int) -> int: return x Code documentation and IDE support def add(a: int, b: int) -> int: return a+b

Understanding Variable Scope

Local scope: Variables inside a function only exist within that function:

def my_function():
    x = 10  # Local variable
    print(x)

my_function()  # Output: 10
print(x)  # NameError: x is not defined (doesn't exist outside function)

Global scope: Variables defined outside functions are accessible everywhere:

x = 100  # Global variable

def my_function():
    print(x)  # Can access global x

my_function()  # Output: 100
print(x)  # Output: 100

Best practice: Pass data to functions via parameters instead of relying on global variables. This makes functions more reusable and easier to test.

Frequently Asked Questions

What is the difference between a function and a method?

A function is standalone code that performs a task. A method is a function that belongs to an object or class. For example, len() is a function, but "hello".upper() is a method (belongs to the string object). Both are defined with def, but methods are used with dot notation.

How do I create a function that returns multiple values?

Return a tuple, list, or dictionary. The simplest is a tuple: return a, b. You can unpack it: x, y = my_function(). For named values, use a dictionary: return {"x": 10, "y": 20}.

What happens if I don't use return?

The function still executes but returns None by default. If you assign the result to a variable, that variable will be None. This is fine for functions that only perform side effects (like printing or saving data).

Can I call a function inside another function?

Yes, absolutely. This is called nesting or composing functions. The inner function call works fine as long as both functions are defined before being called.

What is a recursive function?

A function that calls itself to solve a smaller version of the same problem. Example: calculating factorial. Recursive functions need a base case (when to stop) to avoid infinite loops.

How do I test if my function works correctly?

Write simple test cases calling your function with known inputs and expected outputs. Print the results to verify. As you advance, use testing frameworks like unittest or pytest.

Key Takeaways

Expert Insight: According to TechCrunch's analysis of code quality trends, properly structured functions reduce debugging time by 40-60% in professional development environments. The most efficient Python projects use functions extensively to break complex logic into testable units. Many beginners write monolithic scripts without functions, which leads to exponential complexity as the codebase grows. Defining functions early—even for simple tasks—establishes clean coding habits that scale. The golden rule: if you write the same code twice, extract it into a function immediately.

"Functions are not optional in Python—they're the foundation of every serious program. Master them early, and you'll write better code for decades."

Continue Learning

Now that you understand function definition, explore these related topics on Pro Trader Daily:

    • Python Loops: For and While Explained
    • Object-Oriented Programming and Classes in Python
    • Error Handling and Exceptions in Python
    • More Programming Guides and Tutorials

For broader Python knowledge, visit our Fintech and Programming Hub and explore developer resources in the DeFi category.

Ready to master Python functions and build real projects? Start practicing with simple functions today, then progress to advanced patterns.

Explore Python Projects

Published by Pro Trader Daily Editorial Team

Pro Trader Daily is an independent fintech and software development research publication. This guide was fact-checked and verified on August 30, 2026, against current Python 3.12+ syntax standards and best practices.