Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для BaklanichBaklan
0 / 0 / 0
Регистрация: 22.10.2019
Сообщений: 11

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

23.10.2019, 00:00. Показов 2278. Ответов 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,310
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
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru