Python: Создание (определение) функций
До этого момента мы использовали только уже готовые функции — print()
, len()
, max()
и другие. Но в Python можно создавать свои собственные функции. Это основа программирования: выделение повторяющейся логики в именованные блоки кода.
Зачем определять функции
Допустим, у нас есть несколько похожих участков кода:
print('Hello, Hexlet!')
print('Hello, world!')
print('Hello, Python!')
Чтобы не повторять один и тот же шаблон, мы можем оформить его в виде своей функции, которая принимает на вход один параметр и печатает нужную строчку на экран:
def say_hello(name):
print(f'Hello, {name}!')
Теперь мы можем вызывать её с разными аргументами:
say_hello('Hexlet') # => Hello, Hexlet!
say_hello('world') # => Hello, world!
say_hello('Python') # => Hello, Python!
В нашем примере функция ничего не возвращает, она действует как print()
выводя на экран сообщение.
Синтаксис определения
def имя_функции(параметры):
тело
def
— ключевое слово, с которого начинается определение.имя_функции
— любое допустимое имя, как у переменной.- В скобках — список параметров, через запятую.
- После двоеточия — тело функции. Оно пишется с отступом в 4 пробела
- Чтобы функция что-то делала, в её теле пишется обычный Python-код.
В Python отступы имеют синтаксическое значение. Они показывают, какой код относится к телу функции. Посмотрите на пример:
def say_hi():
print('Hi!')
print('Программа продолжается…')
Здесь функция say_hi()
определена, но print('Программа продолжается…')
не относится к функции — у него нет отступа. Он будет выполнен сразу при запуске программы, независимо от вызова say_hi()
.
Чтобы say_hi()
сработала, её нужно явно вызвать:
def say_hi():
print('Hi!')
say_hi() # => Hi!
print('Программа продолжается…')
Пример: функция для печати среднего арифметического
Сейчас мы реализуем простую функцию, которая вычисляет и печатает среднее арифметическое двух чисел. Среднее арифметическое — это сумма чисел, делённая на их количество. Например, среднее от 6 и 4 считается так: (6 + 4) / 2 = 5
.
def print_average(a, b):
total = a + b
average = total / 2
print(average)
print_average(6, 4) # => 5.0
Здесь:
a
иb
— входные параметры функции.total
— сумма этих чисел.average
— делим сумму на 2, чтобы найти среднее.print()
выводит результат.
При вызове print_average(6, 4)
на экран выведется 5.0
.
Переиспользование и читаемость
Функции помогают не только избегать дублирования, но и делают программы более понятными. Название функции само по себе говорит, что она делает. Это особенно важно в больших проектах, где код читают другие программисты (или вы сами через месяц).
Задание
Реализуйте функцию с именем print_motto()
, которая выведет на экран фразу Winter is coming.
print_motto() # => Winter is coming
В задачах, в которых нужно реализовать функцию, эту функцию вызывать не нужно. Вызывать функцию будут автоматизированные тесты, которые проверяют его работоспособность. Пример с вызовом выше показан только для того, чтобы вы понимали, как ваша функция будет использоваться.
Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import index
from hexlet.test import expect_output
def test(capsys):
index.print_motto()
expected = "Winter is coming"
expect_output(capsys, expected)
Решение учителя откроется через:
20:00
