Elementor Header #8

38. Детерминированность

Добро пожаловать на тридцать восьмой урок по Python! В этом уроке мы рассмотрим понятие детерминированности в программировании и его важность для написания надежных и воспроизводимых программ. Мы обсудим, что такое детерминированность, как она влияет на выполнение кода и как вы можете обеспечить её в своих программах.

Что такое детерминированность?

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

Пример детерминированной функции

				
					def add(a, b):
    return a + b

print(add(3, 4))  # Вывод: 7
print(add(3, 4))  # Вывод: 7 (всегда одинаковый результат для одинаковых входных данных)

				
			

Функция add детерминирована, потому что для одного и того же набора входных значений (3 и 4) результат всегда будет 7.

Примеры недетерминированного поведения

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

Использование случайных чисел

				
					import random

def random_number():
    return random.randint(1, 10)

print(random_number())  # Вывод может быть разным каждый раз
print(random_number())  # Вывод может быть разным каждый раз

				
			

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

Зависимость от состояния системы

				
					import datetime

def current_time():
    return datetime.datetime.now()

print(current_time())  # Вывод изменится в зависимости от времени вызова
print(current_time())  # Вывод изменится в зависимости от времени вызова

				
			

Функция current_time недетерминирована, потому что результат зависит от текущего времени системы, которое меняется.

Взаимодействие с внешними ресурсами

				
					import requests

def get_website_status(url):
    response = requests.get(url)
    return response.status_code

print(get_website_status("https://www.example.com"))  # Код состояния может меняться
print(get_website_status("https://www.example.com"))  # Код состояния может меняться

				
			

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

Почему детерминированность важна?

  1. Повторяемость результатов: Детерминированные функции позволяют легко отлаживать и тестировать программы, так как вы можете предсказать результаты выполнения функции для конкретных входных данных.

  2. Консистентность: Детерминированность помогает поддерживать консистентность данных и поведения программы, особенно в системах, где важна точность и стабильность.

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

Как обеспечить детерминированность?

Избегайте случайных чисел: Если вам нужно использовать случайные числа, попробуйте сделать их предсказуемыми с помощью фиксированного начального значения (seed) для генератора случайных чисел.

				
					import random

def deterministic_random(seed):
    random.seed(seed)
    return random.randint(1, 10)

print(deterministic_random(42))  # Всегда будет один и тот же результат для одного и того же seed

				
			

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

				
					def fixed_time():
    return datetime.datetime(2024, 1, 1, 12, 0, 0)

print(fixed_time())  # Всегда возвращает одно и то же время

				
			

Учитывайте внешние ресурсы: Если функция взаимодействует с внешними ресурсами, старайтесь минимизировать влияние этих ресурсов на результат функции. Например, используйте моки или заглушки в тестах.

				
					def mock_get_website_status(url):
    return 200

print(mock_get_website_status("https://www.example.com"))  # Всегда возвращает 200

				
			

Заключение

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

logo