Use the official Python tutorial on defining functions as your reference: every function starts with def, followed by a name, parentheses for parameters, a trailing colon, and an indented block that runs when the function is called.

Method 1 — Create and Call a Basic Function

Step 1: Declare a function with def and a colon.

def greet():
    print("Hello from a function!")

Step 2: Call the function using its name with parentheses.

greet()

This establishes the minimal pattern: definition first, call after. Python executes top to bottom, so a function must be defined before it’s called.


Method 2 — Add Parameters and Defaults

Step 1: Add parameters inside the parentheses to accept inputs.

def full_name(first, last):
    print(first + " " + last)

Step 2: Call the function with matching arguments.

full_name("Ada", "Lovelace")

Step 3: Assign a default value with = to make an argument optional.

def hello(name="World"):
    print(f"Hello, {name}!")

hello()          # uses default
hello("Python")  # overrides default

Defaults simplify callers and keep your API stable when adding optional behavior. See default arguments in the official tutorial.


Method 3 — Return Values

Step 1: Use return to send a value back to the caller.

def area(w, h):
    return w * h

Step 2: Capture the returned value in a variable.

a = area(3, 4)
print(a)

Step 3: Return multiple values (they’re packed into a tuple).

def point():
    return 10, 20

x, y = point()

Details of the return statement are covered in the language reference.


Method 4 — Accept a Variable Number of Arguments

Step 1: Collect extra positional arguments with *args.

def total(*args):
    return sum(args)

print(total(1, 2, 3))

Step 2: Collect keyword arguments with **kwargs.

def report(**kwargs):
    for k, v in kwargs.items():
        print(k, "=", v)

report(name="Keyboard", price=19.99)

This interface lets your function flex to diverse inputs. See “Arbitrary argument lists” in the official tutorial.


Method 5 — Control How Callers Pass Arguments

Step 1: Make some parameters positional-only by adding / after them.

def echo(x, /):
    print(x)

echo(3)      # OK
# echo(x=3)  # TypeError

Step 2: Make parameters keyword-only by adding * before them.

def scale(value, *, factor=2):
    return value * factor

scale(10, factor=3)  # OK
# scale(10, 3)       # TypeError

Use these to design clear, safe APIs. See “Special parameters” in the official tutorial.


Method 6 — Document and Organize Your Function

Step 1: Add a docstring on the first line of the body to describe purpose, parameters, and return value.

def hypotenuse(a, b):
    """Compute the length of the hypotenuse from legs a and b."""
    return (a**2 + b**2) ** 0.5

Step 2: Guard script-only calls with if __name__ == "__main__" so imports don’t execute them.

def main():
    print(hypotenuse(3, 4))

if __name__ == "__main__":
    main()

Docstring conventions are defined in PEP 257, and the __main__ pattern is covered in the docs on executing modules as scripts.


Method 7 — Use a Lambda for Simple One‑Liners

Step 1: Create a small anonymous function with lambda for quick, single‑expression cases.

double = lambda x: x * 2
print(double(5))

Step 2: Prefer def when you need statements, a docstring, or reuse.

def double_def(x):
    return x * 2

Lambda syntax is specified in the language reference.


Method 8 — Place Definitions Where They’ll Be Executed Before Use

Step 1: Define functions before the first call in the file to avoid name errors.

# Correct: defined before use
def hello():
    print("Hello")

hello()

Step 2: Avoid calling a function before its definition is executed; Python resolves names at runtime, top to bottom.

# This will raise NameError at runtime:
# hello()
# def hello():
#     print("Hello")

Step 3: Optionally define helper functions inside another function to keep scope local.

def outer():
    def inner():
        return "scoped helper"
    return inner()

Quick Tips

  • “Parameters” are the names in the function header; “arguments” are the values you pass in the call.
  • Use pass as a placeholder when stubbing a function body.
  • Keep functions small and focused; this simplifies testing and reuse.

With def, thoughtful parameters, and clear returns, you’ll write functions that are easy to call, test, and extend. Start simple, then add defaults, *args/**kwargs, and argument rules as your API needs grow.