【问题标题】:python: how to return two values at different position of calculating in a function?python:如何在函数中的不同计算位置返回两个值?
【发布时间】:2019-12-13 18:34:27
【问题描述】:

我想要一个函数来处理预定义管道中的数据,并且我需要中间和最后一步的数据,所以我想要一个可以调用两次的函数,在第一次调用中,函数返回中间数据,在第二次调用中,函数从最后一个返回位置开始,返回最终数据,所以是这样的:

def tworeturns(x):
    intermediate = do-something(x)
    return intermediate
    final = do-something(intermediate)
    return final

如何用python实现这个?

================================================ =============================

感谢 new-dev-123 的回答,我能够返回两个值,但后来又遇到了另一个问题。在第一次产量之后,我改变了中间体,当我第二次调用下一次时,我希望函数根据修改后的中间体进行计算,而不是原来的中间体。有没有办法做到这一点?

【问题讨论】:

  • 尝试:返回中间,最终
  • 我认为你想要一个协程 - 尝试使用 yield 而不是 return 并使用 next(tworeturns(x)) 从调用者那里驱动协程
  • 如果你需要在不同的时间输出,那么你就不走运了。如果do-something 需要“状态”,您可以尝试使用生成器。否则,也许有一种方法可以重写(或拆分)函数,使其不可知。
  • 不,我希望它们异步返回。因为我需要中间来决定如何计算最终的

标签: python python-3.x python-2.7 jupyter-notebook yield


【解决方案1】:

使用像协程这样的生成器可以让你有效地暂停函数,你可以使用next()来驱动它

>>> def tworeturns(x):
...     print(f"hi {x}")
...     yield
...     print(f"bye {x}")
...     yield
... 
>>> corou = tworeturns("bob")
>>> next(corou)
hi bob
>>> next(corou)
bye bob

这是我在 cli 上做的一个快速演示

因此,对于您的示例,您可以执行以下操作:

def tworeturns(x):
    intermediate = do-something(x)
    yield intermediate
    final = do-something(intermediate)
    yield final

corou = tworeturns(x)
first_value = next(corou)
second_value = next(corou)

【讨论】:

  • 这里有个新问题,在第一次yield之后,我改变了中间,现在当我调用next时,函数继续原来的中间。有没有办法用修改后的中间值继续计算?
  • 您必须粘贴代码,因为我无法复制您所说的内容。它应该已经在使用修改后的值了。
【解决方案2】:

好的,这是一个很好的问题,我有时也会遇到类似的情况。

正如您的问题中的一位 cmet 所说,您可以使用生成器,它可以真正回答您的问题。

但我更喜欢以下解决方案:

def tworeturns(x, intermediate=None):
    if intermediate is None:
        return do_something(x)
    else:
        return do_something(intermediate)

当然,您现在需要使用中间结果调用tworeturns。但它是一个清晰的代码,也是无状态的。

【讨论】:

    【解决方案3】:

    返回两个值(这会给你一个元组):

    def tworeturns(x):
        intermediate = do-something(x)
        final = do-something(intermediate)
        return intermediate, final
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多