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

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

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)

计算结果如下:
在这里插入图片描述

代码中读取数据的循环是

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()

在这里插入图片描述

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

next(loop_item)

来递推这个generator
在这里插入图片描述
每一次执行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.结束语

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

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hurri_cane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值