Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ValueError: invalid literal for int () with base 10

I wrote a program to solve y = a^x and then project it on a graph. The problem is that whenever a < 1 I get the error:

ValueError: invalid literal for int () with base 10.

Any suggestions?

Here's the traceback:

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'  

The problem arises every time I put a number that is smaller than one, but larger than 0. For this example it was 0.3 .

This is my code:

#  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") 
like image 800
user1901162 Avatar asked Dec 13 '12 14:12

user1901162


People also ask

How do I fix this ValueError invalid literal for int with base 10 error in Python?

ValueError: invalid literal for int() with base 10 occurs when you convert the string or decimal or characters values not formatted as an integer. To solve the error, you can use the float() method to convert entered decimal input and then use the int() method to convert your number to an integer.

What does ValueError invalid literal for int () with base 10 mean in Python?

invalid literal for int() with base 10. The error message invalid literal for int() with base 10 would seem to indicate that you are passing a string that's not an integer to the int() function . In other words it's either empty, or has a character in it other than a digit.

How do you convert string to int in Python?

To convert a string to integer in Python, use the int() function. This function takes two parameters: the initial string and the optional base to represent the data. Use the syntax print(int("STR")) to return the str as an int , or integer.


1 Answers

Answer:

Your traceback is telling you that int() takes integers, you are trying to give a decimal, so you need to use float():

a = float(a) 

This should work as expected:

>>> 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 

Computers store numbers in a variety of different ways. Python has two main ones. Integers, which store whole numbers (ℤ), and floating point numbers, which store real numbers (ℝ). You need to use the right one based on what you require.

(As a note, Python is pretty good at abstracting this away from you, most other language also have double precision floating point numbers, for instance, but you don't need to worry about that. Since 3.0, Python will also automatically convert integers to floats if you divide them, so it's actually very easy to work with.)

Previous guess at answer before we had the traceback:

Your problem is that whatever you are typing is can't be converted into a number. This could be caused by a lot of things, for example:

>>> 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' 

Adding a space between the - and 1 will cause the string not to be parsed correctly into a number. This is, of course, just an example, and you will have to tell us what input you are giving for us to be able to say for sure what the issue is.

Advice on code style:

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)] 

This is an example of a really bad coding habit. Where you are copying something again and again something is wrong. Firstly, you use int(a) a ton of times, wherever you do this, you should instead assign the value to a variable, and use that instead, avoiding typing (and forcing the computer to calculate) the value again and again:

a = int(a) 

In this example I assign the value back to a, overwriting the old value with the new one we want to use.

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

This code produces the same result as the monster above, without the masses of writing out the same thing again and again. It's a simple list comprehension. This also means that if you edit x, you don't need to do anything to y, it will naturally update to suit.

Also note that PEP-8, the Python style guide, suggests strongly that you don't leave spaces between an identifier and the brackets when making a function call.

like image 118
Gareth Latty Avatar answered Oct 13 '22 04:10

Gareth Latty