#python #sql
#python #sql
Вопрос:
Я новичок в программировании после прохождения MOOC на python, и я начал возиться для практики. Я нашел интересный отрывок в Интернете и воспользовался им. Цель состоит в том, чтобы написать код, который вычисляет pi на основе случайных переменных x, y, которые находятся в диапазоне от 0 до 1. Я выполнил основную задачу, но затем захотел добавить немного ошибок и поэкспериментировать. Я решил сохранить данные в таблицах SQL и сделать код устойчивым к вычислению pi с большей точностью.
Теперь я получаю следующую трассировку при попытке запустить свой код.
Traceback (most recent call last):
File "F:DesktopProgrammingpipisql.py", line 36, in <module>
num_point_circle=int(cur.fetchone()[0])
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
Мой код в целом:
import random
import sys
import sqlite3
conn = sqlite3.connect('pi.sqlite')
cur = conn.cursor()
#creating tables for x and y and making sure x and y are unique
cur.execute('''CREATE TABLE IF NOT EXISTS X
(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, x_value REAL UNIQUE)''')
cur.execute('''CREATE TABLE IF NOT EXISTS Y
(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, y_value REAL UNIQUE)''')
cur.execute('''CREATE TABLE IF NOT EXISTS XY
(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,x_id INTEGER, y_id INTEGER, loc TEXT)''')
cur.execute('''CREATE TABLE IF NOT EXISTS Pi
(id INTEGER PRIMARY KEY, pi_value REAL, Accuracy FLOAT, parses INTEGER,
incircle INTEGER UNIQUE)''')
#accuracy here is the number of digits after 3 and .
cur.execute('''SELECT MAX(parses) OR NULL AS parses FROM Pi''')
parses=cur.fetchone()
runs=input('Enter number of points: ')
print('***Started calculating***')
n=int(runs)
#If it is the first time I run the code
if parses is None:
num_point_circle=0
num_point_total=0
print('###STARTING FROM SCRATCH###')
else:
#To continue from last time
cur.execute('''SELECT MAX(incircle) AS incircle FROM Pi''')
num_point_circle=int(cur.fetchone()[0])
cur.execute('''SELECT MAX(parses) AS parses FROM Pi''')
num_point_total=int(cur.fetchone()[0])
print('###CONTINUE FROM',num_point_total,'PARSES###')
try:
for i in range (n):
x=random.uniform(0,1)
cur.execute('INSERT OR IGNORE INTO X (x_value) VALUES (?)',(x,))
y=random.uniform(0,1)
cur.execute('INSERT OR IGNORE INTO Y (y_value) VALUES (?)',(y,))
distance = x**2 y**2
if distance <=1:
num_point_circle =1
loc='Inside Circle'
cur.execute('INSERT OR IGNORE INTO XY (x_id,y_id,loc) VALUES (?,?,?)',(x,y,loc))
else:
loc='Outside Circle'
cur.execute('INSERT OR IGNORE INTO XY (x_id,y_id,loc) VALUES (?,?,?)',(x,y,loc))
num_point_total =1
p=4*num_point_circle/num_point_total
accu=(len(str(p))-2)
print('---->pi estimate for',num_point_total,'points is',p)
cur.execute('INSERT OR IGNORE INTO Pi (pi_value,Accuracy,parses,incircle) VALUES (?,?,?,?)',(p,accu,num_point_total,num_point_circle),)
print('Accuracy:',accu)
print('!!!DO NOT CANCEL. PROCEEDING TO COMMIT ON TABLE!!!')
conn.commit()
except KeyboardInterrupt:
p=4*num_point_circle/num_point_total
accu=(len(str(p))-2)
print('---->pi estimate for',num_point_total,'points is',p)
cur.execute('INSERT OR IGNORE INTO Pi (pi_value,Accuracy,parses,incircle) VALUES (?,?,?)',(p,accu,num_point_total,num_point_circle),)
print('Accuracy:',accu)
print('!!!DO NOT CANCEL. PROCEEDING TO COMMIT ON TABLE!!!')
print("***User ended calculation***")
conn.commit()
sys.exit()
Есть идеи, что я могу изменить?
Заранее большое спасибо
Комментарии:
1. Вероятно, cur.fetchone()[0] равно None, и u не может привести к int a None . вы можете попытаться распечатать значение перед использованием, чтобы увидеть, что происходит.
2. Большое спасибо @Zartch. Я устал и не думал об этом. Проблема заключалась в том, что начальное значение, которое проверяла программа, было кортежем. изменил parses=cur.fetchone() на parses=cur.fetchone()[0] и теперь все работает нормально 🙂