Помогите с задачей по циклам на python
Прохожу курс по Python и попалась задача:
Нужно написать программу, которая будет считывать со стандартного ввода целочисленные границы промежутка (сначала левая, потом правая, каждая на отдельной строке). А дальше будет считывать целые числа со стандартного ввода пока не встретит пустую строку, которая будет означать конец ввода. Нужно будет проверить входят ли все введенные числа в промежуток, проверка включает в себя границы промежутка.
Я написал вот так:
g1 = input()
g2 = input()
g3 = input()
while g3 !="":
g3 = input ()
if g1 <= g3 >= g2:
print (True)
else:
print (False)
Это последний вариант решения, перепробовал не одно, но всегда возвращает значение false.
Ответы (5 шт):
Попробуйте вот так:
g3= []
g1 = int(input())
g2 = int(input())
while True:
value = input()
if value != "":
g3.append(int(value))
else:
break
test = list(filter(lambda x: g1 <= x <= g2, g3))
print(test)
Тест:
50
150
49
89
65
170
0
31
51
[89, 65, 51]
[Program finished]
–———————-–———————-
40
150
40
50
170
150
[40, 50, 150]
[Program finished]
З.Ы. Вы сравнивали числа как строки, так как input() возвращает строку str. Что бы корректно сравнивать числа, сперва полученую строку нужно преобразовать, например через int() или float().
В Вашем коде:
- Ввод не конвертируется в числа из строки
- Не запоминаются введенные числа, g3 всегда будет пустой строкой после выхода из цикла
- Условие задано неверно, оно содержит взаимоисключающие условия и всегда будет False
Надо как-то так:
out = []
g1 = int(input())
g2 = int(input())
while (g3 := input()) != "":
out.append(int(g3))
print(all([g1 <= i <= g2 for i in out]))
Предложу такой вариант. Заводим булеву переменную valid, которая будет индикатором отсутствия недопустимых чисел, изначально задаем True. В каждой итерации цикла применяем логическое умножение valid на результат проверки очередного введенного числа g1 <= int(g3) <= g2. Если все числа подходящие, то valid будет сохранять значение True. Если же хоть одно число выйдет за границу диапазона, valid станет False.
valid, g1, g2 = True, int(input()), int(input())
while True:
g3 = input()
if g3 == '':
break
valid &= g1 <= int(g3) <= g2
print(valid)
45
100
46
88
79
99
True
Ваша программа почти правильная. Я ее немножко изменил, чтобы она работала так, как вы хотите:
g1 = int(input())
g2 = int(input())
g3 = input()
while g3 != "":
g3 = int(g3)
if g1 <= g3 <= g2:
print (True)
else:
print (False)
g3 = input()
Объяснение изменений:
Функция
input()всегда возвращает строку. Когда ожидается целое число, нужно строку перевести на него функциейint().Для переменных
g1иg2я это сделал сразу же —int(input()), но для переменнойg3, в которой ожидается как целое число, так и (пустая) строка, я это сделал только после теста на пустую строку.Я исправил отступ команды
if(вместе со всеми ее частями) - она должна находится внутри цикла, чтобы цикл не повторялся без тестирования (и обработки) текущего значения переменнойg3.В условии команды
ifя исправил один знак неравенства.Команду
g3 = input ()я переместил на конец цикла, чтобы сначала проверить текущее значение переменнойg3, и только после его обработки требовал от юзера новое значение.
Ошибка в том что вы читаете все числа, но не проверяете каждое на принадлежность интервалу.
low = int(input()) # нижняя граница
high = int(input()) # верхняя граница
between = True # пока все числа в интервале
while line := input(): # вводить до первой пустой строки
# обновить флаг если нужно
if between:
between = low <= int(line) <= high
print(between)
P.S. Это не правда что ваша программа всегда возвращает False. Если ввести три пустые строки, будет True, что логично.