ValueError: неверный литерал для int () в моей программе и в операторе if, кроме - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть программа, которая принимает данные, добавляет их в список и выплевывает среднее из указанного списка. Я хочу сделать так, чтобы вы могли ввести MENU, и это остановит программу () и позволит вам либо выйти, либо перезапустить программу (). Все работает нормально, пока вы не наберете МЕНЮ (все прописные). Спасибо всем! :) Еще новичок в python.

from functools import reduce

def programy():
    running = True

    print("I output the average of a list that you add files to.")
    listy = []

    while running == True:
        def listaverage(givenlist):
            print(sum(listy) / len(listy))

        currentnum = input("Please type a number to add to the list: ")

        try:
            val = int(currentnum)
        except ValueError:
            if str(currentnum) == "MENU":
                running = False
            else:
                print("Not a number!")
                continue

        listy.append(int(currentnum))
        listaverage(listy)

    answer = input("Please type either: EXIT or RESTART")

    if str(answer) == "RESTART":
        running = True
    if answer == "EXIT":
        exit

programy()
Traceback (most recent call last):
  File "C:\Users\hullb\OneDrive\Desktop\average_via_input.py", line 34, in <module>
    programy()
  File "C:\Users\hullb\OneDrive\Desktop\average_via_input.py", line 24, in programy
    listy.append(int(currentnum))
ValueError: invalid literal for int() with base 10: 'MENU

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Ошибка проста: вы берете строку в качестве ввода, скажем, если для выхода из l oop то есть МЕНЮ, а в строке

listy.append(int(currentnum))

вы вводите ее в целое число , Вот почему вы получаете вышеупомянутую ошибку. Не меняя большую часть кода, вам нужно всего лишь сдвинуть несколько строк, чтобы сделать это. Просто переместите

    listy.append(int(currentnum))
    listaverage(listy)

под блоком try, где, если это число, вы делаете, как требуется. Также определите функцию listaverage (listy) вне основной программы, если только вы не хотите, чтобы она действовала как генератор.

0 голосов
/ 09 февраля 2020
if str(currentnum) == "MENU":
    running = False

устанавливает условие while на false и останавливает выполнение следующей итерации, но текущая еще не завершилась, поэтому в int(currentnum) вы пытаетесь преобразовать "MENU" в int.

Используйте вместо этого isdigit(), чтобы проверить значение

if currentnum.isdigit():
    listy.append(int(currentnum))
    listaverage(listy)
else:
    if str(currentnum) == "MENU":
        running = False
    else:
        print("Not a number!")
...