#python #if-statement #max #min
#python #if-оператор #макс #min
Вопрос:
Работа над упражнением из программы MIT OpenCourseWare 6.01SC. Задача 3.1.5:
Определите функцию
clip(lo, x, hi)
, которая возвращаетlo
, еслиx
меньшеlo
, возвращаетhi
, еслиx
большеhi
, и возвращаетx
в противном случае. Вы можете предположить, чтоlo < hi
. … не используйтеif
, но используйтеmin
иmax
.
Переформулировано на английском языке: if x
— наименьший из аргументов, return lo
; если x
является наибольшим из аргументов, return hi
; в противном случае return x
. Таким образом:
def clip(lo, x, hi):
if min(lo, x, hi) == x:
return lo
elif max(lo, x, hi) == x:
return hi
else:
return x
Возможно, я неправильно понимаю проблему, но я не могу понять, как вернуть результат без использования if
вообще. Как можно изменить функцию, чтобы удалить операторы if /elif /else?
Ссылка на исходную проблему 3.1.5
Ссылка на предыдущую проблему 3.1.4 (для контекста)
Редактировать:
Комментарии / ответы на этот вопрос помогли мне понять, что моя первоначальная простая английская переформулировка не была отличным способом обдумать проблему. Лучшим способом подумать об этом было бы определить, какой из аргументов находится между двумя другими.
Комментарии:
1. Подсказка: передайте результат
max
вызоваmin
вызову. К сожалению, эта проблема имеет такое простое решение, что любое большее, чем это, в основном пишет ее для вас.2. Спойлер: math.stackexchange.com/q/1336636/18486
3. @ShadowRanger дох! я слишком много думал об этом. спасибо за подсказку
Ответ №1:
Одна строка кода:
#! python3.8
def clip(lo, x, hi):
return max(min(x, hi), lo)
print(clip(1, 2, 3))
print(clip(2, 1, 3))
print(clip(1, 3, 2))
# Output
# 2
# 2
# 2
Ответ №2:
Вы можете вернуть эту формулу:
x lo hi - max(x, lo, hi) - min(x, lo, hi)
Аргументация по случаям:
Случай 1:
If min(lo, x, hi) = lo and max(lo, x, hi) = hi
x lo hi - max(x, lo, hi) - min(x, lo, hi) ==> x lo hi - hi - lo ==> x
Случай 2:
If min(lo, x, hi) = lo and max(lo, x, hi) = x
x lo hi - max(x, lo, hi) - min(x, lo, hi) ==> x lo hi - x - lo ==> hi
Случай 3:
If min(lo, x, hi) = x and max(lo, x, hi) = hi
x lo hi - max(x, lo, hi) - min(x, lo, hi) ==> x lo hi - hi - x ==> lo
Формула возвращает ожидаемый ответ во всех возможных случаях.
Комментарии:
1. Если вы можете предположить, что вызывающий абонент не лгал о
lo
том, что он нижеhi
, это может быть проще, чем это (это прекрасный способ найти середину из трех произвольных чисел, но это больше, чем нужно при ограничении диапазона).2. Да, я понимаю, что вы имеете в виду. Ответ от @MrGeek действительно помог мне понять, о чем спрашивал вопрос. В этот момент вызов max() внутри min() имел полный смысл. Всем спасибо!
3. @ShadowRanger Я понимаю вашу точку зрения, это было обновление, спасибо.
Ответ №3:
Вот и все, функция проверки значения без использования if-else вообще. Блок while будет выполняться только один раз, поэтому избыточности нет.
def clip(lo, x, hi):
low = (min(lo, x) == x)
high = (max(x, hi) == x)
while low:
return lo
while high:
return hi
return x
РЕДАКТИРОВАТЬ: я не знаю, почему он отклонил мой код