• 1
    Ввод и вывод данных
    • Задачи
  • 2
    Условия
    • Задачи
  • 3
    Цикл for
    • Задачи
  • 4
    Строки
    • Задачи
  • 5
    Цикл while
    • Задачи
  • 6
    Списки
    • Задачи
  • 7
    Двумерные массивы
    • Задачи
  • 8
    Словари
    • Задачи
  • 9
    Множества
    • Задачи
  • 10
    Функции и рекурсия
    • Задачи
  • к

Занятие 10. Функции и рекурсия

Уровень сложности:

иконка человека красный иконка человека белая иконка человека зеленая Pythonlib

Задача«Сравнение температур»

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

Формат ввода

Два целых числа, каждое на отдельной строке - значения температур в градусах Цельсия

Формат Вывода

Одно число - большая из двух температур

Пример

Ввод

15
23

Вывод

23

Подсказка

Основы функций в Python: Подробное руководство

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

Определение функции

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

Полезный совет: Сразу после определения функции принято писать строку документации (docstring) в тройных кавычках. Она описывает, что делает функция, какие аргументы принимает и что возвращает. Это стандарт хорошего тона в программировании.

def имя_функции(аргументы):
    """
    Это строка документации (docstring).
    Она объясняет назначение функции.
    """
    # тело функции
    return результат

Пример простой функции:

def greet_user():
    """Эта функция выводит простое приветствие."""
    print("Привет, мир!")

# вызов функции
greet_user()  # Вывод: Привет, мир!

Аргументы функции

Аргументы — это данные, которые вы передаете в функцию для обработки.

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

Это самые простые аргументы. Они передаются в функцию по порядку. Их позиция при вызове функции имеет решающее значение.

def subtract(a, b):
    """Вычитает второй аргумент из первого."""
    return a - b

print(subtract(10, 3))  # Вывод: 7
print(subtract(3, 10))  # Вывод: -7 (порядок важен!)

2. Именованные аргументы (ключевые слова)

Это аргументы, передаваемые функции по имени. Они позволяют задавать значения в любом порядке и делают код более понятным, особенно если у функции много аргументов.

def describe_pet(animal_type, pet_name):
    """Отображает информацию о питомце."""
    print(f"У меня есть {animal_type}.")
    print(f"Его зовут {pet_name}.")

# Порядок не важен при использовании именованных аргументов
describe_pet(pet_name="Мурзик", animal_type="кот")
# Вывод:
# У меня есть кот.
# Его зовут Мурзик.

3. Аргументы по умолчанию

Это аргументы, которым присвоено значение прямо в определении функции. Если при вызове функции значение для такого аргумента не передано, используется значение по умолчанию. Это делает некоторые аргументы необязательными.

def greet(name, message="Привет"):
    """Приветствует пользователя, используя стандартное сообщение."""
    print(f"{message}, {name}!")

greet("Алиса")  # Используется значение по умолчанию. Вывод: Привет, Алиса!
greet("Боб", "Добро пожаловать")  # Значение по умолчанию переопределено. Вывод: Добро пожаловать, Боб!

Важный совет: Никогда не используйте изменяемые типы данных (например, списки [] или словари {}) в качестве значений по умолчанию. Они создаются один раз при определении функции и могут привести к неожиданному поведению.

4. Произвольное количество аргументов (*args и **kwargs)

Иногда вы не знаете заранее, сколько аргументов потребуется передать.

  • *args собирает все переданные позиционные аргументы в кортеж (tuple).
  • **kwargs собирает все переданные именованные аргументы в словарь (dict).
def calculate_sum(*args):
    """Суммирует произвольное количество чисел."""
    print(f"Полученные числа (кортеж): {args}")
    return sum(args)

print(calculate_sum(1, 2, 3, 4, 5))  # Вывод: Полученные числа (кортеж): (1, 2, 3, 4, 5) и затем 15

def display_info(**kwargs):
    """Отображает информацию в формате ключ-значение."""
    print(f"Полученные данные (словарь): {kwargs}")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

display_info(name="Алиса", age=30, city="Москва")
# Вывод:
# Полученные данные (словарь): {'name': 'Алиса', 'age': 30, 'city': 'Москва'}
# name: Алиса
# age: 30
# city: Москва

Возвращение значений

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

def multiply(a, b):
    """Умножает два числа и возвращает результат."""
    return a * b
    print("Этот код никогда не выполнится") # Строка после return недостижима

result = multiply(3, 4)
print(result)  # Вывод: 12

Полезный совет: Функция может возвращать несколько значений. Технически, она возвращает один кортеж, который можно удобно распаковать в несколько переменных.

def get_user_data():
    name = "Иван"
    age = 25
    return name, age # Возвращается кортеж ('Иван', 25)

user_name, user_age = get_user_data() # Распаковка кортежа
print(f"Имя: {user_name}, Возраст: {user_age}") # Вывод: Имя: Иван, Возраст: 25

Области видимости переменных

  • Локальная область видимости: Переменные, определенные внутри функции, "живут" только внутри нее и уничтожаются после ее завершения.
  • Глобальная область видимости: Переменные, определенные вне всех функций, доступны в любой части программы.
global_var = "Я — глобальная переменная"

def my_function():
    local_var = "Я — локальная переменная"
    print(global_var)  # Доступ к глобальной переменной
    print(local_var)

my_function()
# Вывод:
# Я — глобальная переменная
# Я — локальная переменная

# print(local_var)  # Ошибка NameError: name 'local_var' is not defined

Совет: Чтобы изменить глобальную переменную внутри функции, используйте ключевое слово global. Однако старайтесь избегать этого, так как это усложняет отладку. Лучше передавать значения через аргументы и возвращать результат через return.


Рекомендации по наименованию функций

  • Описательные имена: Имя должно говорить, что функция делает. calculate_tax лучше, чем calc.

  • Стиль snake_case: В Python принято использовать буквы в нижнем регистре со словами, разделенными подчеркиванием (my_cool_function).

  • Используйте глаголы: Функции выполняют действия, поэтому их имена часто начинаются с глаголов: get_data, send_message, validate_input, is_active.

  • Аннотации типов (Type Hints): Современный Python позволяет указывать типы ожидаемых аргументов и возвращаемого значения. Это не влияет на выполнение, но сильно улучшает читаемость и помогает находить ошибки.

    # Эта функция ожидает два целых числа и вернет целое число
    def add_numbers(a: int, b: int) -> int:
        return a + b
    
main.py
Тест 1
Тест 2
Тест 3
Тест 4
Тест 5
Тест 6
Тест 7
Тест 8
Тест 9
Тест 10
Решение разработчика

🎉 Поздравляем! 🎉

Ты отлично справился с задачей! Это был непростой вызов, но ты нашёл правильное решение. Ты на шаг ближе к мастерству в программировании! Продолжай в том же духе, ведь каждый пройденный этап делает тебя ещё сильнее.

AD

Реклама

red-snake blue-snake green-snake

Запускаем ваш код...

Помощник ИИ

Привет! Я твой помощник по программированию. Задавай любые вопросы по Python, я могу рассказать о функциях, методах, обьяснить то, что тебе не понятно, а так же о текущей задаче!