All Course > Python > Functions And Modules Oct 08, 2023

Defining and Calling Python Functions

Python functions are the building blocks of reusable code. They allow programmers who might be beginners or advanced users, to segment their code into manageable, reusable parts that perform specific tasks. This article aims to guide you through defining and calling functions in Python. in addition to taht it provides practical examples to enhance your understanding to write cleaner, more efficient code, which helps in both simple scripts and complex systems.

Defining Functions in Python

To define a function in Python you use the def keyword followed by the function name and parentheses. This basic structure forms the foundation of all Python programming. Consider a simple function that adds two numbers bellow.

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

This function, named add_numbers, takes two arguments and returns their sum. It demonstrates how functions can simplify tasks that you might need to perform repeatedly. Best practices for defining functions include using clear, descriptive names for both the function and its parameters, which makes the code easier to follow and maintain.

Function Parameters and Arguments

In Python, functions can take parameters, which are like variables listed in the function’s definition. These parameters are placeholders for the values, known as arguments, which are passed to the function when it is called. The parameters are defined inside the parentheses following the function name. The arguments, which correspond to these parameters, are the actual values you provide when you call the function.

For example, consider a function add(a, b) that takes two parameters, a and b. When you call add(2, 3), the values 2 and 3 are the arguments, which are assigned to the parameters a and b, respectively. The function then uses these values to perform its operations.

You can also use default parameters, which have a default value if no argument is passed. For instance, in the function greet(name="World"), if no argument is provided, name will be set to “World”. This is useful in situations where a common default value is needed.

What are *args and **kwargs in Python?

Python allows for flexible arguments using *args and **kwargs, which enable a function to accept an arbitrary number of positional and keyword arguments, respectively. This is particularly helpful when you don’t know in advance how many arguments might be passed to the function.

Here’s an example demonstrating the use of args and *kwargs in Python.

def print_info(*args, **kwargs):
    # Handling positional arguments
    print("Positional arguments:")
    for arg in args:
        print(arg)

    # Handling keyword arguments
    print("\nKeyword arguments:")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# Calling the function with multiple positional and keyword arguments
print_info("apple", "banana", "cherry", name="Alice", age=30, city="Wonderland")

When the function print_info is called with the arguments “apple”, “banana”, “cherry” (positional) and name=”Alice”, age=30, city=”Wonderland” (keyword), it prints the following output.

Positional arguments:
apple
banana
cherry

Keyword arguments:
name: Alice
age: 30
city: Wonderland

The order of arguments in Python

In Python, when defining a function, the order of arguments matters. The proper order is bellow.

  1. Positional arguments
  2. Positional-only arguments (if any, introduced in Python 3.8)
  3. Keyword arguments
  4. Default arguments
  5. Variable positional arguments (*args)
  6. Keyword-only arguments
  7. Variable keyword arguments (**kwargs)

Here’s a function definition demonstrating this order.

def example(pos1, pos2, /, pos_or_kw, *, kw_only, **kwargs):
pass

Positional arguments: These are the normal parameters that must be provided in the order they appear.

def example(a, b):
pass

Positional-only arguments: Introduced in Python 3.8, these can only be provided by position, not by keyword. They are defined using a slash (/)

def example(a, b, /):
pass

Keyword arguments: These can be provided by position or by keyword.

def example(a, b, c):
pass

Default arguments: These have default values if no argument is provided.

def example(a, b, c=3):
pass

Variable positional arguments (*args): These allow for an arbitrary number of positional arguments.

def example(a, b, *args):
pass

Keyword-only arguments: These must be provided by keyword and are defined after an asterisk (*).

def example(a, b, *, d):
pass

Variable keyword arguments (**kwargs): These allow for an arbitrary number of keyword arguments.

def example(a, b, **kwargs):
pass

Here’s an example combining all types.

def complex_example(a, b=2, *args, c=3, d, **kwargs):
    print(a, b)  # Positional and default arguments
    print(args)  # Variable positional arguments
    print(c, d)  # Keyword-only arguments
    print(kwargs)  # Variable keyword arguments

# Calling the function
complex_example(1, 4, 5, 6, d=7, e=8, f=9)

In the call complex_example(1, 4, 5, 6, d=7, e=8, f=9):

  • 1 and 4 are for a and b.
  • 5 and 6 are collected into args.
  • d is a keyword-only argument.
  • e and f are collected into kwargs.

This call will print bellow output.

1 4
(5, 6)
3 7
{'e': 8, 'f': 9}

Calling Functions in Python

Once a function is defined, calling it is straightforward. You simply use the function name followed by parentheses enclosing any required arguments. This action executes the function and returns its result.

For instance, using a function called add_numbers , you can add two numbers as follows.

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

result = add_numbers(5, 3)
print(result)  # Output: 8

Tips and Tricks for Using Python Functions

When writing functions there are several tips you can follow to make your code more efficient and understandable. Documenting your functions with docstrings, which explain what the function does, its parameters, and its return value, is a good practice. This habit helps others understand your code, which can be particularly useful in team environments or open-source projects.

def multiply(a, b):
    """
    Multiply two numbers together.

    Args:
        a (int or float): First number
        b (int or float): Second number

    Returns:
        int or float: The product of the numbers
    """
    return a * b

Error handling is another important aspect of writing robust functions. Using try-except blocks within your functions can prevent your program from crashing due to unexpected errors.

Conclusion

Python functions are essential for writing concise and effective code. By understanding how to define and call functions, you can enhance your coding projects and contribute more effectively to your development team. The examples provided here should help you get started on the right foot.

FAQ

Q: Can you use default arguments in any Python function?
A: Yes, default arguments can be used in any function to provide default values for parameters, which helps make function calls more flexible.

Q: How important are docstrings in Python functions?
A: Docstrings are very important as they document what the function does, making the code easier to understand and maintain.

Q: What is the difference between *args and **kwargs?
A: *args is used to pass a variable number of non-keyword arguments to a function, while **kwargs allows you to pass variable numbers of keyword arguments.

Comments

There are no comments yet.

Write a comment

You can use the Markdown syntax to format your comment.