How to Pass a Tuple to a Function in Python

There are two ways to pass a tuple to a function in Python. Pass it as it is, f(t), and the function gets one tuple. Put a star in front, f(*t), and each item becomes its own positional argument:

point = (3, 4)
show(point)    # one argument: (3, 4)
show(*point)   # two arguments: 3, 4

The outputs and screenshots below come from Python 3.12.5 in Command Prompt, with US mailing addresses and shopping-cart prices as sample data.

In this tutorial, we’ll pass a tuple whole, unpack it with *, use *args, and handle lists of tuples and keyword arguments.

Pass a tuple as a single argument

When the values belong together, like an address, pass the tuple itself and unpack it inside the function:

def ship_label(address):
    street, city, state = address        # unpack inside the function
    return f"{street}, {city}, {state}"

office = ("350 5th Ave", "New York", "NY")
print(ship_label(office))

Output:

350 5th Ave, New York, NY
Command Prompt output of a Python function that receives an address tuple as one argument and unpacks it
The function gets one tuple and builds the label from it.

This is the mirror image of returning a tuple from a Python function, where one function hands several values back as a single tuple.

Unpack a tuple into function arguments with the * operator

If the function expects separate parameters, add * at the call site. Python spreads the tuple across the parameters in order. The item count must match, or you get a TypeError:

def ship_label(street, city, state):
    return f"{street}, {city}, {state}"

office = ("350 5th Ave", "New York", "NY")
print(ship_label(*office))               # same as ship_label("350 5th Ave", "New York", "NY")

try:
    ship_label(*("1 Main St", "Austin"))
except TypeError as e:
    print("TypeError:", e)

Output:

350 5th Ave, New York, NY
TypeError: ship_label() missing 1 required positional argument: 'state'
Command Prompt output of Python passing a tuple to a function with the * operator and a TypeError for a missing argument
*office fills street, city and state; the two-item tuple fails because state is missing.

The same star works outside function calls too; see unpacking a tuple in Python for starred assignment and ignoring values with _.

How does *args turn arguments into a tuple?

* in the def line does the reverse: it packs any number of positional arguments into a tuple, whether they come from *cart or loose values:

def order_total(*prices):
    print("prices is a", type(prices).__name__, prices)
    return round(sum(prices), 2)

cart = (19.99, 5.25, 3.50)
print(order_total(*cart))
print(order_total(cart[0], 10.00))

Output:

prices is a tuple (19.99, 5.25, 3.5)
28.74
prices is a tuple (19.99, 10.0)
29.99
Command Prompt output of a Python *args function showing prices collected into a tuple and summed
Both calls arrive inside the function as a tuple.

I cover the keyword side, **kwargs, in the difference between *args and **kwargs in Python.

Pass a list of tuples to a function

With rows of data, loop over the list and unpack each tuple into the call, or let itertools.starmap() do it:

from itertools import starmap

def line_total(item, qty, price):
    return f"{item:<8} {qty} x ${price:.2f} = ${qty * price:.2f}"

orders = [("Mug", 2, 12.50), ("Poster", 1, 24.00), ("Pen", 10, 1.25)]

for order in orders:
    print(line_total(*order))

print(list(starmap(line_total, orders))[0])

Output:

Mug      2 x $12.50 = $25.00
Poster   1 x $24.00 = $24.00
Pen      10 x $1.25 = $12.50
Mug      2 x $12.50 = $25.00
Command Prompt output of Python passing each tuple in a list to a function with * and itertools.starmap
Each order tuple becomes item, quantity and price; starmap() returns the same first line.

For more ways to walk through rows like these, read iterating through tuples in Python.

Mix a tuple with keyword arguments

You can unpack a tuple for the first parameters and pass the rest by name with a ** dict:

def invoice(customer, amount, currency="USD", due="2026-11-15"):
    return f"{customer}: {amount:.2f} {currency}, due {due}"

row = ("Emily Carter", 149.5)
options = {"due": "2026-12-01"}
print(invoice(*row))
print(invoice(*row, **options))

Output:

Emily Carter: 149.50 USD, due 2026-11-15
Emily Carter: 149.50 USD, due 2026-12-01

Keyword values have to come after the unpacked tuple. Defaults like currency="USD" are explained in Python functions with optional arguments.

Can a function change a tuple you pass in?

No. Tuples are immutable, so item assignment raises an error. Return a new tuple instead:

def add_tax(prices):
    try:
        prices[0] = prices[0] * 1.08
    except TypeError as e:
        print("TypeError:", e)
    return tuple(round(p * 1.08, 2) for p in prices)

cart = (10.00, 20.00)
new_cart = add_tax(cart)
print(cart, new_cart)

Output:

TypeError: 'tuple' object does not support item assignment
(10.0, 20.0) (10.8, 21.6)

The original cart stays the same. Why that happens is covered in mutable vs immutable in Python, and you can document tuple parameters with type hints for tuples.

Once you’re comfortable with this, these guides go a step further:

Frequently asked questions

How do I pass a tuple to a function in Python?

Call f(t) to pass the tuple as one argument, or f(*t) to pass each item as a separate argument.

What does the * do before a tuple in a function call?

It unpacks the tuple, so f(*(1, 2)) runs as f(1, 2).

Why do I get “missing 1 required positional argument”?

The tuple has fewer items than the function has parameters. Add the value or give that parameter a default.

Is *args a tuple or a list?

A tuple. Python packs the extra positional arguments into a tuple every time.

Can I pass a list with * the same way?

Yes. * unpacks any iterable, including lists and ranges.

Where is argument unpacking documented?

See Unpacking argument lists in the Python tutorial.