82

y = a^x解いてグラフに投影するプログラムを書きました。a < 1問題は、エラーが発生するたびに次のことです。

ValueError:基数10のint()のリテラルが無効です。

助言がありますか?

トレースバックは次のとおりです。

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' 

この問題は、1より小さいが、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")
4

4 に答える 4

97

答え:

あなたのトレースバックはそれが整数を取ることをあなたに伝えてい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には2つの主要なものがあります。整数(ℤ)を格納する整数、および実数(ℝ)を格納する浮動小数点数。必要なものに基づいて適切なものを使用する必要があります。

(注として、Pythonはこれを抽象化するのに非常に優れています。たとえば、他のほとんどの言語にも倍精度浮動小数点数がありますが、それについて心配する必要はありません。3.0以降、Pythonは整数も自動的に変換します。分割するとフロートするので、実際には非常に簡単に操作できます。)

トレースバックを取得する前の回答の以前の推測:

あなたの問題は、あなたがタイプしているものは何でも数字に変換できないということです。これは、次のような多くの原因で発生する可能性があります。

>>> 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。それに合わせて自然に更新されます。

また、PythonスタイルガイドであるPEP-8は、関数呼び出しを行うときに識別子と角かっこの間にスペースを入れないことを強く推奨していることに注意してください。

于 2012-12-13T14:12:47.697 に答える
29

Lattywareが言ったように、Python2とPython3には違いがあり、このエラーが発生します。

Python2では、int(str(5/2))2が得られます。Python3では、同じことが得られます。ValueError:10進数のint()の無効なリテラル:「2.5」

intの代わりにfloatを含む可能性のある文字列を変換する必要がある場合は、常に次の醜い数式を使用する必要があります。

int(float(myStr))

としてfloat('3.0')float('3')あなたに3.0をint('3.0')与えますが、あなたにエラーを与えます。

于 2013-11-07T20:20:35.930 に答える
10

入力時に正しく検証する方がよいa場合があります。

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

これはintにキャストaされるため、後で使用するすべての整数であることが保証されるか、例外を処理してユーザーに警告します。

于 2012-12-13T14:11:54.370 に答える
0

int()キャストは、小数点のある文字列番号を処理できません

-例->int( '13.5')はエラーを出しますが、int( '13')は文字列を整数に変換します

理由:これは、データセットを読み取り、浮動小数点数が含まれていることを知らない場合に0.5などの情報が失われるのを防ぐため、ユーザーが必要とする明示的なキャストと見なされます。

Work Around >

int(Float("13.5"))

私が直面した実際の例:int(I ["mpg"])が直接機能しないのに、intとして数値が必要だったので、float()を使用してからint()を使用しました。

sum([int(float(i["mpg"])) for i in file])//len(file)
于 2021-12-13T22:40:31.837 に答える