Functions in Python: definition, call, parameters and return

онлайн тренажер по питону
Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Introduction to Python Functions

Functions are the cornerstone of structured and modular programming. They allow you to break down code into logical blocks, reuse it, and make programs readable and scalable.

Python offers a powerful and flexible mechanism for working with functions. In this article, we will take a detailed look at the main aspects of working with functions in Python: definition, calling, parameters, return values, and best programming practices.

What is a Function in Python?

A function is a named block of code that can be called repeatedly to perform a specific task. Python functions can take arguments and return values. They are a key element of modular programming and avoid code duplication.

The main advantages of using functions:

  • Code reuse
  • Better program organization
  • Simplified testing and debugging
  • Reduced program complexity

Defining a Function: The def Keyword

The def keyword is used to define a function in Python. The function definition syntax includes several required elements.

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

Function Definition Structure

  • def - keyword for defining a function
  • greet - the name of the function (must follow the rules for naming variables)
  • () - parentheses for parameters (can be empty)
  • : - colon, indicating the beginning of the function body
  • Indentation - required indentation (usually 4 spaces) for the function body

Rules for Naming Functions

When naming functions, follow these rules:

  • Use only letters, numbers, and underscores
  • Start with a letter or underscore
  • Use snake_case for multi-word names
  • Choose descriptive names

Calling a Function in Python

To call a Python function, use its name with parentheses. The Python function call is executed where the function name with parentheses is written.

greet()  # Output: Hello, world!

Features of Calling Functions

How to call a function in Python correctly:

  • Specify the exact name of the function
  • Put parentheses after the name
  • Pass the required arguments in parentheses
  • Make sure the function is defined before the call site

Function Parameters and Arguments

Python functions can accept parameters for processing various data. Parameters make functions more flexible and versatile.

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

greet("Alice")  # Hello, Alice!

Positional and Named Arguments

Python supports different ways to pass arguments to functions:

def user_info(name, age):
    print(f"{name} is {age} years old")

# Positional arguments
user_info("Ivan", 30)

# Named arguments
user_info(age=25, name="Olga")

Positional arguments are passed in the order in which the parameters are defined. Named arguments allow you to specify a value for a specific parameter by name.

Default Parameters

Default parameters allow you to call a function without passing all the arguments:

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

greet()          # Hello, guest!
greet("Kate")    # Hello, Kate!

Arbitrary Number of Arguments

Using *args

The *args parameter allows you to pass an arbitrary number of positional arguments to a function:

def summation(*args):
    print(f"Sum of numbers: {sum(args)}")
    print(f"Number of arguments: {len(args)}")

summation(1, 2, 3)        # Sum: 6, Number: 3
summation(1, 2, 3, 4, 5)  # Sum: 15, Number: 5
Using **kwargs

The **kwargs parameter allows you to pass an arbitrary number of named arguments:

def print_info(**kwargs):
    print("Information:")
    for key, value in kwargs.items():
        print(f"  {key} = {value}")

print_info(name="Oleg", age=34, city="Moscow")

Combining Different Types of Parameters

You can combine different types of parameters in one function:

def complex_function(required, default="value", *args, **kwargs):
    print(f"Required: {required}")
    print(f"Default: {default}")
    print(f"Positional: {args}")
    print(f"Named: {kwargs}")

Returning Values: The return Operator

The return operator in Python completes the execution of a function and returns the result to the call site. Python return is a key mechanism for getting the results of a function.

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

sum_result = add(2, 3)
print(sum_result)  # 5

Returning Multiple Values

Python allows you to return multiple values at the same time:

def calculate(a, b):
    sum_val = a + b
    diff_val = a - b
    product = a * b
    return sum_val, diff_val, product

s, d, p = calculate(10, 5)
print(f"Sum: {s}, Difference: {d}, Product: {p}")

Functions Without return

If return is not specified, the function returns None:

def do_nothing():
    print("Doing something...")
    pass

result = do_nothing()
print(result)  # None

Conditional Return Values

return can be used with conditional constructs:

def absolute_value(x):
    if x >= 0:
        return x
    else:
        return -x

Advanced Function Features

Functions as First-Class Objects

In Python, functions are first-class objects. This means they can be:

  • Assigned to variables
  • Passed as arguments
  • Returned from other functions
  • Stored in data structures
def square(x):
    return x * x

# Assigning a function to a variable
f = square
print(f(4))  # 16

# Passing a function as an argument
def apply_function(func, value):
    return func(value)

