Цикл Python while работает не так, как ожидалось

Я пытаюсь выполнить свое задание и борюсь. Идея состоит в том, что вы выбираете тип отчета, A или T. Оттуда вы продолжаете вводить целые числа, пока не выйдете. Как только вы выйдете, он должен распечатать общее количество целых чисел, сложенных вместе для отчета «T»; или для отчета «А» он должен напечатать итог, а также список введенных целых чисел.

Проблема, с которой я сталкиваюсь в данный момент, связана с отчетом «T», когда я ввожу целые числа, ничто не приведет к ошибке или выходу. Он просто постоянно просит меня ввести другое целое число. Затем из отчета «А» каждое целое число, которое я ввожу, просто дает «недопустимый ввод». Я уверен, что в моем коде, вероятно, есть еще много проблем, но в данный момент я не могу обойти эти. Любые указатели будут действительно оценены. Спасибо

def adding_report(report):
    total = 0
    items = []
    while True:
        user_number = input("Enter an ingteger to add to the total or \"Q\" to quit: ")
        if report.upper == "A":
            if user_number.isdigit():
                total += int(user_number)
                items.append(user_number)
            elif user_number.upper() == "Q":
                break
            else:
                print("Invalid input\n")
        elif report.upper() == "T":
            if user_number.isdigit():
                total += int(user_number)
            elif user_number.upper() == "Q":
                break
        else:
            print("Invalid input\n")

report = input("Report types include All Items (\"A\") or Total Only (\"T\")\nPlease select report type \"A\" or \"T\": ")
while True:
    if report.upper() in "A T":
        adding_report(report)
    else:
        print ("Invalid input")
        report = input("Please select report type \"A\" or \"T\": ")

person danni_dougal    schedule 24.07.2018    source источник
comment
if report.upper == "A": отсутствует пара скобок.   -  person Kevin    schedule 24.07.2018
comment
Ах да, это немного помогло. Теперь просто не могу заставить его выйти из цикла, если я введу «Q»   -  person danni_dougal    schedule 24.07.2018
comment
Как сказал Кевин, ваша проблема в строке 6: вы делаете не оператор эквивалентности для двух строк, а оператор эквивалентности для определения функции и строки. if report.upper == "A" оценивается как if <function str.upper> == "A"   -  person Daniel R. Livingston    schedule 24.07.2018
comment
Дэнни, для твоей второй проблемы, когда ты вызываешь break в adding_report, ты переносишься обратно в основной цикл. Добавьте еще один break под adding_report(report) в строке 26.   -  person Daniel R. Livingston    schedule 24.07.2018


Ответы (3)


Оператору in требуется набор возможных значений. Использовать

if report.upper() in ("A", "T")

или (ближе к тому, что у вас есть)

if report.upper() in "A T".split()
person blue_note    schedule 24.07.2018
comment
Я согласен, что это проблема, но я не думаю, что это вызывает описанную проблему. report.upper() in "A T": оценивается как True, если report равно A. - person Kevin; 24.07.2018

Ваша первая проблема в этой строке:

    if report.upper == "A":

Это всегда оценивается как False, потому что report.upper — это функциональный объект, а не значение. Тебе нужно

    if report.upper() == "A":

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

report = input("Report types include All Items (\"A\") or Total Only (\"T\")\nPlease select report type \"A\" or \"T\": ")
report = report.upper()

Это избавит вас от беспорядка и времени на звонки upper каждый раз, когда вы обращаетесь к этому письму.

Пожалуйста, просмотрите свой код на наличие повторяющихся элементов и опечаток; вы избавите себя от головной боли в долгосрочной перспективе — я знаю по личному опыту.

person Prune    schedule 24.07.2018

Попробуй это

def adding_report(report):
      total = 0
      items = []
      while True:
        user_number = input("Enter an integer to add to the total or \"Q\" to quit: ")
        #You used "report.upper" instead of "report.upper()"
        if report.upper() == "A":
            if user_number.isdigit():
                total += int(user_number)
                items.append(user_number)
            elif user_number.upper() == "Q":
                break
            else:
                print("Invalid input\n")
        elif report.upper() == "T":
            if user_number.isdigit():
                total += int(user_number)
                #You forgot ot add this : "items.append(user_number)"
                items.append(user_number)
            elif user_number.upper() == "Q":
                break
        else:
            print("Invalid input\n")
            break
#Add this for loop termination: "or 0 to quit: "
report = input("Report types include All Items (\"A\") or Total Only (\"T\")\nPlease select report type \"A\" or \"T\" Or 0 to quit: ")
while True:
    #it should be this ""if report.upper() in "A" or "T":"" not this ""if report.upper() in "A T":""
    if report.upper() in "A" or "T":
        adding_report(report)
    #The condition below terminates the program
    elif report == '0':
        break
    else:
        print("Invalid input")
    report = input("Please select report type \"A\" or \"T\": ")
person Chinonso Ngwu    schedule 24.07.2018