Функции

Содержание

  1. Что такое функции
  2. Как объявить функцию
  3. Зачем выносить код в функции
  4. Параметры и аргументы
  5. Возвращаемое значение return
  6. Область видимости
  7. Практика
  8. Дополнительные задания для закрепления

Что такое функции

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

С повторяющимся кодом мы уже боролись циклами в 02.07 - Циклы — функции решают ту же проблему на уровне структуры программы.

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

def show_status():
    print("Проверка завершена")
 
show_status()
show_status()

Здесь show_status() можно вызвать много раз, и каждый раз выполнится код внутри функции.


Как объявить функцию

В Python функция создается с помощью ключевого слова def.

def имя_функции(параметры):
    # тело функции
    # код с отступом

Разберем элементы:

  • def сообщает Python, что дальше начинается определение функции;
  • имя_функции - имя, по которому функцию будут вызывать;
  • круглые скобки содержат параметры, если функции нужны входные данные;
  • двоеточие открывает блок кода;
  • тело функции пишется с отступом, обычно в 4 пробела.

Имена функций в Python обычно пишут в snake_case: calculate_total, print_message, get_user_name.

  • Мини-повторение правил именования

    Имя функции может содержать буквы, цифры и нижнее подчеркивание, но не должно начинаться с цифры. Регистр важен: get_data и GetData - разные имена. Хорошее имя описывает действие, которое выполняет функция.


Зачем выносить код в функции

Главная причина - убрать повторение. Представьте, что нужно несколько раз вывести одинаковый блок приветствия.

print("Привет, Олег!")
print("Рады видеть тебя на занятии")
print("-" * 24)
 
print("Привет, Нина!")
print("Рады видеть тебя на занятии")
print("-" * 24)

Код работает, но повторяется. Если понадобится изменить текст, придется править несколько мест.

С функцией это выглядит чище:

def greet_student(name):
    print(f"Привет, {name}!")
    print("Рады видеть тебя на занятии")
    print("-" * 24)
 
greet_student("Олег")
greet_student("Нина")

Функции дают несколько преимуществ:

  • меньше дублирования;
  • проще читать код;
  • легче исправлять логику;
  • один и тот же блок можно переиспользовать в разных местах;
  • сложную задачу можно разбить на понятные шаги.

Еще пример с расчетом площади:

def calculate_area(width, height):
    area = width * height
    print(f"Площадь: {area}")
 
calculate_area(8, 4)
calculate_area(12, 6)
calculate_area(5, 9)

Параметры и аргументы

Параметры - это имена переменных в определении функции. Аргументы - это реальные значения, которые мы передаем при вызове.

def describe_user(name, age):  # name и age - параметры
    print(f"Имя: {name}, возраст: {age}")
 
describe_user("Алина", 26)  # "Алина" и 26 - аргументы

Позиционные аргументы

Позиционные аргументы передаются в том же порядке, в котором объявлены параметры.

def print_coordinates(x, y):
    print(f"x = {x}, y = {y}")
 
print_coordinates(3, 9)
print_coordinates(9, 3)

Порядок важен: значения попадут в разные параметры.

Именованные аргументы

Именованные аргументы явно указывают, какому параметру какое значение передается.

def describe_person(name, age, city):
    print(f"{name}, {age}, {city}")
 
describe_person(name="Ирина", age=31, city="Тверь")
describe_person(city="Пермь", name="Кирилл", age=24)

Такой вызов легче читать, особенно если у функции много параметров.

Значения по умолчанию

Параметр может иметь значение по умолчанию. Тогда при вызове его можно не указывать.

def create_message(name, greeting="Привет"):
    return f"{greeting}, {name}!"
 
print(create_message("Лена"))
print(create_message("Лена", "Доброе утро"))

Возвращаемое значение return

return возвращает результат работы функции наружу. После return выполнение функции прекращается.

def sum_numbers(a, b):
    return a + b
 
result = sum_numbers(7, 11)
print(result)

Без return функция тоже может что-то делать, например печатать текст, но ее результатом будет None.

def print_sum(a, b):
    print(a + b)
 
value = print_sum(4, 5)
print(value)  # None

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

def is_even(number):
    return number % 2 == 0
 
if is_even(18):
    print("Число четное")

Функция может вернуть несколько значений. На самом деле Python вернет кортеж.