result = apply_function(square, 5)
print(result)  # 25

Nested Functions

Python supports defining functions inside other functions:

def outer_function(x):
    def inner_function(y):
        return y * 2
    
    result = inner_function(x)
    return result + 10

print(outer_function(5))  # 20

Closures

Closures allow inner functions to access variables of the outer function:

def multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply

double = multiplier(2)
triple = multiplier(3)

print(double(5))  # 10
print(triple(5))  # 15

Recursive Functions

A function can call itself - this is called recursion:

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

print(factorial(5))  # 120
Important Aspects of Recursion
  • There must be a base condition (stopping condition)
  • Each recursive call must approach the base condition
  • The depth of recursion is limited in Python

Type Annotations in Functions

Python supports type annotations to improve code readability:

def greet(name: str, age: int) -> str:
    return f"Hello, {name}! You are {age} years old."

def calculate_area(length: float, width: float) -> float:
    return length * width

Type annotations do not affect code execution, but they help:

  • Improve code understanding
  • Use static analysis tools
  • Document expected data types

Practical Examples of Use

Input Data Validator

def validate_email(email: str) -> bool:
    if "@" not in email:
        return False
    if "." not in email.split("@")[1]:
        return False
    return True

def validate_age(age: int) -> str:
    if age < 0:
        return "Invalid age: cannot be negative"
    elif age > 150:
        return "Invalid age: too big"
    else:
        return "Age accepted"

Mathematical Calculations

def average(*numbers):
    if not numbers:
        return 0
    return sum(numbers) / len(numbers)

def find_maximum(*args):
    if not args:
        return None
    return max(args)

String Processing

def format_name(first_name: str, last_name: str, middle_name: str = "") -> str:
    if middle_name:
        return f"{last_name}, {first_name} {middle_name}"
    else:
        return f"{last_name}, {first_name}"

Types of Function Parameters

Parameter Type Syntax Description Usage Example
Positional def func(a, b) Passed in order func(1, 2)
Default def func(a=1) Used when there is no argument func() or func(5)
*args def func(*args) Any number of positional func(1, 2, 3, 4)
**kwargs def func(**kwargs) Any number of named func(a=1, b=2)
Positional Only def func(a, /) Positional transfer only func(1)
Named Only def func(*, a) Named transfer only func(a=1)

Best Programming Practices

Principles of Writing Functions

  • One function - one task: each function should perform only one clearly defined task
  • Descriptive names: use understandable names that reflect the purpose of the function
  • Size limit: the function should not be too long (recommended up to 20-30 lines)
  • Minimizing side effects: avoid changing global variables

Documenting Functions

def calculate_compound_interest(principal: float, rate: float, time: int) -> float:
    """
    Calculates compound interest using the formula A = P(1 + r)^t
    
    Args:
        principal: Initial amount
        rate: Annual interest rate (in decimal form)
        time: Number of years
    
    Returns:
        Total amount with interest
    """
    return principal * (1 + rate) ** time

Error Handling

def safe_divide(a: float, b: float) -> float:
    """Safe division with handling of division by zero"""
    try:
        if b == 0:
            raise ValueError("Division by zero is not possible")
        return a / b
    except TypeError:
        raise TypeError("Arguments must be numbers")

Frequently Asked Questions

  • How to call a function in Python? To call a function, you need to write its name with parentheses. Arguments are specified inside parentheses, separated by commas.
  • What does return do in Python? The return operator completes the execution of a function and returns the specified value to the function call site.
  • Why are *args and **kwargs needed? *args allows you to pass an arbitrary number of positional arguments, and **kwargs - an arbitrary number of named arguments.
  • Is it possible to call a function from a function? Yes, Python supports nested function calls and recursion.
  • How to pass a function as an argument? A function can be passed as an argument using its name without parentheses: func(other_func).
  • What happens if you don't specify return? The function will automatically return the value None.

Conclusion

Functions in Python are a powerful tool that makes code modular, readable, and flexible. From the simplest def definitions to complex constructs with closures, *args, **kwargs and return, all of this forms the basis of effective programming in Python.

Proper use of functions helps to:

  • Reuse code in different parts of the program
  • Simplify testing and debugging applications
  • Isolate logic and create independent modules
  • Speed up the process of developing and maintaining code
  • Improve readability and understanding of the program

Learning Python functions is a fundamental skill for any developer. By mastering the basic principles of working with functions, you can create higher quality and more professional code.

News