For DevelopersJanuary 27, 2026

How to Use Optional Arguments in Python Functions

Optional arguments in Python allow functions to have default values (using = syntax), making code more flexible and reusable by letting callers omit certain parameters. Key pitfall: avoid mutable defaults like lists/dicts (use None instead and initialize inside the function) to prevent unexpected shared state across function calls.

One of Python's finest features is its flexibility, and adding optional parameters in methods makes the code more reusable and easier to maintain. Whether you're a newbie or an experienced Python writer, knowing optional arguments is critical for writing cleaner, more extensible code.

In this blog, we'll talk about what optional arguments are, why they're useful, and how to utilize them. We'll also go over some frequent pitfalls and best practices to assist you avoid problems while building your own Python code.

Let’s dive in!

Join the Index.dev talent network to work on high-paying Python projects in the US, UK, and EU.

 

What Are Function Arguments in Python?

Before we go into optional arguments, let's define what function arguments are. In Python, a function can accept input values known as "arguments" or "parameters". When you call a function, you send along these parameters. There are two primary sorts of arguments:

1. Positional Arguments: These are arguments that need to be passed in the right order. The order in which you pass them matters.

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

result = add(2, 3)  # Output will be 5

2. Keyword Arguments: Here, you can assign a value to an argument by specifying the argument name. The order doesn't matter in this case.

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

result = add(b=3, a=2)  # Output will still be 5

These two types of arguments can be combined, making the function call more flexible.

 

Understanding Optional Arguments

Optional arguments are those that have a default value. If the caller does not specify a value for the argument, Python will use the default. The = symbol in the function signature denotes optional parameters.

Syntax of Optional Arguments

Let’s see a simple example:

def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"
   
print(greet("Alice"))         # Output: "Hello, Alice!"
print(greet("Bob", "Hi"))     # Output: "Hi, Bob!"

In the above example, greeting is an optional argument with a default value of "Hello". If you do not provide a second argument, Python will automatically use "Hello". However, if you pass a value for greeting, it will use that instead.

 

Why Use Optional Arguments?

Flexibility: 

You don't need to always pass every argument when calling a function. This makes it easier to work with functions when only some inputs change.

Code Simplification: 

By using default values, you can simplify your function calls, especially for cases where the default values cover the common use cases.

 

Benefits of Using Optional Arguments

Optional arguments bring several benefits to your Python code:

1. Code Flexibility: 

Optional arguments allow the function to be more flexible. You can pass fewer arguments, and Python will still make the function work using the defaults.
For example, a logging function might need extra details only in some situations:

def log_message(message, log_level="INFO"):
    print(f"{log_level}: {message}")

log_message("System is running")   # Output: "INFO: System is running"
log_message("Error occurred", "ERROR")   # Output: "ERROR: Error occurred"

2. Less Code Duplication: 

You can use a single function with optional arguments instead of writing multiple versions of the same function with different parameter sets. This leads to less repetition and a cleaner codebase.

3. Readability: 

Optional arguments provide meaningful defaults, making the function calls more understandable for other developers.

Explore More: What Is Multiprocessing in Python

 

Common Pitfalls with Optional Arguments

While optional arguments are great, there are some common mistakes developers can make. One of the biggest pitfalls is using mutable default arguments.

Mutable Default Arguments Problem

Let’s say you want to write a function that adds an item to a list. You might write something like this:

def add_item(item, items=[]):
    items.append(item)
    return items

However, there is an issue! If you use a mutable default, such as a list, Python will only generate it once, rather than each time the function is invoked. This means that the same list will be repeated over several function calls, which may result in unexpected behavior:

print(add_item("apple"))   # Output: ['apple']
print(add_item("banana"))  # Output: ['apple', 'banana']  (this is probably not what you wanted!)

 

Solution to Mutable Default Argument

The solution is to use None as a default value and then create a new list inside the function:

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

print(add_item("apple"))   # Output: ['apple']
print(add_item("banana"))  # Output: ['banana']

By checking if the items argument is None, we create a new list every time the function is called, avoiding the problem of shared mutable defaults.

 

Advanced Use Cases

Let’s look at more advanced examples of using optional arguments.

Combining Positional, Keyword, and Optional Arguments

You can combine different types of arguments (positional, keyword, and optional) in one function:

def process_order(item, quantity=1, discount=0):
    total = item["price"] * quantity * (1 - discount)
    return total

item = {"name": "Laptop", "price": 1000}

print(process_order(item))           # Output: 1000
print(process_order(item, 2))        # Output: 2000
print(process_order(item, 2, 0.1))   # Output: 1800

Here, quantity and discount are optional, allowing us to provide default behavior if the caller doesn't specify them.

Using *args and **kwargs

For more flexibility, Python also provides *args and **kwargs. These allow functions to accept a variable number of positional or keyword arguments.

  • *args: Allows you to pass multiple positional arguments.
  • **kwargs: Allows you to pass multiple keyword arguments.

Example:

def flexible_function(*args, **kwargs):
    print("Positional arguments:", args)
    print("Keyword arguments:", kwargs)

flexible_function(1, 2, 3, name="Alice", age=30)

Output: 

Positional arguments: (1, 2, 3)
Keyword arguments: {'name': 'Alice', 'age': 30}

This allows you to create functions that can handle many inputs without needing to define them individually in the function signature.

 

Best Practices for Using Optional Arguments

  1. Avoid Mutability: As we saw earlier, never use mutable objects like lists or dictionaries as default argument values. Stick to immutables like None, numbers, or strings.
  2. Meaningful Defaults: Make sure the default values make sense. For example, a discount of 0 or a greeting of "Hello" is a good default because it's often useful. Avoid using defaults that might confuse the user.
  3. Keep it Simple: Avoid overcomplicating the function signature by adding too many optional arguments. Too many options can make the function hard to read and understand.

Explore More: How to Implement Custom Iterators and Iterables in Python

 

Conclusion

Optional arguments are a valuable Python feature that enables developers to construct more flexible and clean code. Using default values allows your functions to easily handle a variety of circumstances. However, it is critical to grasp the possible hazards, particularly when working with modifiable default parameters.

Following best practices ensures that your code is efficient, legible, and bug-free. Whether you're working with APIs, utility methods, or complicated systems, understanding optional arguments is an important step toward becoming a more productive Python developer.

 

For Developers: Take your Python skills global! Join Index.dev’s talent network and work on high-end projects with great pay, remotely.

For Clients: Need expert Python developers to build scalable solutions? Contact us at Index.dev and let us help you hire a senior Python talent today!

Share

Alexandr FrunzaAlexandr FrunzaBackend Developer

Related Articles

For EmployersTech Employee Layoffs 2026: Trends, Numbers & Causes
Tech HiringInsights
This guide analyzes verified tech layoff data from 2020 to 2026. It covers global workforce reductions, industry-wise impact, country distribution, yearly trends, and the main drivers such as AI adoption, restructuring, and budget constraints shaping employment shifts.
Eugene GarlaEugene GarlaVP of Talent
For EmployersHow Specialized AI Is Transforming Traditional Industries
Artificial Intelligence
Artificial intelligence is changing how traditional industries work. Companies are no longer relying only on general skills. Instead, they are using AI tools and specialized experts to improve productivity, reduce costs, and make better decisions.
Ali MojaharAli MojaharSEO Specialist