我知道你在遇到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循環。 –