Определение функции и return
Определение функции и return
До сих пор в программах всё шло линейно — один блок кода, один раз. Но реальные программы повторяют одни и те же действия снова и снова: проверить ввод, посчитать значение, вывести отчёт. Копировать код — плохая практика. Для повторного использования кода существуют функции.
Что такое функция
Функция — именованный блок кода, который можно вызвать из любого места программы. Вы уже использовали встроенные функции: print(), len(), int(), range(). Теперь научимся создавать свои.
Синтаксис определения
def имя_функции(параметры):
"""Описание функции (docstring — необязательно)"""
# тело функции
return результат # необязательно
Простейший пример:
def greet():
print("Привет, мир!")
greet() # вызов функции
greet() # ещё раз — без копирования кода
Параметры и аргументы
Параметр — переменная в определении функции. Аргумент — конкретное значение при вызове.
def greet(name): # name — параметр
print(f"Привет, {name}!")
greet("Алиса") # "Алиса" — аргумент
greet("Борис")
Функция с несколькими параметрами:
def add(a, b):
result = a + b
print(f"{a} + {b} = {result}")
add(3, 5) # 3 + 5 = 8
add(10, 20) # 10 + 20 = 30
Оператор return
return завершает функцию и возвращает значение вызывающему коду:
def add(a, b):
return a + b
result = add(3, 5) # result = 8
print(result) # 8
print(add(10, 20)) # 30 — можно использовать в выражении
Функция без return (или с голым return) возвращает None:
def say_hello():
print("Hello")
x = say_hello()
print(x) # None
Возврат нескольких значений
Python позволяет вернуть несколько значений — они упаковываются в кортеж:
def min_max(numbers):
return min(numbers), max(numbers) # кортеж (min, max)
lo, hi = min_max([3, 1, 7, 2, 9])
print(lo, hi) # 1 9
result = min_max([5, 2, 8])
print(result) # (2, 8)
print(type(result)) # <class 'tuple'>
Ранний return
return можно использовать в середине функции для досрочного выхода. Это называется «ранний возврат» (early return) и позволяет избежать глубокой вложенности:
def divide(a, b):
if b == 0:
return None # ранний выход при ошибке
return a / b
print(divide(10, 2)) # 5.0
print(divide(10, 0)) # None
Вместо:
def divide_nested(a, b):
if b != 0:
result = a / b
return result
else:
return None
Функции — это объекты
В Python функции — объекты первого класса. Их можно сохранять в переменных и передавать как аргументы:
def square(x):
return x ** 2
# Функцию можно сохранить в переменную:
f = square
print(f(5)) # 25
# И передать другой функции:
numbers = [1, 2, 3, 4, 5]
squared = list(map(square, numbers)) # map применяет функцию к каждому элементу
print(squared) # [1, 4, 9, 16, 25]
Польза функций
Без функций — дублирование кода:
# Проверка пароля для 3 пользователей:
p1 = "abc123"
if len(p1) >= 8 and any(c.isdigit() for c in p1):
print("OK")
p2 = "qwerty"
if len(p2) >= 8 and any(c.isdigit() for c in p2):
print("OK")
С функцией — один раз определить, много раз использовать:
def is_valid_password(password):
if len(password) < 8:
return False
if not any(c.isdigit() for c in password):
return False
return True
for pwd in ["abc123", "qwerty", "secure99"]:
print(f"{pwd}: {'OK' if is_valid_password(pwd) else 'слабый'}")
Проверь себя
Что вернёт следующая функция при вызове result = f(3, 4)?
def f(x, y):
if x > y:
return x
return y
result = f(3, 4)
3 > 4 → False → пропускаем первый return → return y → 4. Функция возвращает максимум из двух чисел.
Итог
def имя(параметры):— определение функции; тело обязательно с отступом.return значение— вернуть результат и завершить функцию.- Функция без
returnвозвращаетNone. - Можно вернуть несколько значений через кортеж:
return a, b. - Ранний
returnубирает лишнюю вложенность. - Функции — объекты: их можно хранить в переменных и передавать как аргументы.
В следующем уроке детально разберём позиционные и именованные аргументы функций.