Подтвердить что ты не робот

ValueError: неверный литерал для int() с базой 10

Я написал программу для решения y = a^x, а затем проецирую ее на график. Проблема в том, что всякий раз, когда a < 1 появляется ошибка:

ValueError: неверный литерал для int() с базой 10.

Любые предложения?

Здесь трассировка:

Traceback (most recent call last): 
   File "C:\Users\kasutaja\Desktop\EksponentfunktsioonTEST - koopia.py", line 13, in <module> 
   if int(a) < 0: 
ValueError: invalid literal for int() with base 10: '0.3' 

Проблема возникает каждый раз, когда я помещаю число, которое меньше единицы, но больше 0. Для этого примера это было 0,3.

Это мой код:

#  y = a^x

import time
import math
import sys
import os
import subprocess
import matplotlib.pyplot as plt
print ("y = a^x")
print ("")
a = input ("Enter 'a' ")
print ("")
if int(a) < 0:
    print ("'a' is negative, no solution")
elif int(a) == 1:
    print ("'a' is equal with 1, no solution")
else:
    fig = plt.figure ()
    x = [-2,-1.75,-1.5,-1.25,-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1,1.25,1.5,1.75,2]
    y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25),
            int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25),
            int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75),
            int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)]


    ax = fig.add_subplot(1,1,1)
    ax.set_title('y = a**x')
    ax.plot(x,y)
    ax.spines['left'].set_position('zero')
    ax.spines['right'].set_color('none')
    ax.spines['bottom'].set_position('zero')
    ax.spines['top'].set_color('none')
    ax.spines['left'].set_smart_bounds(True)
    ax.spines['bottom'].set_smart_bounds(True)
    ax.xaxis.set_ticks_position('bottom')
    ax.yaxis.set_ticks_position('left')


    plt.savefig("graph.png")
    subprocess.Popen('explorer "C:\\Users\\kasutaja\\desktop\\graph.png"')

def restart_program(): 
    python = sys.executable
    os.execl(python, python, * sys.argv)

if __name__ == "__main__":
    answer = input("Restart program? ")
    if answer.strip() in "YES yes Yes y Y".split():
        restart_program()
    else:
        os.remove("C:\\Users\\kasutaja\\desktop\\graph.png")
4b9b3361

Ответ 1

Ответ:

В вашей трассировке вам сообщается, что int() принимает целые числа, вы пытаетесь дать десятичное число, поэтому вам нужно использовать float():

a = float(a)

Это должно работать как ожидалось:

>>> int(input("Type a number: "))
Type a number: 0.3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '0.3'
>>> float(input("Type a number: "))
Type a number: 0.3
0.3

Компьютеры хранят номера различными способами. У Python два основных. Целые числа, которые хранят целые числа (ℤ) и числа с плавающей запятой, которые хранят реальные числа (ℝ). Вы должны использовать правильный, в зависимости от того, что вам нужно.

(В качестве примечания, Python довольно хорош в абстрагировании этого от вас, на большинстве других языков также есть числа с плавающей запятой двойной точности, но вам не нужно об этом беспокоиться. Начиная с версии 3.0, Python также будет автоматически конвертирует целые числа в float, если вы их разделяете, поэтому на самом деле очень легко работать.)

Предыдущее предположение в ответ до того, как мы получили трассировку:

Ваша проблема в том, что все, что вы печатаете, не может быть преобразовано в число. Это может быть вызвано множеством вещей, например:

>>> int(input("Type a number: "))
Type a number: -1
-1
>>> int(input("Type a number: "))
Type a number: - 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '- 1'

Добавление пробела между - и 1 приведет к тому, что строка не будет корректно проанализирована в число. Это, конечно, просто пример, и вам нужно будет рассказать нам, какой вклад вы даете нам, чтобы иметь возможность точно сказать, в чем проблема.

Рекомендации по стилю кода:

y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25),
            int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25),
            int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75),
            int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)]

Это пример очень плохой привычки кодирования. Где вы копируете что-то снова и снова, что-то не так. Во-первых, вы используете int(a) в тонне раз, где бы вы это ни делали, вместо этого вы должны назначить значение переменной и вместо этого использовать это вместо того, чтобы набирать (и заставлять компьютер вычислять) значение снова и снова:

a = int(a)

В этом примере я возвращаю значение a, перезаписывая старое значение новым, которое мы хотим использовать.

y = [a**i for i in x]

Этот код дает тот же результат, что и монстр выше, без того, чтобы массы повторяли одно и то же снова и снова. Это простое описание . Это также означает, что если вы отредактируете x, вам не нужно ничего делать с y, он, естественно, будет обновляться в соответствии с требованиями.

Также обратите внимание, что PEP-8, руководство по стилю Python, настоятельно рекомендует, чтобы вы не оставляли пробелы между идентификатором и скобками при выполнении вызова функции.

Ответ 2

Как сказал Lattyware, разница между Python2 и Python3 приводит к этой ошибке:

С Python2, int(str(5/2)) дает вам 2. С Python3 то же самое дает вам: ValueError: недействительный литерал для int() с базой 10: '2.5'

Если вам нужно преобразовать некоторую строку, которая может содержать float вместо int, вы всегда должны использовать следующую уродливую формулу:

int(float(myStr))

Поскольку float('3.0') и float('3') дают вам 3.0, но int('3.0') дает вам ошибку.

Ответ 3

Лучше проверить правильность a при вводе.

try:
  a = int(input("Enter 'a' "))
except ValueError:
  print('PLease input a valid integer')

Это либо передает a в int, поэтому вы можете быть уверены, что это целое число для всех последующих применений или обрабатывает исключение и предупреждает пользователя