1. ホーム
  2. python

[解決済み] ValueError: 基数が10のint()のリテラルは無効です。

2023-07-13 08:26:44

質問

を解くプログラムを書きました。 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")

どのように解決するのですか?

回答

トレースバックでは 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 に何もしなくても、自然にそれにあわせて更新されます。

また、以下のことに注意してください。 PEP-8、Pythonスタイルガイド , は、関数を呼び出すときに識別子と括弧の間にスペースを残さないことを強く勧めています。 .