Аватар для BaklanichBaklan
0 / 0 / 0
Регистрация: 22.10.2019
Сообщений: 11

Проблема с условиями в Python

23.10.2019, 00:00. Показов 2273. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, закончил колледж на техническое обслуживание и ремонт РЭА и понял что 4 лет это не стоило и можно было за полгода больше получить если бы нормально учили, но была еще специальность программиста и подумал неделю назад что вполне могу изучить и эту специальность и при чем сам если с той все так растянуто было. Так вот, прошу прощения если я задал глупый или неуместный вопрос, но я честно не понимаю. Не нашел в интернете нормального объяснения или не понял зачем нужно elif.

Решил написать простенькую программу
Будет спрашивать погоду, ответ будет Да или Нет.
В случае некорректного ответа будет заново спрашивать.
Как ее написать что б она работала я понимаю, но я не понимаю почему именно в таком виде она не работает.

Если ответ "Да"

на моменте первого if цикл должен прекратиться ведь наличие ответа есть! и написать "Отлично!". но он не
прекращается а идет до else, воспринимает это как отсутствие ответа и всё заново.


При ответе "Нет" все норм и он отвечает "Грустно"

Вот ее код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
otvet2 = False # переменная, которая отвечает за наличие ответа. она в самом начале потому, что дальше идет в цикле ссылка на неё, и она уже должна быть объявлена
print ("Седня хорошая погода??")
def gey():
    global otvet # назначаем переменную otvet глобальной, что нам дает использование ее вне функции
    otvet = input("Ответ:") # переменная, которая отвечает за содержание ответа
    
 
gey()
 
while otvet2 != True: # Цикл, отвечающий за проверку корректного ответа
 
    if otvet == "Да": # Ответ да, подразумевает наличие ответа
        otvet = True 
        otvet2 = True # тут цикл должен закончиться если ответ "Да", otvet2 - true, см условие
    if otvet == "Нет":
        otvet = False
        otvet2 = True # тут цикл заканчивается при наличии ответа "Нет"
    else:
        print ("Отвечай") 
        otvet2 = False # тут цикл не заканчивается а выполняется заново, так как наличие ответа false
        gey()
    
 
if otvet == True: # ну и тут собсна сами ответы на твой ответ
    print ("Отлично!")
if otvet == False:
    print ("Грустно :(")
# проблема в том что цикл при ответе "Да" не заканчивается, хотя значение otvet2 меняется на true, что должно дать команду циклу while остановиться. но он этого не делает.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.10.2019, 00:00
Ответы с готовыми решениями:

Проблема с условиями
Здравствуйте у меня возникла такая проблема я в данный момент делаю 2D игру (В Unity 2018) и при создани скрипта атаки у меня возникли...

Проблема со условиями?
У меня возник такая проблема написал код разрешающий вход на другую форму если пароль или логин неверный то вылетает MessageBox. Почему...

