4

在函数中的每个后续步骤之后我需要执行检查,因此我想将该步骤定义为函数中的函数。

>>> def gs(a,b):
...   def ry():
...     if a==b:
...       return a
...
...   ry()
...
...   a += 1
...   ry()
...
...   b*=2
...   ry()
... 
>>> gs(1,2) # should return 2
>>> gs(1,1) # should return 1
>>> gs(5,3) # should return 6
>>> gs(2,3) # should return 3

那么我如何让 gs 从 ry 中返回“a”?我想过使用 super 但认为这仅适用于课程。

谢谢

有点混乱......如果a == b,我只想返回a。如果 a!=b,那么我不希望 gs 返回任何东西。

编辑:我现在认为装饰器可能是最好的解决方案。

4

6 回答 6

11

你的意思是?

def gs(a,b):
    def ry():
        if a==b:
            return a
    return ry()
于 2009-01-13T18:02:06.750 回答
4

当您在函数中提到“步骤”时,您似乎想要一个生成器:

def gs(a,b):
  def ry():
    if a==b:
      yield a
  # If a != b, ry does not "generate" any output
  for i in ry():
    yield i
  # Continue doing stuff...
  yield 'some other value'
  # Do more stuff.
  yield 'yet another value'

(从 Python 2.5 开始,生成器现在也可以充当协程,使用新的 yield 语法。)

于 2009-01-14T02:13:17.740 回答
3

有点混乱......如果a == b,我只想返回a。如果 a!=b,那么我不希望 gs 返回任何东西。

然后检查:

def gs(a,b):
    def ry():
        if a==b:
            return a
    ret = ry()
    if ret: return ret
    # do other stuff
于 2009-01-13T21:37:48.953 回答
3

如果 a 和 b 最终相同,这应该允许您继续检查状态并从外部函数返回:

def gs(a,b):
    class SameEvent(Exception):
        pass
    def ry():
        if a==b:
            raise SameEvent(a)
    try:
        # Do stuff here, and call ry whenever you want to return if they are the same.
        ry()

        # It will now return 3.
        a = b = 3
        ry()

    except SameEvent as e:
        return e.args[0]
于 2009-02-18T20:31:03.280 回答
1

你显式地返回 ry() 而不是仅仅调用它。

于 2009-01-13T18:02:45.360 回答
1

我有一个类似的问题,但通过简单地改变调用顺序来解决它。

def ry ()
    if a==b 
        gs()

在某些语言(如 javascript)中,您甚至可以将函数作为变量传递给函数:

function gs(a, b, callback) {
   if (a==b) callback();
}

gs(a, b, ry);
于 2010-09-28T16:58:32.473 回答