python 输出对象不可迭代
python output object not iterable
我在这里看不到我能理解的相关答案。我有一些代码可以输出我认为可以迭代但不能迭代的列表。
代码:
class freqList():
def __init__(self, startFreq, stopFreq, skip):
self.startFreq = startFreq
self.stopFreq = stopFreq
self.skip = skip
def __iter__(self):
pass
def listFreqs(self):
return list(range(self.startFreq, self.stopFreq, self.skip))
def __repr__(self):
return '{}, {}, {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
def __str__(self):
return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
print('\n'*4)
listy = freqList( 1000, 5000, 1000)#range cannot use floats, only ints
print(listy.listFreqs())
print('listy type:', type(listy),'\n')
listy_iter = iter(listy)
print('listy_iter type:', type(listy_iter),'\n')
期望输出
当我实例化 class 时,我希望它成为 return 一个可迭代的类似列表的对象。
试过
我看到提到 next 需要覆盖,但我不知道那是什么意思,我是 OOP 的新手,只是刚刚了解 init、str 和 repr.
在 python 中,一旦你实例化一个 class 你得到的是一个对象。所以试试这个
listy_iter = iter(listy.listFreqs())
这将 return 列表,它是 class listFreqs
的 return 类型的函数 freqList()
现在listy_iter
会有一个列表
我对你的class
做了一个小小的调整
class freqList():
def __init__(self, startFreq, stopFreq, skip):
self.startFreq = startFreq
self.stopFreq = stopFreq
self.skip = skip
self._freqs = list(range(self.startFreq, self.stopFreq, self.skip))
def __iter__(self):
return iter(self._freqs)
def listFreqs(self):
return self._freqs
def __repr__(self):
return '{}, {}, {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
def __str__(self):
return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
如果您看的话,我更改了要在 __init__
中创建并存储在属性中的列表。然后 listFreqs 将调用此属性以显示整个列表。
迭代器的创建发生在 __iter__
,其中 self._freqs 被魔法包裹 iter()
.
如果您在 listFreqs
中定义了您的列表,那么它会在您每次调用此方法时重新计算。此外,class 在调用该方法之前不知道它是什么,因此它无法在其上创建迭代器。
您的 __iter__()
方法实际上必须 return 一个迭代器。像这样:
class freqList():
def __init__(self, startFreq, stopFreq, skip):
self.startFreq = startFreq
self.stopFreq = stopFreq
self.skip = skip
def __iter__(self):
return iter(range(self.startFreq, self.stopFreq, self.skip))
def __repr__(self):
return '{}, {}, {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
def __str__(self):
return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
listy = freqList( 1000, 5000, 1000)
for l in listy:
print(l)
尝试详细说明您的问题。
根据我的理解,以下是您正在寻找的东西
def __iter__(self):
iter_list = list(range(self.startFreq, self.stopFreq, self.skip))
for i in iter_list:
yield i
我在这里看不到我能理解的相关答案。我有一些代码可以输出我认为可以迭代但不能迭代的列表。
代码:
class freqList():
def __init__(self, startFreq, stopFreq, skip):
self.startFreq = startFreq
self.stopFreq = stopFreq
self.skip = skip
def __iter__(self):
pass
def listFreqs(self):
return list(range(self.startFreq, self.stopFreq, self.skip))
def __repr__(self):
return '{}, {}, {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
def __str__(self):
return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
print('\n'*4)
listy = freqList( 1000, 5000, 1000)#range cannot use floats, only ints
print(listy.listFreqs())
print('listy type:', type(listy),'\n')
listy_iter = iter(listy)
print('listy_iter type:', type(listy_iter),'\n')
期望输出
当我实例化 class 时,我希望它成为 return 一个可迭代的类似列表的对象。
试过
我看到提到 next 需要覆盖,但我不知道那是什么意思,我是 OOP 的新手,只是刚刚了解 init、str 和 repr.
在 python 中,一旦你实例化一个 class 你得到的是一个对象。所以试试这个
listy_iter = iter(listy.listFreqs())
这将 return 列表,它是 class listFreqs
的 return 类型的函数 freqList()
现在listy_iter
会有一个列表
我对你的class
做了一个小小的调整class freqList():
def __init__(self, startFreq, stopFreq, skip):
self.startFreq = startFreq
self.stopFreq = stopFreq
self.skip = skip
self._freqs = list(range(self.startFreq, self.stopFreq, self.skip))
def __iter__(self):
return iter(self._freqs)
def listFreqs(self):
return self._freqs
def __repr__(self):
return '{}, {}, {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
def __str__(self):
return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
如果您看的话,我更改了要在 __init__
中创建并存储在属性中的列表。然后 listFreqs 将调用此属性以显示整个列表。
迭代器的创建发生在 __iter__
,其中 self._freqs 被魔法包裹 iter()
.
如果您在 listFreqs
中定义了您的列表,那么它会在您每次调用此方法时重新计算。此外,class 在调用该方法之前不知道它是什么,因此它无法在其上创建迭代器。
您的 __iter__()
方法实际上必须 return 一个迭代器。像这样:
class freqList():
def __init__(self, startFreq, stopFreq, skip):
self.startFreq = startFreq
self.stopFreq = stopFreq
self.skip = skip
def __iter__(self):
return iter(range(self.startFreq, self.stopFreq, self.skip))
def __repr__(self):
return '{}, {}, {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
def __str__(self):
return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
self.startFreq,
self.stopFreq,
self.skip)
listy = freqList( 1000, 5000, 1000)
for l in listy:
print(l)
尝试详细说明您的问题。 根据我的理解,以下是您正在寻找的东西
def __iter__(self):
iter_list = list(range(self.startFreq, self.stopFreq, self.skip))
for i in iter_list:
yield i