kzen.dev
  • Spørsmål
  • Tagger
  • Brukere
Meldinger
Belønninger
Registrering
Når du har registrert deg, vil du bli varslet om svar og kommentarer til spørsmålene dine.
Logg inn
Hvis du allerede har en konto, kan du logge inn for å sjekke nye varsler.
Det vil være belønninger for spørsmål, svar og kommentarer.
Mer
Kilde
Rediger
 user1901162
user1901162
Spørsmål

ValueError: ugyldig literal for int () med base 10

Jeg skrev et program for å løse y = a^x og deretter projisere det på en graf. Problemet er at hver gang a < 1 får jeg feilen:

ValueError: ugyldig bokstav for int () med base 10.

Noen forslag?

Her er sporingen:

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' 

Problemet oppstår hver gang jeg setter et tall som er mindre enn en, men større enn 0. For dette eksemplet var det 0,3 .

Dette er koden min:

#  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")
64 2012-12-13T14:09:27+00:00 3
 CDspace
CDspace
Redigerte spørsmål 3. august 2017 в 8:32
Programmering
python
python-3.x
Løsning / svar
Gareth Latty
Gareth Latty
13. desember 2012 в 2:12
2012-12-13T14:12:47+00:00
Mer
Kilde
Rediger
#17978071

Svar:

Tracebacken din forteller deg at int() tar heltall, du prøver å gi et desimaltall, så du må bruke float():

a = float(a)

Dette bør fungere som forventet:

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

Datamaskiner lagrer tall på en rekke forskjellige måter. Python har to hovedmåter. Heltall, som lagrer hele tall (ℤ), og flyttall, som lagrer reelle tall (ℝ). Du må bruke den riktige basert på hva du trenger.

(Som en merknad er Python ganske flink til å abstrahere dette fra deg, de fleste andre språk har for eksempel også flytende tall med dobbel presisjon, men du trenger ikke å bekymre deg for det. Siden 3.0 vil Python også automatisk konvertere heltall til flyttall hvis du deler dem, så det er faktisk veldig enkelt å jobbe med).

Forrige gjetning på svaret før vi hadde sporingen:

Problemet ditt er at det du skriver ikke kan konverteres til et tall. Dette kan være forårsaket av mange ting, for eksempel:

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

Å legge til et mellomrom mellom - og 1 vil føre til at strengen ikke blir analysert riktig til et tall. Dette er selvfølgelig bare et eksempel, og du må fortelle oss hva du skriver inn for at vi skal kunne si med sikkerhet hva problemet er.

Råd om kodestil:

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

Dette er et eksempel på en veldig dårlig kodingsvane. Der du kopierer noe igjen og igjen er noe galt. For det første bruker du int(a) massevis av ganger, uansett hvor du gjør dette, bør du i stedet tilordne verdien til en variabel, og bruke den i stedet, og unngå å skrive (og tvinge datamaskinen til å beregne) verdien igjen og igjen:

a = int(a)

I dette eksemplet tilordner jeg verdien tilbake til a, og overskriver den gamle verdien med den nye vi ønsker å bruke.

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

Denne koden produserer det samme resultatet som monsteret ovenfor, uten massene av å skrive ut det samme igjen og igjen. Det er en enkel listeforståelse. Dette betyr også at hvis du redigerer x, trenger du ikke å gjøre noe med y, det vil naturligvis oppdatere seg til å passe.

Legg også merke til at PEP-8, Python-stilguiden, anbefaler sterkt at du ikke etterlater mellomrom mellom en identifikator og parentesene når du foretar et funksjonskall.

 Fernando
Fernando
Redigert svar 6. august 2017 в 11:56
69
0
Le Droid
Le Droid
7. november 2013 в 8:20
2013-11-07T20:20:35+00:00
Mer
Kilde
Rediger
#17978072

Som Lattyware sa, er det en forskjell mellom Python2 og Python3 som fører til denne feilen:

Med Python2 gir int(str(5/2)) deg 2. Med Python3 gir det samme deg: ValueError: ugyldig literal for int() med base 10: '2.5'

Hvis du trenger å konvertere en streng som kan inneholde float i stedet for int, bør du alltid bruke følgende stygge formel:

int(float(myStr))

Ettersom float('3.0') og float('3') gir deg 3.0, men int('3.0') gir deg feilen.

24
0
 dm03514
dm03514
13. desember 2012 в 2:11
2012-12-13T14:11:54+00:00
Mer
Kilde
Rediger
#17978070

Det kan være bedre å validere a rett når det legges inn.

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

Dette gjør enten a til en int slik at du kan være sikker på at det er et heltall for all senere bruk, eller det håndterer unntaket og varsler brukeren.

 dm03514
dm03514
Redigert svar 13. desember 2012 в 2:17
9
0
Legg til spørsmål
Kategorier
Alle
Teknologi
Kultur / Fritid
Liv / Kunst
Vitenskap
Profesjonell
Virksomhet
Brukere
Alle
New
Popular
1
Ilya Smirnov
Registered 1 dag siden
2
Денис Васьков
Registered 2 dager siden
3
Dima Patrushev
Registered 4 dager siden
4
sirojidddin otaboyev
Registered 1 uke siden
5
Елена Гайдамамакинат
Registered 1 uke siden
BG
DE
EL
ES
FR
ID
IT
JA
LV
NL
NO
PT
RO
TR
ZH
© kzen.dev 2023
Kilde
stackoverflow.com
under lisens cc by-sa 3.0 med attribusjon