Как исправить ошибку "TypeError: 'float' object is not iterable"
Мне необходимо написать программу, которая открывает файл, считывает данные и производит над ними операции.
При отладке появилась ошибка:
"TypeError: 'float' object is not iterable".
Не могу понять с чем она связана и как ее решить.
Сама ошибка представлена на скриншоте
https://i.stack.imgur.com/NuFwt.png
Код программы:
class File(): # в классе происходит обработка данных из файла и необходимые для работы вычисления
def __init__(self):
print('в классе')
def FILE(self):#построчное чтение из файла
self.y = []
self.t1 =[]
self.t2 =[]
self.x = []
self.y1 = []
self.input_file = easygui.fileopenbox(filetypes=["*.docx"])
self.f = open (self.input_file)
nenado = '---end of log file---'
for i in range (2):
self.f.readline()
for line in self.f:
if nenado in line:
break
else:
a = line[1:6]
b = line[7:12]
time = line[25:32]
self.t1.append(float(a))
self.t2.append(float(b))
self.x.append(float(time))
self.f.close()
def rasschet_ΔTy(self):#график из файла
self.y = [self.t2 - self.t1 for self.t1, self.t2 in zip(self.t1, self.t2)]
return self.y
def rasschet_x(self):#ось времени
self.x = [z/60 for z in self.x]
return self.x
def rasschet_ΔTy1(self):# график смещенный в 0
self.k = self.t2[0] - self.t1[0]
self.rasschet_ΔTy()
self.y1 =[g - self.k for g in self.y]
return self.y1
def rasschet_filtr_ΔTy(self):# цифровой фильтр для графика из файла
self.yhat = savgol_filter(self.rasschet_ΔTy(), 251, 3)
return self.yhat
def rasschet_filtr_ΔTy1(self):# цифровой фильтр для графика смещенного в 0
self.yhat1 = savgol_filter(self.rasschet_ΔTy1(), 251, 3)
return self.yhat1
a = File()
def demo():
a.FILE()
demo()
def Demo():#для проверки
print(a.rasschet_ΔTy1())
print(a.rasschet_ΔTy())
print(a.rasschet_x())
Demo()
Ответы (1 шт):
Если убрать всё лишнее, то можно смоделировать вашу ситуацию таким примером:
class Example:
def __init__(self):
self.a = [3.14, 4.15]
def func(self):
self.b = sum(self.a for self.a in self.a)
# тут будет проблема ^^^^^^
example = Example()
print(example.a)
example.func()
print(example.a)
example.func()
Вывод:
[3.14, 4.15]
4.15
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-17-5a56c598e878> in <module>()
10 example.func()
11 print(example.a)
---> 12 example.func()
<ipython-input-17-5a56c598e878> in func(self)
4
5 def func(self):
----> 6 self.b = sum(self.a for self.a in self.a)
7
8 example = Example()
TypeError: 'float' object is not iterable
Из-за того, что вы использовали поле класса в качестве переменной для спискового сокращения, это поле перестало содержать список и стало содержать последнее из значений списка. Метод класса, который вызывает проблемную функцию у вас тоже вызывается два раза. Первый раз он отрабатывает нормально, а второй раз уже "обламывается".
Эта проблемная строка у вас, как уже заметил gil9red в комментариях:
self.y = [self.t2 - self.t1 for self.t1, self.t2 in zip(self.t1, self.t2)]
^^^^^^^^^^^^^^^^
Не используйте поля класса в качестве временных переменных спискового сокращения, используйте там какие-то обычные переменные и проблем не будет.