Saya menulis sebuah program untuk memecahkan y = a^x
dan kemudian memproyeksikannya pada sebuah grafik. Masalahnya adalah bahwa setiap kali a < 1
saya mendapatkan error:
ValueError: tidak valid literal untuk int () dengan basis 10.
Ada saran?
Berikut ini's 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'
Masalah muncul setiap kali saya menempatkan jumlah yang lebih kecil dari satu, tetapi lebih besar dari 0. Untuk contoh ini adalah 0.3 .
Ini kode saya:
# 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")
Anda traceback memberitahu anda bahwa int()
mengambil bilangan bulat, anda mencoba untuk memberikan desimal, sehingga anda perlu menggunakan float()
:
a = float(a)
Ini harus bekerja sesuai dengan yang diharapkan:
>>> 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
Komputer menyimpan angka-angka dalam berbagai cara yang berbeda. Python memiliki dua yang utama. Bilangan bulat, yang menyimpan seluruh nomor (ℤ), dan angka floating point, yang menyimpan bilangan real (ℝ). Anda perlu menggunakan yang paling tepat berdasarkan pada apa yang anda butuhkan.
(Sebagai catatan, Python cukup bagus di mengabstraksi ini jauh dari anda, kebanyakan bahasa lainnya juga memiliki double precision floating point bilangan, misalnya, tapi anda don't perlu khawatir tentang itu. Sejak 3.0, Python juga akan secara otomatis mengkonversi bilangan bulat ke mengapung jika anda membagi mereka, jadi itu's benar-benar sangat mudah untuk bekerja dengan.)
Masalah anda adalah bahwa ketika anda mengetik lebih dapat't diubah menjadi angka. Hal ini bisa disebabkan oleh banyak hal, misalnya:
>>> 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'
Menambahkan spasi antara -
dan 1
akan menyebabkan string yang tidak dapat dibaca dengan benar ke nomor. Ini adalah, tentu saja, hanyalah sebuah contoh, dan anda akan memiliki untuk memberitahu kami apa yang masukan yang anda berikan bagi kita untuk dapat mengatakan secara pasti apa masalah ini.
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)]
Ini adalah contoh yang benar-benar buruk coding kebiasaan. Di mana anda menyalin sesuatu lagi dan lagi-lagi ada sesuatu yang salah. Pertama, anda menggunakan int(a)
banyak kali, di mana pun anda melakukan ini, anda malah harus menetapkan nilai ke variabel, dan menggunakannya sebagai gantinya, menghindari mengetik (dan memaksa komputer untuk menghitung) nilai lagi dan lagi:
a = int(a)
Dalam contoh ini saya menetapkan nilai kembali ke a
, timpa nilai lama dengan yang baru yang ingin kita gunakan.
y = [a**i for i in x]
Kode ini menghasilkan hasil yang sama seperti rakasa di atas, tanpa massa menulis hal yang sama lagi dan lagi. It's sederhana [daftar pemahaman][1]. Ini juga berarti bahwa jika anda edit x
, anda don't perlu melakukan apa-apa untuk y
, secara alami akan update sesuai.
Juga perhatikan bahwa PEP-8, Python style guide, menyarankan kuat bahwa anda don't meninggalkan ruang antara pengenal dan tanda kurung ketika membuat panggilan fungsi.
Sebagai Lattyware mengatakan, ada perbedaan antara Python2 & Python3 yang menyebabkan kesalahan ini:
Dengan Python2, int(str(5/2))
memberi anda 2.
Dengan Python3, sama memberi anda: ValueError: tidak valid literal untuk int() dengan dasar 10: '2.5'
Jika anda perlu untuk mengubah beberapa string yang dapat berisi mengapung bukan int, anda harus selalu menggunakan berikut jelek rumus:
int(float(myStr))
Sebagai float('3.0')
dan float('3')
memberikan 3.0, tapi int('3.0')
memberi anda kesalahan.
Mungkin akan lebih baik untuk memvalidasi a
saat itu adalah masukan.
try:
a = int(input("Enter 'a' "))
except ValueError:
print('PLease input a valid integer')
Ini baik gips a
untuk int sehingga anda dapat yakin bahwa hal itu adalah sebuah integer untuk semua kemudian menggunakan atau pegangan pengecualian dan alert pengguna