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

では、ry 内から gs に '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

同様の問題が発生しましたが、呼び出しの順序を変更するだけで解決しました。

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 に答える
1

単に呼び出すのではなく、明示的に ry() を返します。

于 2009-01-13T18:02:45.360 に答える