Python: Детерминированность
У функций в любом языке программирования есть фундаментальные свойства. Эти свойства помогают понимать, как функция будет вести себя в разных ситуациях, как её тестировать и где применять. Одно из таких свойств — детерминированность.
Детерминированная функция всегда возвращает один и тот же результат при одинаковых входных данных. Например, детерминированной можно назвать функцию, которая считает количество символов:
len('hexlet') # 6
len('hexlet') # 6
len('wow') # 3
len('wow') # 3
Функцию len()
можно вызывать бесконечно с одним и тем же аргументом, и она всегда вернёт один и тот же результат.
Недетерминированные функции
Есть и обратные примеры — недетерминированные функции. Это функции, которые могут возвращать разные результаты при одинаковых входных данных или при их отсутствии (функции без параметров). Хороший пример — функция, которая возвращает случайное число:
# Синтаксис импортов будет изучаться позже на Хекслете
from random import random
# Функция, которая возвращает случайное число
random() # 0.09856613113197676
random() # 0.8839904367241888
У этой функции нет аргументов, но её результат каждый раз разный. Если хотя бы один вызов среди миллионов даст другой результат, функция считается недетерминированной.
Почему это важно
Детерминированность влияет на то, как мы работаем с функциями:
- детерминированные функции легко тестировать и предсказывать;
- их проще оптимизировать и использовать повторно;
- недетерминированные функции сложнее проверять, потому что результат меняется.
Поэтому там, где это возможно, лучше стремиться к тому, чтобы функция была детерминированной.
Задание
Функция random()
возвращает случайное число от 0 до 1 с большим количеством знаков после запятой. Реализуйте код, который выводит на экран случайное целое число в диапазоне от 0 до 10. Для этой задачи вам понадобится функция random()
и функция round(), которая округляет переданное ей значение
round(2.320000789855705) # 2
Попробуйте решить это задание в одну строчку
Алгоритм
Так как функция random()
возвращает числа в диапазоне от 0 до 1, то чтобы получить числа от 0 до 10, нам нужно выполнить умножение на 10. Затем получившиеся число округляется и так мы получаем то, что нужно.
Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
from hexlet.test import expect_output
def check(output):
value = int(output)
assert value >= 0
assert value <= 10
def test(capsys):
expect_output(capsys, check)
Решение учителя откроется через:
20:00
