проблема с типом данных в массиве

у меня проблема

ask = int(input("h"))

h = [0]*ask

h[1],h[2]=1,1
print(h[0],type(h[0]),h[1],type(h[1]))

for i in range(2,ask):


    h[i]= int()
    h[i]= h[i-1]+h[i-2]

    if type(h[i] ** 0.5)  != float():
        
        print(type(h[i] ** 0.5))
        print(h[i])

Этот код выводит ask чисел фибоначи и проверяет их на целый квадратный корень(например если попадает число 144 и квадратный корень из него является целым то 144 выводится принтом), но я не знаю что делать т.к. думаю что условие в if написал неправильно и тип выводимых данных float, как можно исправить проблему с типом float и ифом?


Ответы (2 шт):

Автор решения: CrazyElf

Корень всегда будет числом с плавающей точкой. Проверяйте лучше, что остаток от деления на 1 равен 0, это нормально работает для проверки целых чисел:

if h[i] ** 0.5 % 1 == 0:
   ...

Другой вариант: брать целую часть от корня, возводить её обратно в квадрат, и проверять, что получилось то же, что и было до всех этих манипуляций:

if int(h[i] ** 0.5) ** 2 == h[i]:
    ...

Тоже самое можно чуть проще делать с использованием функции пакета math:

import math

if math.isqrt(h[i]) ** 2 == h[i]:
    ...
→ Ссылка
Автор решения: Be3y4uu_K0T

Возведение в дробную степень возвращает всегда float, поэтому для проверки чисел на полный квадрат лучше использовать этот ответ:

import math

def is_square(number: int) -> bool:
    return number == math.isqrt(number) ** 2
→ Ссылка