Подсчёт и поиск минимума и максимума
Содержание курса
Ручной поиск минимума и максимума: инициализация и сравнение в цикле
Поиск минимума или максимума устроен иначе, чем подсчёт. Здесь не нужен счётчик — нужна переменная, которая хранит «лучшее значение на данный момент». И логика её обновления принципиально другая.
Ключевой момент — инициализация. Переменную current_min (или current_max) нужно выставить в первый элемент списка, а не в ноль или в какое-то произвольное число. Если поставить ноль, а все элементы в списке окажутся отрицательными, алгоритм вернёт неверный результат — он никогда не обновится.
После инициализации перебираем остальные элементы — начиная со второго — и сравниваем каждый с текущим минимумом:
temperatures = [18, 7, 23, -3, 11, 15]
current_min = temperatures[0] # стартуем с первого элемента
for temp in temperatures[1:]: # перебираем остальные
if temp < current_min:
current_min = temp
print(current_min) # -3
На каждой итерации Python сравнивает temp с current_min. Если новый элемент меньше — current_min обновляется. Если нет — переменная остаётся прежней. После прохода по всему списку в current_min гарантированно окажется наименьшее значение.
Для максимума структура зеркальная — меняется только знак сравнения:
current_max = temperatures[0]
for temp in temperatures[1:]:
if temp > current_max:
current_max = temp
print(current_max) # 23
Можно найти оба значения за один проход:
temperatures = [18, 7, 23, -3, 11, 15]
current_min = temperatures[0]
current_max = temperatures[0]
for temp in temperatures[1:]:
if temp < current_min:
current_min = temp
if temp > current_max:
current_max = temp
print(current_min, current_max) # -3 23
Здесь важно понять два момента, где легко ошибиться.
Первый — срез temperatures[1:]. Технически можно начинать перебор с нулевого элемента, и алгоритм всё равно даст правильный ответ. Но это лишняя итерация: Python сравнит первый элемент сам с собой и ничего не обновит. Срез [1:] — не обязательное требование, а осознанный выбор.
Второй — попытка инициализировать current_min = 0 вместо temperatures[0]. Это классическая ошибка: ноль кажется «нейтральным», но в действительности это конкретное значение. Если все числа в списке положительные, current_min никогда не обновится и вернёт 0 — значение, которого в списке нет.
Отличие от паттерна подсчёта принципиальное: там нас интересует количество элементов, прошедших проверку. Здесь нас интересует само значение — конкретное число из списка, которое «победило» в сравнении. Поэтому вместо count += 1 мы делаем присваивание current_min = temp.
