【问题标题】:Python: How to return data more that once during a function callPython:如何在函数调用期间多次返回数据
【发布时间】:2016-12-05 17:34:28
【问题描述】:

有没有什么方法可以调用一次函数,然后在不同的时间多次返回数据?

例如,假设我有以下代码:

def do_something():
    for i in range(1, 10):
        return 1

但是,我希望能够从单个函数调用中返回多个数据,但在异步时间,这可能吗?


对于上下文,我有一个程序可以生成 word 文档,将它们转换为 pdf,然后将它们组合成一个 pdf 文档。我希望能够从 GUI 调用外部函数来创建文档,然后显示一个进度条,显示该函数的当前进度。


编辑:

我已经知道yield 函数。我认为我在问题底部的具体问题会有所帮助。更清楚地说,我正在寻找一种从函数返回多个值并为每个返回值引发不同事件的方法。虽然这可能是一个糟糕的例子,但我想要做的是类似于 Javascript 中的.then(){},但能够使用多个返回值执行.then(){}

【问题讨论】:

  • 是的,确实有这样的东西:yieldstackoverflow.com/questions/231767/…
  • yield 你必须一次又一次地打电话。他希望它被称为单次。
  • @harshil9968 生成器需要调用一次。您存储迭代器,然后一次又一次地调用 iterator。这就是 for 循环语义所做的。重复调用函数会导致迭代器丢失状态并从头开始。
  • “在异步时间”是什么意思?你的意思是当被问到时,带有yield 的生成器或迭代器是做什么的?你的意思是在预定的时间,这可以通过一个带有计时器发送消息的单独线程来完成?您是指在除时间之外的预定情况下,这也可以通过发送消息来完成,具体取决于情况,或者更简单地使用回调函数?你还有别的意思吗?

标签: python function python-3.x


【解决方案1】:

yield 是几乎每个人都提到的从函数返回或获取多个值的东西。

已阅读您的问题陈述。这是我将为您设计的解决方案。

创建一个更新状态栏的函数,状态栏的值将从全局变量中获取。所以global x=0在启动时,在更新函数中它会首先更新x = x+1,然后它会增加状态栏。

def do_something():
    for i in range(1, 10):
        # fetch and perform operation on that Doc for PDF
        update_status_bar()

【讨论】:

    【解决方案2】:

    你想要一个生成器:

    def do_something():
        for i in range(1,10):
            yield i
    
    nums = do_something()
    

    每次您在 nums 上调用 next 时,do_something 的主体将继续执行到下一个 yield 语句,此时它会返回该值。

    >>> print next(nums)   # Outputs 1
    >>> print next(nums)   # Outputs 2
    >>> ...
    

    【讨论】:

    • 你读过他的问题陈述吗?我认为这不会解决他的问题。
    • 它已经完成了一半。他需要一个生成器,但它不会以随机间隔神奇地调用自己来为未指定的消费者提供值。
    • 感谢您的回答,但我已经知道yield 功能。我认为我在问题底部的具体问题会有所帮助,我正在寻找一种从函数返回多个值并为返回的每个值引发不同事件的方法
    • 函数不能那样工作。对于进度条之类的东西,something 会定期调用一个函数来了解已经取得了多少进展,并使用结果调用某种屏幕更新函数。您提出的问题过于宽泛,无法回答。
    • @Ronikos 请看看我的回答。
    【解决方案3】:

    您正在寻找generators

    而不是从您的函数返回yield(读取What does the "yield" keyword do in Python?)。

    def do_something():
        for i in range(1, 10):
            yield i
    

    如果您希望重复调用此函数,则需要有一个重复调用此函数的包装器。有点类似于:

    def worker():
        for i in do_something():
           UpdateProgress(i)
           sleep(prgressInterval)
    
        thread = Thread(target=worker)
        thread.start()
    

    【讨论】:

    • 感谢您的回答,但我已经知道yield 功能。我认为我在问题底部的具体问题会有所帮助,我正在寻找一种从函数返回多个值并为返回的每个值引发不同事件的方法
    猜你喜欢
    • 2022-01-08
    • 2017-04-28
    • 2018-07-06
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多