当前位置: 首页 > 知识库问答 >
问题:

如何使用函数的返回值作为python中返回元组的条件

魏彦
2023-03-14

我一直在找这样的东西,但我找不到,所以就来了。

一些背景

我使用opencv从视频文件中检索帧。通常人们会无休止地循环这样做:

while (True):
    s, img = cv.read()

for i in xrange(10000): #just a big number
    s, img = cv.read()

现在我想检索所有帧并在没有更多帧时退出循环。然而,我在python中的技能还不够强,无法做我想做的事情。

我想知道的是

read函数(或方法,我不知道它们在python中是如何调用的)返回一个元组:首先代表操作成功,其次代表返回的帧。当元组的第一个元素为false时,我想打破while循环。有C背景,我想也许这可以工作:

while ((success, img = capture.read())[0]):
    #do sth with img

我认为这将打破成功是假的循环。但事实并非如此。然后我想也许这会奏效:

while ((success, img = capture.read()).success):
    #do sth with img

它也不起作用。我不想做这样的事情

while(True):
    s, i = capture.read()
    if (s == False):
        break

如何在中测试条件,而不是在if中如果成功则中断?

共有3个答案

唐兴发
2023-03-14

Python有一个可选的iter签名,它将函数作为第一个参数,将确定停止条件的哨兵作为第二个参数。

使用它,您可以得出如下结果:

for s,img in iter(cv.read, (False, None)):
    print img

尽管如此,我怀疑它是否比在if块中简单地中断好。

此外,它只接受哨兵作为整体返回值,并且不能基于它的某些部分(例如元组的第一个值)的停止条件。这可以是解决方法,但会使代码更加模糊:

>>> for s,img in itertools.takewhile(lambda x: x[0], iter(cv.read, None)):
    print img

它使用itertools。使用while来确定返回元组的第一个值何时等于False。

测试的完整版本:

>>> class Capture(object):
    def __init__(self):
        self.L = iter([1,2,3,4,5])
    def read(self):
        try:
            img = self.L.next()
        except StopIteration:
            return (False,None)
        return True, img

>>> cv = Capture()
>>> for s,img in iter(cv.read, (False, None)):
    print img

1
2
3
4
5

>>> cv = Capture()
>>> for s,img in itertools.takewhile(lambda x: x[0], iter(cv.read, None)):
    print img


1
2
3
4
5
富波光
2023-03-14

思考蟒蛇语的最好方法是忘记其他语言

s = True
while s:
    s, i = capture.read()
    if s:
        do_some_stuff(i)
牛昱
2023-03-14

您可以编写一个生成器函数。

def readframes(cv):
    while True:
        success, frame = cv.read()
        if success:
            yield frame
        else:
            return

这样,就可以使用for循环遍历帧。

for frame in readframes(cv):
    do_something_with_frame(frame)
 类似资料:
  • 相对来说,我是一个与Java智能合约交互的新手,在尝试检索智能合约函数返回的tuple[]时遇到了一个问题。这是我想调用的函数的ABI定义: 以下是智能合约代码的链接:https://polygonscan . com/address/0x 920 f 22 E1 e 5 da 04504 b 765 f 8110 ab 96 a 20 e 6408 BD # code 下面是我编写的调用该函数的

  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 问题内容: 我想在两个单独的变量中从函数返回两个值。例如: 我希望能够分别使用这些值。当我尝试使用时,它返回,这不是我想要的。 问题答案: 你不能返回两个值,但可以返回并在调用后解压缩它: 在线意味着创建一个元组。你也可以使用括号,例如,但是元组是用逗号创建的,因此括号不是必需的。但是,你可以使用parens来提高代码的可读性或将元组分成多行。这同样适用于。 如果要返回两个以上的值,请考虑使用命名

  • 到目前为止,我们创建的函数都只是对传入的数据进行了处理,处理完了就结束。但实际上,在某些场景中,我们还需函数将处理的结果反馈回来,就好像主管向下级员工下达命令,让其去打印文件,员工打印好文件后并没有完成任务,还需要将文件交给主管。 Python中,用 def 语句创建函数时,可以用 return 语句指定应该返回的值,该返回值可以是任意类型。需要注意的是,return 语句在同一函数中可以出现多次

  • 问题内容: 我认为我完全理解这一点,但我只是想确保,因为我总是看到人说要 永远 对测试,或。 他们建议例程应引发错误,而不是返回False或None。无论如何,在很多情况下,我只是想知道是否设置了标志,所以我的函数返回True或False。在其他情况下,如果没有有用的结果,我将有一个函数返回None。根据我的想法,只要我意识到我永远都不要使用: 而是应使用: 因为True,False和None都是

  • 我正在尝试从函数返回布尔值。 错误:布尔文字不符合预期的类型单位。 我知道unit是kotlin中的默认返回类型。我将如何将其更改为布尔值。