Проблема с условиями!
Вообщем, у меня курсовая тест ПДД. Тест читается с ini файла, и мне надо вывести изображение на image по определенному клику( у меня есть...

9
 Аватар для BaklanichBaklan
0 / 0 / 0
Регистрация: 22.10.2019
Сообщений: 11
23.10.2019, 03:43  [ТС]
Я так понимаю что цикл в любом случае идет дальше, даже если условие уже выполнено? почему он так делает? почему цикл не останавливается на присваивании переменной
Python
1
otvet2 = True
??

Нарисовал картиночку что б проще было объяснить.
Миниатюры
Проблема с условиями в Python  
0
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
23.10.2019, 04:09
потому что:
в цикле while:
после первого if - у тебя выполняется второй
а если ответить на вопрос Да - то, выполняется ветка else
в которой ты пишешь:
otvet2 = False
таким образом, весь этот бред - хорошо не заканчивается:

console output:
Седня хорошая погода??
Ответ:Да
Отвечай
Ответ:Ху
Отвечай
Ответ:Нет
Грустно
0
 Аватар для BaklanichBaklan
0 / 0 / 0
Регистрация: 22.10.2019
Сообщений: 11
23.10.2019, 04:46  [ТС]
потому что:
в цикле while:
после первого if - у тебя выполняется второй
Так ведь он не должен выполняться если условие уже выполнилось, если переменная уже равна True, почему он переходит ко второму if?? не понимаю :-(
0
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
23.10.2019, 05:03
так работает:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
responded = False # переменная, которая отвечает за наличие ответа. она в самом начале потому, что дальше идет в цикле ссылка на неё, и она уже должна быть объявлена
print ("Седня хорошая погода??")
def gey():
    global otvet # назначаем переменную otvet глобальной, что нам дает использование ее вне функции
    otvet = input("Ответ:") # переменная, которая отвечает за содержание ответа
    
 
gey()
while responded != True:
  if (otvet == "Да") or (otvet == "Нет"):
      responded = True
  else:
      print ("Отвечай")
      gey()    
if otvet == "Да": 
    print ("Отлично!") 
if otvet == "Нет":
    print ("Грустно :(")
Добавлено через 5 минут
Цитата Сообщение от BaklanichBaklan Посмотреть сообщение
Так ведь он не должен выполняться
смотри внимательно какие именно otvet - ты сравниваешь и с чем.
у тебя выполнялось else - потому что Нет - это не Да и поэтому Да - тоже зацикливалось.
У тебя же всё перед глазами
0
 Аватар для BaklanichBaklan
0 / 0 / 0
Регистрация: 22.10.2019
Сообщений: 11
23.10.2019, 14:34  [ТС]
у тебя выполнялось else - потому что Нет - это не Да и поэтому Да - тоже зацикливалось.
Так вот в это и вопрос. Почему оно выполнялось, если otvet2 при ответе "Да" сменяется на True и условие выполняется. А он зачем то идёт дальше, хотя должен остановиться. У Пайтона правило такое проверять все, даже если условие цикла выполнилось?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
23.10.2019, 14:39
Лучший ответ Сообщение было отмечено BaklanichBaklan как решение

Решение

BaklanichBaklan, ты либо не читаешь, что тебе пишут либо не понимаешь написанного. Давай заново, вот про это
Цитата Сообщение от BaklanichBaklan Посмотреть сообщение
тут цикл должен закончиться если ответ "Да"
ну вот кто тебе сказал такую гадость? ты прочел главу про циклы в книге? Цикл заканчивается только на строке проверки условия (там где while или for) или при команде break, больше он нигде не заканчивается и продолжает выполнять все построчно. Учим матчасть!
1
 Аватар для Semen-Semenich
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,307
23.10.2019, 14:47
BaklanichBaklan, вы просто перемудрили и поэтому запутались. зачем создавать флаги и глобальную переменную
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def gey():
    otvet = input("Ответ: ")
    return otvet
 
 
print ("Седня хорошая погода??")
while True:
    otvet = gey()
    if otvet == "Да":
        print ("Отлично!")
        break
    elif otvet == "Нет":
        print ("Грустно :(")
        break
    print ("Отвечай  Да или Нет")
1
 Аватар для BaklanichBaklan
0 / 0 / 0
Регистрация: 22.10.2019
Сообщений: 11
23.10.2019, 17:13  [ТС]
. Ну вот кто тебе сказал такую гадость? ты прочел главу про циклы в книге? Цикл заканчивается только на строке проверки условия (там где while или for) или при команде break, больше он нигде не заканчивается и продолжает выполнять все построчно. Учим матчасть!
Благодарю! Именно это я и хотел понять, честно нигде эту информацию так четко написанную не нашел, по моему этому мало внимания уделено в учебниках. Если я вместо второго if в своем коде напишу elif - она выполняется как надо. Это происходит потому, что сейчас отсутствует логическая цепочка "else", "если что то кроме да". И в ней уже должно быть "если нет".? То есть else относится только к тому if, которое стоит непосредственно перед этим else?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
23.10.2019, 17:16
Цитата Сообщение от BaklanichBaklan Посмотреть сообщение
То есть else относится только к тому if, которое стоит непосредственно перед этим else?
конечно, для этого и формируем блоки, чтобы было понятно к чему что относится. Выше вам Семеныч хороший вариант написал
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.10.2019, 17:16
Помогаю со студенческими работами здесь

Проблема с python 2 и python 3
def find Smallest(a r r): smallest = arr С· ··· smallest_index = 0 """"". for i in range(l, len(arr)): if arr < smallest: ...

Проблема в Python
Возникла проблема, при выборе g5 и подобных сток в white, не удаётся заменить первый символ цифрой, как исправить? white = input() ...

Проблема с кодировкой c Python 2.7.x
Мяч (ООП) На основе книги "Hello World!" Уоррен Сэнд, Картер Сэнд В контексте объяснения, что такое self некоторые строки...

Проблема с кодом на Python
Скрипт не видит лог файл DropsSummoner.log, он должен после каждого обновления файла DropsSummoner.log, отправлять последнюю строчку на...

Возникла проблема с Python
Возникла проблема с написанием калькулятора не хочет запускать код, якобы все правильно написано, кто может помочь?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru