Python如何在从循环之外不断获取循环内的数据但不退出循环

  • 1.配置环境
  • 2.问题描述
  • 3.问题解决
  • 4.结束语


1.配置环境

使用环境:python3.7
平台:Windows10
IDE:PyCharm

2.问题描述

博主在制作一个UI的时候遇到一个问题,我希望通过一个循环不断读取摄像头的图片,但是读取出来的图片需要在另一个函数中处理。一开始的想法是通过while循环读取摄像头图片,通过return返回读取出来的图片,再将读取到的图片传入到另外函数中进行处理。但是很快便发现通过return回来图片数据后,while循环便会中止。经过一段时间的分析博主解决了这个问题,记录在此博客中。如果你也遇到同样的问题或许这篇文章可以对你有所启发。

3.问题解决

首先我们将问题抽象一下:我们希望从循环之外不断获取一个循环中的数据,但不退出循环。

首先直接上代码

# author:Hurricane
# date:  2022/1/25
# E-mail:hurri_cane@qq.com

def loop():
	i = 0
	while True:
		yield "Data:%d" % i
		i += 1


if __name__ == '__main__':
	loop_item = loop()
	for data in loop_item:
		data += " process"
		print(data)

计算结果如下:

为什么python循环后输出none python循环外输出_后端

代码中读取数据的循环是

def loop():
	i = 0
	while True:
		yield "Data:%d" % i
		i += 1

这是一个死循环,循环不断执行yield "Data:%d" % i命令,这个命令是很关键的,由于存在yield,所以loop()不是一个函数而是一个generatorgenerator又称为生成器,它具有next方法,可以通过next命令让generator向下执行。
现在我来看main函数中如何使用这个generator获取数据的,首先,我们通过如下命令将这个generator实例化

loop_item = loop()

为什么python循环后输出none python循环外输出_yield_02

他们便得到了loop_item这个实例化后的generator,我们通过

next(loop_item)

来递推这个generator

为什么python循环后输出none python循环外输出_为什么python循环后输出none_03


每一次执行next命令,loop中的循环便会执行到yield语句,并且将yield语句后的内容返回,然后暂时退出循环,当下一次执行next命令,程序便会接着上次退出循环的位置继续执行循环中的内容。

通过next方法使用generator是繁琐的,好在Python开发者为我们设计的for循环可以很好地简化这个步骤:

通过for循环可以调用这个generator:

for data in loop_item:
		data += " process"
		print(data)

它的工作流程等效于:

while True:
	try:
		data = next(loop_item)
		data += " process"
		print(data )
	except StopIteration as e:
		print('Generator return value:', e.value)
		break

至此,我们便实现了从循环之外不断获取循环内的数据但不退出循环,对应到读取摄像头的方法如下:

# author:Hurricane
# date:  2022/1/25
# E-mail:hurri_cane@qq.com
import cv2


def get_img():
	cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
	while True:
		success, frame = cap.read()
		if success:
			yield frame


if __name__ == '__main__':
	img_item = get_img()
	for img in img_item:
		img = cv2.resize(img,(400,300))
		cv2.imshow("img", img)
		cv2.waitKey(1)

4.结束语

如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。◕ᴗᴗ◕。)づ