我知道你在遇到None
时想破坏你的外部while
。
您可以容纳一个布尔变量,即True
,而while
必须执行,而False
应该停止。
这应该是这样的:
frame = 0
elems_max = 10
running = True
while running and frame is not None:
frames = []
for _ in range(elems_max):
frame = queue_in.get()
if frame is not None:
frames.append(frame)
else:
running = False
break
process_data(frames)
的break
指令将打破内for
,而不是外while
。 但是,将running
设置为False
后,while
循环将停止。
根据您的评论。
这是不可能包括在修真break
声明,也不是else
条款,如您想做的事:
帧= [f有关我在范围内,如果queue_in.get()是(elems_max)不无其他休息]
但是,您可以建立您的清单,然后经过删除所有元素的None
:
frames = [queue_in.get() for _ in range(elems_max)]
try:
noneId = frames.find(None)
frames = frames[:noneId]
except ValueError:
pass
这是不是很有效,因为许多潜在的因素将在0123追加没有。 我宁愿手动施工,以避免这种危害。
另一个解决方案,基于一个发电机。 这可能不是您所期望的,但语法很简单,所以您可能会喜欢它。
的想法是包裹发电机内部的数据的获得,是对None
值突破:
def queue_data_generator(queue, count):
for _ in range(count):
item = queue.get()
if item is None:
raise StopIteration
else:
yield item
然后,实例化这个发电机,并简单地遍历它:
g = queue_data_generator(queue_in, elems_max)
frames = [frame for frame in g]
frames
列表将包含queue_in
中包含的所有帧,直到第一个None
。 这个用法很简单,但你必须通过定义生成器来设置它。 虽然我觉得它很优雅。
你是什么意思“我想打破我的工作过程”?你的意思是你的'while'循环吗? –
是的,我不想打破我的和while循环。 –