math.sqrt приводит к TypeError: объект 'float' не может быть интерпретирован как целое число - PullRequest
1 голос
/ 09 июля 2019

Я делаю домашнее задание и хочу полностью обучить все классы тому, что они должны делать.Я наткнулся на эту ошибку типа TypeError, которая действительно беспокоила меня.

Это тест для оценки здоровья маленьких детей.Я попробовал Google, но это просто дало мне один большой кусок кода, и я попытался удалить класс Power и, конечно, дал мне ошибку.

Основной цикл (не закончен):

pd = Power()
num = pd.calc_num()
cir_num = int(math.sqrt(num))**2
circles = []
filled = 0
while True:
    for i in range(math.sqrt(cir_num)-1):
        for j in range(math.sqrt(cir_num)-1):
            c = Circle(frame, cir_num)
            circles.append(c)
    ##drawing
    for c in circles:
        if c.stage == 'empty':
            c.draw_empty()
        elif c.stage == 'filled':
            c.draw_filled()
    avar = 0
    for c in circles:
        avar += c.num2
    filled += avar

Определение класса мощности таково: как существует число, и есть функция, которая принимает 2 к степени ... числа.

Кругкласс то что есть кнопка.Если этап кнопки «пуст», я нарисую кнопку с пустым кружком.Если нажать кнопку с пустым кружком, у нее будет закрашенный кружок, который ничего не сделает.

Это сообщение об ошибке:

Traceback (most recent call last):
  File "C:/Users/roche/Documents/assignment.py", line 47, in <module>
    for i in range(math.sqrt(cir_num)-1):
TypeError: 'float' object cannot be interpreted as an integer

И размер tkinter равенстранно:

root.geometry('750x750+0+0')

дает мне вертикальный прямоугольник, и я ожидал квадратное окно.Спасибо!

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Вы используете диапазон , чтобы много значить, что это означает на естественном языке, который более или менее является сегментом действительной числовой линии , как в "температуре в диапазоне 37,2".С до 38,6 С ".Но это не то, что range() означает в Python.В Python это означает связка смежных целых чисел .Вот почему вы получаете жалобы по поводу поплавка, которому вы его называете.

1 голос
/ 09 июля 2019

Вы дважды используете выражение

range(math.sqrt(cir_num)-1)

Результат math.sqrt является значением с плавающей запятой, поэтому вы пытаетесь получить range значения с плавающей запятой.Как указано в документации для диапазона ,

Аргументы конструктора диапазона должны быть целыми числами (либо встроенными в int, либо в любом объекте, который реализует специальный метод __index__).

Так что если вы действительно хотите использовать range и math.sqrt вместе, вы должны преобразовать число с плавающей точкой в ​​int.Это, вероятно, то, что вы хотите:

range(int(math.sqrt(cir_num))-1)

Как следует из одного из комментариев, range требует целочисленного значения.Если вы спрашиваете range(math.sqrt(5)), как программа может выполнить цикл от 0 до 2.2361?Для этого нет очевидного смысла, поэтому Python требует зацикливания только целочисленных значений.Модуль numpy имеет функцию arange и функцию linspace , которые могут обрабатывать нецелые значения, но значение диапазонов несколько изменилось по сравнению с range в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...