Вычисление значения функции
y = f(x)
Дана функция y = f(x)
. Например, такая (какая именно - не столь важно):
y = x - 0.5, при x > 0; y = 0, при x = 0; y = |x|, при x < 0.
Написать программу, определяющую значение y по переданному значению x.
Решение задачи на языке программирования Python
При решении подобных задач - выражения с переменной x (после знака =), которые приравниваются y, не так важны. Они могут быть разными от задачи к задаче.
Самое главное - это наличие двух и более условий, то есть диапазонов x. "Сумма" диапазонов должна покрывать все возможные значения, а сами диапазоны не должны перекрываться. Так в примере функции выше x может быть больше, меньше или равен нулю. Любое число попадет в один из трех промежутков.
В задаче может быть два условия. Например:
y = x / 2, при x >= 100; y = x / 1.5, при x < 100;
Однако здесь также учитываются все возможные значения x.
При написании программы, которая вычисляет значение функции, необходимо использовать оператор ветвления (условный оператор) с количеством "ветвей" равным количеству условий (вариантов вычисления значения функции). В Python для множественного ветвления используется оператор if-elif-else
, в котором при необходимости может быть множество веток elif
, как и ни одной.
Рассмотрим такой программный код, решающий данную задачу:
x = float(input()) if x > 0: y = x - 0.5 elif x < 0: y = abs(x) elif x == 0: y = 0 print(y)
Это верное решение, однако оно имеет один недочет. Несмотря на то, что в условиях веток мы предусмотрели все варианты, интерпретатор Питона не может это знать или как-то оценить. То есть он не может прийти к выводу, что все варианты значения x учтены. Поэтому для него существует гипотетическая ситуация, когда значение x не подпадает ни под одно условие в заголовках веток условного оператора. В этом случае переменная y не будет существовать, а выражение print(y)
будет выводить ошибку.
Чтобы избежать неоднозначности, мы можем заменить последнее elif
на else
, в ветку которого попадают все неучтенные до этого случаи.
x = float(input()) if x > 0: y = x - 0.5 elif x < 0: y = abs(x) else: y = 0 print(y)
Такая замена возможна, так как если x ни больше и ни меньше нуля, то он ему равен. Однако в этом случае теряется наглядность примера. Теперь мы, люди, явно не видим условия x == 0
и должны подумать, выполнив оценку программного кода. Хотя для интерпретатора, избегания потенциальных ошибок и лишних действий (нет третьего сравнения) такой код лучше.
Также мы можем ввести переменную y до условного оператора и присвоить ей один из вариантов вычисления значения функции.
x = float(input()) y = 0 if x > 0: y = x - 0.5 elif x < 0: y = abs(x) print(y)
В данном случае, если x равен нулю, то y остается равным также нулю, так как ни одна из веток оператора ветвления не сработает. Также доволен интерпретатор, так как y в любом случае будет иметь значение.
Минусом такого решения может быть сложность выражения вычисления. Допустим, наша функция y = f(x)
выглядит так:
y = x - 0.5 + 2.5, при x > 0; y = -0.12 + x / 2, при x = 0; y = |x| * 3.2 - 1.8, при x < 0.
В этом случае, присвоив y одно из выражений заранее, в случае неподходящего под это выражение значения x, программе придется выполнять еще одно сложное выражение.