Цикл в Python не учитывает последний элемент в цикле

Необходимо у пользователя запросить ввод Начального, Конечного значений и Шаг значений. Программа должна выполнить вычисления по каждому элементу из списка и вывести результат в виде таблицы в PrettyTable. Однако, при выводе таблицы не выводится последний элемент Значение Х. Например, если в качестве Начального значения ввести 1, конечного 20, а шаг значений 2, то диапазон значений Х отобразится от 1 до 19, а не от 1 до 20.

from numpy import arange
import math
from prettytable import PrettyTable

table = PrettyTable()

# Заданное значение переменной
num = 74

# Запрос данных у пользователя
start = input('Начальное значение ', )
start = float(start)

end = input('Конечное значение ', )
end = float(end)

if float(end) == float(start):
    print('Введенные значения не должны быть равны')
    exit()

if float(end) < float(start):
    print('Конечное значение должно быть больше начального')
    exit()

step = input('Шаг значений ', )
step = float(step)

while float(step) <= 0:
    if float(step) <= 0:
        print('Шаг значений должен быть положительным')
    step = input('Шаг значений ', )
    
while float(step) > end:
    if float(step) > end:
        print('Шаг значений должен быть в рамках диапазона')
    step = input('Шаг значений ', )

while float(step) == end:
    if float(step) == end:
        print('Некорректное значение')
    step = input('Шаг значений ', )

# Определяем пул исходных значений
input_data = arange(float(start), float(end), float(step))

# Выводим номера строк 
line_number_list = []
line_number = len(input_data)
for line in range(1, line_number + 1):
    line_number_list.append(line)

# Выводим значения Х
X_list = []
for value in input_data:
    value = round(value, 2)
    X_list.append(value)
    
# Вычисляем искомые значения
maximum_list = []
first_number = 0
second_number = 0
for value in input_data:
    first_number = (1 - num) / (math.sin(value + num))
    if first_number < 0 or (math.sin(value + num)) == 0:
        maximum_list.append('Ошибка! Логарифм отрицательного числа')
        continue
    else:
        first_number = math.log10(first_number)
        
    if math.sin(value) == 0:
        maximum_list.append('Ошибка! Значение синуса равно 0')
        continue
    else:
        second_number = (math.cos(value) / math.sin(value)) / num
        second_number = math.fabs(second_number)
    maximum = max(first_number, second_number)
    maximum_list.append(maximum)

# Вывод таблицы
for colname, col in (('№', line_number_list),
                     ('Значение X', X_list),
                     ('Искомое значение', maximum_list)):
    table.add_column(colname, col)
print(table.get_string())

Ответы (1 шт):

Автор решения: Zhihar

в чем смысл таких проверок?

while float(step) <= 0:
    if float(step) <= 0:
        print('Шаг значений должен быть положительным')
    step = input('Шаг значений ', )

условия то одинаковые, а значит:

while float(step) <= 0:
    print('Шаг значений должен быть положительным')
    step = input('Шаг значений ', )

почему бы начальные, конечные данные и шаг не запрашивать за раз?

input_data = list(map(float, input().split()))

а потом уже проводить нужные проверки и код короче и визуальнее более понятный

а зачем расписывать циклы

line_number_list = [] line_number = len(input_data) for line in range(1, line_number + 1): line_number_list.append(line)

когда python для таких целей позволяет более компактные и понятные записи делать

line_number_list = [*range(1, len(input_data) + 1)]

или вместо

X_list = []
for value in input_data:
    value = round(value, 2)
    X_list.append(value)

сделать

X_list = [round(value, 2) for value in _input_data]
→ Ссылка