bugl
bugl
HomeLearnPatternsPathsSearch
HomeLearnPatternsPathsSearch

Loading lesson path

Learn/Python/Foundations
Python•Foundations

Python *args and **kwargs

Flash cards

Review the key moves

1/4
Core idea

What is the main idea behind Python *args and **kwargs?

Lesson checks

Practice each idea before moving on

Short Mimo-style checks built from this lesson's code, terms, and sequence.

1Quick choice

Which statement best captures the main point of this lesson?

2Fill blank

Complete the missing token from the example code.

___ my_function(
3Order

Put the learning moves in the order that makes the concept easiest to apply.

Using *args with Regular Arguments
Arbitrary Arguments - *args
*args and **kwargs

*args and **kwargs

By default, a function must be called with the correct number of arguments.

However, sometimes you may not know how many arguments that will be passed into your function.

*args and **kwargs allow functions to accept a unknown number of arguments.

Arbitrary Arguments - *args

If you do not know how many arguments will be passed into your function, add a * before the parameter name.

This way, the function will receive a tuple of arguments and can access the items accordingly:

Example

def my_function(
*kids
):
  print("The youngest child is " + kids[2])

  my_function("Emil", "Tobias", "Linus")

Arbitrary Arguments are often shortened to *args in Python documentation.

What is *args?

The *args parameter allows a function to accept any number of positional arguments.

Inside the function, args becomes a tuple containing all the passed arguments:

Example

def my_function(*args):
  print("Type:", type(args))
  print("First argument:", args[0])
  print("Second argument:", args[1])
  print("All arguments:", args)

  my_function("Emil", "Tobias", "Linus")

Using *args with Regular Arguments

You can combine regular parameters with *args.

Regular parameters must come before *args:

Example

def my_function(greeting, *names):
  for name in names:
    print(greeting, name)

    my_function("Hello", "Emil", "Tobias", "Linus")

In this example, "Hello" is assigned to greeting , and the rest are collected in names .

Practical Example with *args

*args is useful when you want to create flexible functions:

Example

def my_function(*numbers):
  total = 0
  for num in numbers:
    total += num
    return total

print(my_function(1, 2, 3))
print(my_function(10, 20, 30, 40))
print(my_function(5))

Example

def my_function(*numbers):
  if len(numbers) == 0:
    return None
  max_num = numbers[0]
  for num in numbers:
    if num > max_num:
      max_num = num
      return max_num

print(my_function(3, 7, 2, 9, 1))

Arbitrary Keyword Arguments - **kwargs

If you do not know how many keyword arguments will be passed into your function, add two asterisks ** before the parameter name.

This way, the function will receive a dictionary of arguments and can access the items accordingly:

Example

def my_function(
**kid
):
  print("His last name is " + kid["lname"])

  my_function(fname = "Tobias", lname = "Refsnes")

Arbitrary Keyword Arguments are often shortened to **kwargs in Python documentation.

What is **kwargs?

The **kwargs parameter allows a function to accept any number of keyword arguments.

Inside the function, kwargs becomes a dictionary containing all the keyword arguments:

Example

def my_function(**myvar):
  print("Type:", type(myvar))
  print("Name:", myvar["name"])
  print("Age:", myvar["age"])
  print("All data:", myvar)

  my_function(name = "Tobias", age = 30, city = "Bergen")

Using **kwargs with Regular Arguments

You can combine regular parameters with **kwargs.

Regular parameters must come before **kwargs:

Example

def my_function(username, **details):
  print("Username:", username)
  print("Additional details:")
  for key, value in details.items():
    print(" ", key + ":", value)

    my_function("emil123", age = 25, city = "Oslo", hobby = "coding")

Combining *args and **kwargs

You can use both *args and **kwargs in the same function.

The order must be: regular parameters *args **kwargs

  • regular parameters
  • *args
  • **kwargs

Example

def my_function(title, *args, **kwargs):
  print("Title:", title)
  print("Positional arguments:", args)
  print("Keyword arguments:", kwargs)

  my_function("User Info", "Emil", "Tobias", age = 25, city = "Oslo")

Unpacking Arguments

The * and ** operators can also be used when calling functions to unpack (expand) a list or dictionary into separate arguments.

Unpacking Lists with *

If you have values stored in a list, you can use * to unpack them into individual arguments:

Example

def my_function(a, b, c):
  return a + b + c

numbers = [1, 2, 3]
result = my_function(*numbers)  # Same as: my_function(1, 2, 3)
print(result)

Unpacking Dictionaries with **

If you have keyword arguments stored in a dictionary, you can use ** to unpack them:

Example

def my_function(fname, lname):
  print("Hello", fname, lname)

  person = {"fname": "Emil", "lname": "Refsnes"}
  my_function(**person)  # Same as: my_function(fname="Emil", lname="Refsnes")

Remember

Use * and ** in function definitions to collect arguments, and use them in function calls to unpack arguments.

Previous

Python Function Arguments

Next

Python Scope