Не удается заставить цикл while, основанный на логических выражениях, работать правильно - PullRequest
0 голосов
/ 08 апреля 2019

Я не могу получить правильную логику за логическими выражениями, чтобы функция выполнялась.

Я основываю свой код на упражнении LPTHW 35. Я просто скопировал структуру этого упражнения и попытался заставить его работать.Я хотел проверить и посмотреть, смогу ли я заставить цикл while работать.

Если я наберу «Да» с капиталом Y, будет напечатано «Надень дождевик, м ..», но не запустит функцию «дождь» ().Я получаю следующую ошибку:

Traceback (most recent call last):
  File "ex35_2.py", line 52, in <module>
    temp ()
  File "ex35_2.py", line 12, in temp
    wool()
  File "ex35_2.py", line 29, in wool
    rain()
TypeError: 'bool' object is not callable

Кроме того, условие else выходит из программы, я вижу это.Но что, если я хочу, чтобы это началось снова?Что он зацикливается до тех пор, пока не получит «да» или «нет»?


def wool():
    print "OK, so it is pretty cold outside!"
    print "Put on the wool."
    print "But is it raining?"
    rain = True

    while True:
        next = raw_input("> ")

        if next == "Yes": #if written with "Yes", it prints "Put on the.." 
            print "Put on the rain coat, m*!" 
            rain()
        elif next == "Yes" and rain:
            print "It is raining, but I dont wanna stress with the rain coat!"
        elif next == "No" and not rain: #how do I activate this condition since rain = True?
            print "You dont need a raincoat."
            march("With wool and no raincoat.")
        else:
            print "You should make a choice." #this is the only output. 
        exit(0)

Когда я даю другой пользовательский ввод, он переходит прямо к оператору else.

You should make a choice.

Ответы [ 3 ]

0 голосов
/ 08 апреля 2019

Ваша программа распечатывает оператор else, потому что вы не сделали отступ для содержимого своих else и elif.Прямо сейчас «Вы должны сделать выбор» напечатано вне вашего if-заявления.

0 голосов
/ 08 апреля 2019

Я постараюсь исправить код и дать несколько советов:

def wool():
    print "OK, so it is pretty cold outside!"
    print "Put on the wool."
    print "But is it raining?"
    rain = True

    while True:
        next = raw_input("> ")

        if next == "Yes": #if written with "Yes", it prints "Put on the.." 
            print "Put on the rain coat!" 
            rain()
        elif next == "Yes" and rain: #!!!
            print "It is raining, but I dont wanna stress with the rain coat!" #!!!
        elif next == "No" and not rain: #how do I activate this condition since rain = True?
            print "You dont need a raincoat."
            march("With wool and no raincoat.")
        else:
            print "You should make a choice." #this is the only output. # !!!
        exit(0)

Ищите # !!! Первый: этот элиф никогда не будет оцениваться, просто потому что, если next == "Да" первый, если выиграет, конечно. Я бы изменил это на:

if next == "Yes": #if written with "Yes", it prints "Put on the.."
    if rain:
        print "It is raining, but I dont wanna stress with the rain coat!"
    else:
        print "Put on the rain coat, *****!" 
        rain()
elif next .....

Логика, стоящая за чем-то, здесь скрыта: вы спрашиваете, идет ли дождь, и запишите: rain = True

«Как мне активировать это условие, поскольку дождь = Истина?»

хорошо, если пользователь сказал, что не идет дождь, не идет дождь.

Я не знаю, почему вы используете предварительно установленное логическое значение, даже если у вас есть пользовательский ввод.

Отступ после остального: оператор.

Что ж, вы еще оператор получите все входные данные "Нет", потому что дождь действительно всегда истинен.

Думая, что булевому дождю как-то нужно:

elif next == "No" 
    if rain:
        print("Lie!")
        #maybe rain = False ??
    else:
        print "You dont need a raincoat."
        march("With wool and no raincoat.")
else:
    print "You should make a choice." #this is the only output. # !!!
exit(0)
0 голосов
/ 08 апреля 2019

Я предполагаю, что вы загружаете модуль или определяете функцию rain() где-то перед вызовом функции wool().

Итак, что происходит сейчас, так это то, что в тот момент, когда вы объявляете переменную rain = True , определение локальной переменной имеет приоритет над предыдущим определением функции . Это подразумевает, что вместо вызова функции rain() вы «вызываете» переменную rain.

Чтобы избежать этого, следите за своим пространством имен. Если вы импортируете модуль, содержащий rain, вы можете импортировать весь модуль и затем использовать module_name.rain().

Если вы просто определяете функцию в скрипте, вам нужно переименовать либо функцию, либо переменную. Например, заменить rain = True на it_is_raining = True

Хотя это объясняет, почему rain() не вызывается, вы также должны быть осторожны с порядком построения if ... elif .... Если вы введете 'Yes', вы всегда будете выполнять код после оператора if, а последующие условия будут пропущены.

...