Python - Functions

4 minute read

Functions are the building blocks of any programming language, including Python. They allow you to encapsulate code into reusable blocks, making your programs more modular and easier to understand. But what exactly are functions, and why are they so crucial in Python programming?

Basics of Python Functions

In Python, you define a function using the def keyword, followed by the function name and parentheses. Here’s a basic example:

def greet():
    print("Hello, World!")

Function Syntax

The syntax for a function in Python is simple:

def function_name(parameters):
    # function body
    return value

Calling a Function

Once you’ve defined a function, you can call it by its name followed by parentheses:


Types of Functions

Built-in Functions

Python comes with a variety of built-in functions like print(), len(), and type() that you can use without defining them yourself.

User-defined Functions

These are functions that you define to perform specific tasks. For example:

def add(a, b):
    return a + b

Creating a Simple Function

Let’s create a simple function that adds two numbers:

def add_numbers(a, b):
    return a + b

result = add_numbers(5, 3)

Explanation of the Example

In this example, the add_numbers function takes two arguments a and b, adds them, and returns the result. We then call the function with the arguments 5 and 3, and print the result.

Function Arguments

Positional Arguments

These are arguments that are passed to a function in the correct positional order.

def greet(name):
    print(f"Hello, {name}!")

Keyword Arguments

These are arguments passed to a function by explicitly naming each parameter and its value.


Default Arguments

You can provide default values for arguments, which are used if no value is provided.

def greet(name="Guest"):
    print(f"Hello, {name}!")

Variable-length Arguments

These allow you to pass a variable number of arguments to a function using *args and **kwargs.

def greet(*names):
    for name in names:
        print(f"Hello, {name}!")

Returning Values from Functions

The return Statement

The return statement is used to send a function’s result back to the caller.

def square(number):
    return number ** 2

Returning Multiple Values

A function can return multiple values as a tuple.

def get_coordinates():
    return (10, 20)

x, y = get_coordinates()

Scope and Lifetime of Variables

Local and Global Variables

Variables defined inside a function are local, while those defined outside are global.

x = 10  # global

def foo():
    x = 5  # local

Variable Scope Rules

Python follows the LEGB rule: Local, Enclosing, Global, Built-in.

Lambda Functions

Introduction to Lambda Functions

Lambda functions are small anonymous functions defined with the lambda keyword.

square = lambda x: x ** 2

Syntax and Use Cases

Lambda functions are useful for short functions that are used only once.

Higher-order Functions

Functions as First-Class Objects

In Python, functions are first-class objects, meaning they can be passed as arguments and returned from other functions.

def shout(text):
    return text.upper()

def whisper(text):
    return text.lower()

def greet(func):
    greeting = func("Hello, World!")


Map, Filter, and Reduce Functions

These functions allow you to apply a function to a sequence of elements.

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))

Decorators in Python

Understanding Decorators

Decorators are a way to modify or enhance functions without changing their code.

def decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        print("Something is happening after the function is called.")
    return wrapper

def say_hello():


Creating and Using Decorators

Decorators are created using functions and the @ symbol.

Recursive Functions

What is Recursion?

Recursion is a method of solving problems where a function calls itself.

Example of a Recursive Function

def factorial(n):
    if n == 1:
        return 1
        return n * factorial(n-1)


Error Handling in Functions

Using try and except Blocks

You can handle errors in functions using try and except blocks.

def divide(a, b):
        return a / b
    except ZeroDivisionError:
        return "Division by zero is not allowed."

print(divide(10, 2))
print(divide(10, 0))

Raising Exceptions

You can raise exceptions using the raise keyword.

def check_positive(number):
    if number <= 0:
        raise ValueError("Number must be positive")
    return number


Function Annotations

Introduction to Function Annotations

Function annotations provide a way of associating various parts of a function with arbitrary python expressions at compile-time.

def greet(name: str) -> str:
    return f"Hello, {name}"

Benefits and Examples

Annotations can help with type hinting and documentation.

Practical Examples of Functions

Real-world Examples

Let’s look at a practical example of using functions to calculate the area of different shapes.

def area_of_circle(radius):
    import math
    return math.pi * (radius ** 2)

def area_of_rectangle(length, width):
    return length * width

def area_of_triangle(base, height):
    return 0.5 * base * height

print(f"Area of Circle: {area_of_circle(5)}")
print(f"Area of Rectangle: {area_of_rectangle(4, 6)}")
print(f"Area of Triangle: {area_of_triangle(3, 7)}")

Detailed Explanation of Each Example

  1. Circle: The function area_of_circle calculates the area using the formula πr².
  2. Rectangle: The function area_of_rectangle calculates the area using the formula length × width.
  3. Triangle: The function area_of_triangle calculates the area using the formula 0.5 × base × height.


Functions are a fundamental aspect of Python programming. They help in organizing code into reusable blocks, making it more readable and maintainable. Understanding how to define and use functions effectively