質問

関数の後続の各ステップの後に実行する必要があるチェックがあるため、そのステップを関数内の関数として定義したかった

>>> 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がまだ何も返さないようにします。

編集デコレーターが最適なソリューションかもしれません。

役に立ちましたか?

解決

これにより、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]

他のヒント

という意味ですか?

def gs(a,b):
    def ry():
        if a==b:
            return a
    return ry()

「ステップ」に言及したとおり関数では、ほとんどジェネレーターが必要なようです:

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構文。)

  

少し混乱がありました...私は   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

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

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

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

javascriptのような一部の言語では、関数の変数として関数を渡すこともできます。

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

gs(a, b, ry);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top