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)
计算结果如下:
代码中读取数据的循环是
def loop():
i = 0
while True:
yield "Data:%d" % i
i += 1
这是一个死循环,循环不断执行yield "Data:%d" % i
命令,这个命令是很关键的,由于存在yield
,所以loop()
不是一个函数而是一个generator
。generator
又称为生成器,它具有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.结束语
如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。◕ᴗᴗ◕。)づ