我有一个while循环,对另一个类提供的输出进行操作,直到没有输出为止。
while a.is_next():
fn(a.get_next())
有没有办法检查是否存在新项目。 "装载"它在同一时间?
while b=a.get_next():
fn(b)
答案 0 :(得分:4)
看起来你正试图重新发明iterator。迭代器必须有两个方法:一个__iter__
方法返回迭代器本身,一个__next__
方法返回下一个项目或引发StopIteration
。例如
class MyIterator:
def __init__(self):
self.list = [1, 2, 3]
self.index = 0
def __iter__(self):
return self
def __next__(self):
try:
ret = self.list[self.index]
self.index += 1
return ret
except IndexError:
raise StopIteration
这个例子很多,但它允许我们在Python期望迭代器的每个地方使用该迭代器
for x in MyIterator():
print(x)
1
2
3
答案 1 :(得分:3)
有没有办法检查是否存在新项目。 “加载”它同时?
简短的回答是否定的。 Python赋值不能代替while
循环的条件语句。但是,为什么不简单地在每次迭代时将a.get_next()
的值重新分配给变量,并将其用作循环条件:
b = a.get_next() # get the initial value of b
while b:
fn(b)
b = a.get_next() # get the next value for b. If b is 'fasly', the loop will end.
答案 2 :(得分:2)
不确定为什么要这样,但你可以分配并检查是否存在于同一语句中:
import itertools as it
for b in (x.get_next() for x in it.repeat(a) if x.is_next()):
fn(b)
答案 3 :(得分:0)
搜索生成器,迭代器和yield语句。
代码示例
class Container:
def __init__(self,l):
self.l = l
def next(self):
i = 0
while (i < len(self.l)):
yield self.l[i]
i += 1
c = Container([1,2,3,4,5])
for item in c.next():
print(item, end=" ") # 1 2 3 4 5