ValueError: nederīgs literāls int () ar bāzi 10

Es uzrakstīju programmu, lai atrisinātu y = a^x un pēc tam projicētu to uz grafika. Problēma ir tāda, ka ikreiz, kad a < 1, man parādās kļūda:

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

Kādi ieteikumi?

Šeit ir izsekojums:

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' 

Problēma rodas ikreiz, kad ievada skaitli, kas ir mazāks par 1, bet lielāks par 0. Šajā piemērā tas bija 0,3 .

Šāds ir mans kods:

#  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")
Risinājums

Atbilde:

Atbilde: Atbilde: Jūsu izsekojums norāda, ka int() pieņem veselus skaitļus, bet jūs mēģināt ievadīt decimālskaitli, tāpēc jums jāizmanto float():

a = float(a)

Tam vajadzētu darboties, kā paredzēts:

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

Datori glabā skaitļus dažādos veidos. Python ir divi galvenie. Veseli skaitļi, kuros tiek saglabāti veseli skaitļi (ℤ), un skaitļi ar peldošo komata punktu, kuros tiek saglabāti reālie skaitļi (ℝ). Jums ir jāizmanto pareizais no tiem, pamatojoties uz to, kas jums ir nepieciešams.

(Kā piezīmi, Python ir diezgan labi abstrahējies no šī jautājuma, vairumam citu valodu ir arī, piemēram, dubultās precizitātes skaitļi ar peldošo komata punktu, bet jums par to nav jāuztraucas. Kopš versijas 3.0 Python automātiski pārveido veselos skaitļus peldošajos, ja tos dalāt, tāpēc ar tiem ir ļoti viegli strādāt.)

Pirmāks atbildes minējums, pirms mums bija izsekojamība:

Jūsu problēma ir tā, ka to, ko jūs rakstāt, nevar pārvērst par skaitli. To var izraisīt daudzas lietas, piemēram:

>>> 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 "", line 1, in 
ValueError: invalid literal for int() with base 10: '- 1'

Ja starp - un 1 pievienosiet atstarpi, virkne netiks pareizi pārveidota par skaitli. Tas, protams, ir tikai piemērs, un, lai mēs varētu droši pateikt, kas ir problēmas cēlonis, jums būs mums jānorāda, kādu ievaddatni jūs ievadāt.

Padoms par koda stilu:

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

Šis ir ļoti slikta kodēšanas ieraduma piemērs. Ja jūs kaut ko kopējat atkal un atkal, kaut kas ir nepareizi. Pirmkārt, jūs tonnām reižu lietojat int(a), un visur, kur to darāt, jums tā vietā vajadzētu piešķirt vērtību mainīgajam un izmantot to, lai izvairītos no vērtības rakstīšanas (un piespiešanas datoram to aprēķināt) atkal un atkal:

a = int(a)

Šajā piemērā es vērtību atkal piešķiru a, pārrakstot veco vērtību ar jauno, ko vēlamies izmantot.

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

Šis kods dod tādu pašu rezultātu kā iepriekš minētais briesmonis, bez masveidīgas vienas un tās pašas lietas rakstīšanas atkal un atkal. Tā ir vienkārša [saraksta izpratne][1]. Tas nozīmē arī to, ka, rediģējot x, jums nav nekas jādara ar y, tas dabiski atjaunināsies atbilstoši tam.

Jāņem vērā arī tas, ka PEP-8, Python stila rokasgrāmata, stingri iesaka neatstāt atstarpes starp identifikatoru un iekavām, kad veicat funkcijas izsaukumu.

Komentāri (4)

Kā teica Lattyware, ir atšķirība starp Python2 & amp; Python3, kas izraisa šo kļūdu:

Izmantojot Python2, int(str(5/2)) dod 2. Izmantojot Python3, tas pats dod jums: ValueError: invalid literal for int() with base 10: '2.5'

Ja nepieciešams konvertēt kādu virkni, kas varētu saturēt float, nevis int, vienmēr jāizmanto šāda neglīta formula:

int(float(myStr))

Tā kā float('3.0') un float('3') dod jums 3.0, bet int('3.0') dod jums kļūdu.

Komentāri (2)

Iespējams, būtu labāk pārbaudīt a tieši tad, kad tas tiek ievadīts.

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

Tas vai nu pārvērš a par int, lai jūs varētu būt pārliecināti, ka tas ir vesels skaitlis visiem turpmākajiem lietojumiem, vai arī apstrādā izņēmumu un brīdina lietotāju.

Komentāri (0)