Using the def statement is the most common way to define a function in python. This statement is a so called single clause compound statement with the following syntax:

def function_name(parameters):
    statement(s)

function_name is known as the identifier of the function. Since a function definition is an executable statement its execution binds the function name to the function object which can be called later on using the identifier.

parameters is an optional list of identifiers that get bound to the values supplied as arguments when the function is called. A function may have an arbitrary number of arguments which are separated by commas.

statement(s) – also known as the function body – are a nonempty sequence of statements executed each time the function is called. This means a function body cannot be empty, just like any indented block.

Here’s an example of a simple function definition which purpose is to print Hello each time it’s called:

def greet():
    print("Hello")

Now let’s call the defined greet() function:

greet()
# Out: Hello

That’s an other example of a function definition which takes one single argument and displays the passed in value each time the function is called:

def greet_two(greeting):
    print(greeting)

After that the greet_two() function must be called with an argument:

greet_two("Howdy")
# Out: Howdy

Also you can give a default value to that function argument:

def greet_two(greeting="Howdy"):
    print(greeting)

Now you can call the function without giving a value:

greet_two()
# Out: Howdy

You’ll notice that unlike many other languages, you do not need to explicitly declare a return type of the function. Python functions can return values of any type via the return keyword. One function can return any number of different types!

def many_types(x):
    if x < 0:
        return "Hello!"
    else:
        return 0

print(many_types(1))
print(many_types(-1))

# Output:
0
Hello!

As long as this is handled correctly by the caller, this is perfectly valid Python code.