Python: Function

By Xah Lee. Date: . Last updated: .

Here's a example of defining a function.

def ff(x, y):
    """ff(x, y) returns x+y."""
    return x+y

print(ff(3,4))
# 7

A string immediately following the function def line is the function's documentation.

return is optional. If a function does not return statement, it returns None.

Unspecified Number of Positional Parameters

To define unspecified number of positional parameters, use *name as last item. Your function will receive it as a Tuple .

# function with unspecified number of args
def ff(*x):
    # x is received as a tuple.
    return x

rr = ff(5,6)

print(rr)
# (5, 6)

print(type(rr))
# <class 'tuple'>

Named Parameters (Keyword Arguments)

A function can have Named Parameters, called Keyword Argument in Python.

Python's “keyword argument” are automatically optional. If no argument is given in a function call, a default value is used.

# function with keyword parameters.

# Keyword parameters are automatically optional, with default values.
# They must come after positional parameters, if any
def ff(x, y=100, z=200):
    return "x ⇒ {}, y ⇒ {}, z ⇒ {}".format(x, y, z)

print(ff(3))
# x ⇒ 3, y ⇒ 100, z ⇒ 200

# optional parameter name can be omitted. If so, they go by order.
print(ff(3, 2))
# x ⇒ 3, y ⇒ 2, z ⇒ 200

print(ff(3, 5, 6))
# x ⇒ 3, y ⇒ 5, z ⇒ 6

# keyword argument must come after positional arguments
print(ff(3, y=2))
# x ⇒ 3, y ⇒ 2, z ⇒ 200

print(ff(3, z=2))
# x ⇒ 3, y ⇒ 100, z ⇒ 2

# keyword arguments can be any order
print(ff(3, z=8, y=9))
# x ⇒ 3, y ⇒ 9, z ⇒ 8

Unspecified Number of Unnamed Keyword Parameters

For unspecified number of unnamed keyword parameters. You need to put a **name as last item in your parameter list in definition. Your function will receive it as a dictionary.

# unspecified number of keyword args
def ff(**dd):
    return dd

rr = ff( z = 8, c = 7, aa = 4, b = 3)

print(rr)
# {'z': 8, 'c': 7, 'aa': 4, 'b': 3}

print(type(rr))
# <class 'dict'>

The **name can be used with normal paramaters. But it must be the last.

def ff(a, b=1, c=1, **xyz):
    # xyz is a dictionary
    print("a is: ", a)
    print("b is: ", b)
    print("c is: ", c)
    print("xyz is: ", xyz)

# note, no b
ff(3, rabbit = 7, cat = "a", tiger = 33, c = 8)

# a is:  3
# b is:  1
# c is:  8
# xyz is:  {'rabbit': 7, 'cat': 'a', 'tiger': 33}

The positional parameters, and *tup tuple and **dict dictionary can be used together, but tuple must come first.

def ff(a, *mmm, **zzz):
    # mmm is a tuple
    # zzz is a dictionary
    print("a is:", a)
    print("mmm is:", mmm)
    print("zzz is:", zzz)

ff(3, 4, 5, 6, rabbit = 7, cat = 9, tiger = 33)

# a is: 3
# mmm is: (4, 5, 6)
# zzz is: {'rabbit': 7, 'cat': 9, 'tiger': 33}