def get_profile():
    name = "София"
    age = 29
    return name, age
 
profile = get_profile()
print(profile)

Область видимости

Область видимости определяет, где переменная доступна.

Локальные переменные

Локальная переменная создается внутри функции и доступна только там.

def show_number():
    local_value = 15
    print(local_value)
 
show_number()
# print(local_value)  # NameError

После завершения функции локальные переменные нельзя использовать снаружи.

Глобальные переменные

Глобальная переменная объявляется вне функций и доступна в модуле.

app_version = "1.0"
 
def print_version():
    print(app_version)
 
print_version()
print(app_version)

Изменять глобальные переменные внутри функции стоит осторожно. Если это действительно нужно, используется global.

counter = 0
 
def increment():
    global counter
    counter += 1
 
increment()
print(counter)

Python ищет имена по правилу LEGB: Local, Enclosing, Global, Built-in. Сначала смотрит в локальной области, затем во внешних функциях, потом в глобальной области и только после этого во встроенных именах Python.


Практика

  • Задание 1: функция без параметров

    Написать функцию show_welcome(), которая не принимает параметров и выводит строку Добро пожаловать!.

    def show_welcome():
        print("Добро пожаловать!")
     
    show_welcome()
  • Задание 2: приветствие пользователя

    Написать функцию greet_user(name), которая принимает имя и выводит приветствие вида Привет, [имя]!. Вызвать функцию с несколькими именами.

    def greet_user(name):
        print(f"Привет, {name}!")
     
    greet_user("Олег")
    greet_user("Марина")
  • Задание 3: сумма двух чисел

    Написать функцию sum_numbers(a, b), которая принимает два числа и выводит их сумму.

    def sum_numbers(a, b):
        print(a + b)
     
    sum_numbers(8, 6)     # 14
    sum_numbers(-4, 13)   # 9
  • Задание 4: проверка четности

    Написать функцию is_even(number), которая печатает Четное, если число четное, и Нечетное, если число нечетное. Использовать оператор %.

    def is_even(number):
        if number % 2 == 0:
            print("Четное")
        else:
            print("Нечетное")
     
    is_even(12)
    is_even(5)
    is_even(0)
  • Задание 5: площадь прямоугольника

    Написать функцию rectangle_area(width, height). Если ширина или высота меньше либо равны нулю, вывести Некорректные значения. Иначе вывести площадь.

    def rectangle_area(width, height):
        if width <= 0 or height <= 0:
            print("Некорректные значения")
        else:
            print(width * height)
     
    rectangle_area(6, 9)     # 54
    rectangle_area(-3, 8)    # Некорректные значения
    rectangle_area(4, 0)     # Некорректные значения
  • Задание 6: большее из двух чисел

    Написать функцию max_of_two(a, b), которая возвращает большее число через return.

    def max_of_two(a, b):
        if a >= b:
            return a
        return b
     
    print(max_of_two(9, 14))
    print(max_of_two(20, 3))
    print(max_of_two(-2, -7))
  • Задание 7: длина строки

    Написать функцию string_length(text), которая принимает строку и возвращает ее длину.

    def string_length(text):
        return len(text)
     
    print(string_length("Python"))
    print(string_length("test automation"))
    print(string_length(""))

Дополнительные задания для закрепления

  1. Вызвать print несколькими способами: без аргументов, с одним аргументом, с двумя и тремя аргументами.
  2. По очереди запустить некорректные выражения print "Hello", len "abc", input "Введите число", прочитать ошибки и исправить код.
  3. В одну строку вывести сумму чисел от 1 до 30 с помощью sum() и range().
  4. Создать функцию print_line(), которая выводит 25 дефисов.
  5. Создать функцию get_lucky_number(), которая возвращает число 13.
  6. Создать функцию print_countdown(), которая выводит обратный отсчет от 7 до 1.
  7. Создать функцию print_table(num), которая выводит таблицу умножения для num от 1 до 6.
  8. Создать функцию get_grade(score): 90+ -> A, 80+ -> B, 70+ -> C, иначе F.
  9. Создать функцию double(x) и функцию print_double_result(num), которая печатает результат double(num).
  10. Создать функцию filter_even_sum(a, b, c), которая возвращает сумму только четных чисел из трех переданных.

Далее: 03.02 - Исключения и обработка ошибок в Python ➡️ Модуль: 03 - MOC