Возвращаемое значение функции в 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)) # ZeroPython 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
Примеры и расширенное использование
Возврат значения с обработкой ошибок
Функция может возвращать результат или 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}