Возвращаемое значение функции в Python

Раздел: Основы Python -> Функции

Основы возврата значений

Оператор return в Python завершает выполнение функции и передаёт значение обратно в вызвавший код. Если return не указан, функция возвращает None. Понимание возвращаемых значений - ключ к написанию переиспользуемых и предсказуемых функций.

Как вернуть одно значение из функции?

Самый простой и распространённый вариант - указать после return выражение. Функция вычисляет его и немедленно возвращает результат.

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

result = add(3, 5)
print(result)  # 8

аргументы print python (аргументы функции print в python)

Если необходимо завершить функцию раньше, можно использовать несколько операторов return в разных ветках условия.

def check_positive(num):
    if num > 0:
        return "Positive"
    elif num < 0:
        return "Negative"
    return "Zero"

print(check_positive(10))   # Positive
print(check_positive(-5))   # Negative
print(check_positive(0))    # Zero

Python 3 аргументы (аргументы в python 3)

Типичная ошибка: забыть написать return в одной из ветвей. Функция тогда вернёт None, что может привести к неожиданным результатам.

def faulty(num):
    if num > 0:
        return "Positive"
    # пропущен return для отрицательных и нуля

print(faulty(-1))  # None

аргумент параметр python (аргументы и параметры в python)

Как вернуть несколько значений?

Python позволяет возвращать несколько значений, разделённых запятыми. Они упаковываются в кортеж.

def get_stats(numbers):
    return min(numbers), max(numbers), sum(numbers)/len(numbers)

mn, mx, avg = get_stats([1, 2, 3, 4, 5])
print(f"Min={mn}, Max={mx}, Avg={avg}")

аргумент класса python (аргументы класса python)

Min=1, Max=5, Avg=3.0

Python аргументы строки (аргументы строки в python (командная строка))

Если количество возвращаемых значений велико, такой подход может затруднить чтение кода. Альтернатива - использовать словарь или именованный кортеж.

Как вернуть набор именованных данных?

Возврат словаря явно задаёт имена полям, улучшая читаемость.

def get_user(name, age):
    return {"name": name, "age": age, "is_adult": age >= 18}

user = get_user("Anna", 22)
print(user["is_adult"])  # True

аргумент метода python (аргументы метода python)

Как вернуть изменяемую коллекцию (список)?

Функция может возвращать список, позволяя вызывающему коду изменять его (если это необходимо).

def squares(n):
    return [i**2 for i in range(1, n+1)]

sq = squares(5)
sq.append(36)
print(sq)  # [1, 4, 9, 16, 25, 36]

Python args (аргументы в python)

Внимание: если функция возвращает изменяемый объект (список, словарь), любые изменения в нём повлияют на оригинальный объект, если он не был скопирован.

def get_items():
    data = [1, 2, 3]
    return data

items = get_items()
items.append(4)
# data внутри функции тоже изменился? Нет, потому что переменная data локальна, но объект один.
# Но если вызвать get_items() снова, будет новый список.

именованные аргументы функции python (именованные аргументы функции python)

Как вернуть результат в зависимости от условия?

Условный return позволяет выбирать возвращаемое значение на основе логики.

def discount(price, member=False):
    if member:
        return price * 0.9
    return price

print(discount(100, True))   # 90.0
print(discount(100))         # 100

именованные аргументы python (именованные аргументы python)

Когда функция должна явно вернуть None?

Если функция выполняет побочные действия и не должна возвращать полезное значение, можно указать return None или просто return.

def log_error(message):
    print(f"ERROR: {message}")
    return  # неявно возвращает None

количество аргументов функции python (количество аргументов функции python)

Некоторые разработчики ошибочно ожидают, что функция без return возвращает что-то другое. Всегда проверяйте документацию или аннотацию возврата.

Как создать функцию, возвращающую другую функцию?

Функции в Python - объекты первого класса, поэтому можно возвращать их из другой функции (замыкание).

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

times_two = multiplier(2)
print(times_two(5))  # 10

параметры и аргументы функции python (параметры и аргументы функции python)

Как указать ожидаемый тип возвращаемого значения?

Аннотации типов помогают документировать функциональность и ловить ошибки статическими анализаторами.

def divide(a: float, b: float) -> float:
    if b == 0:
        return float('inf')
    return a / b

result: float = divide(10, 3)
print(result)  # 3.3333333333333335
- Python принять аргументы (приём аргументов в python)
- Python список аргументов (список аргументов в python)
- Python функция аргумент список (список как аргумент функции python)

Примеры и расширенное использование

Возврат значения с обработкой ошибок

Функция может возвращать результат или None при некорректных входных данных. Альтернатива - возбуждать исключение, но для внешнего API часто предпочтителен возврат индикатора ошибки.

Пример
def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return None

print(safe_divide(10, 2))   # 5.0
print(safe_divide(10, 0))   # None

Возврат нескольких значений с распаковкой

Пример
def get_min_max_avg(data):
    if not data:
        return None, None, None
    mn = min(data)
    mx = max(data)
    avg = sum(data) / len(data)
    return mn, mx, avg

mn, mx, avg = get_min_max_avg([3, 1, 4, 1, 5])
print(f"Min: {mn}, Max: {mx}, Avg: {avg:.2f}")
Min: 1, Max: 5, Avg: 2.80

Рекурсивная функция с return

Вычисление факториала с использованием рекурсии и возврата результата.

Пример
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)

print(factorial(5))  # 120

Возврат лямбда-функции c захватом переменной

Фабрика функций, создающая замыкание.

Пример
def power_factory(exponent):
    return lambda base: base ** exponent

square = power_factory(2)
cube = power_factory(3)
print(square(4))  # 16
print(cube(2))    # 8

Генератор как альтернатива return для последовательностей

Оператор yield позволяет возвращать значения по одному, экономя память. Хотя это не return, но часто решает задачи возврата большого набора данных.

Пример
def fibonacci(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

for num in fibonacci(10):
    print(num, end=' ')
0 1 1 2 3 5 8

Возврат из вложенной функции (замыкание) с изменяемым состоянием

Пример
def counter(start=0):
    count = start
    def increment(step=1):
        nonlocal count
        count += step
        return count
    return increment

my_counter = counter(10)
print(my_counter())      # 11
print(my_counter(5))     # 16

Использование аннотации типа для сложных структур

Пример
from typing import Dict, List, Union

def parse_csv(line: str) -> Dict[str, Union[str, int]]:
    parts = line.strip().split(',')
    return {"name": parts[0], "age": int(parts[1])}

record = parse_csv("John,30")
print(record)  # {'name': 'John', 'age': 30}

Возвращаемое значение функции в Python - comments

En
Python return value (python)