1. ホーム
  2. python

ループの中で関数を一度だけ実行させる効率的な方法

2023-08-13 10:30:27

質問

今のところ、以下のようなことをしているのですが、面倒になってきました。

run_once = 0
while 1:
    if run_once == 0:
        myFunction()
        run_once = 1:

もっと受け入れられる処理方法があると思うのですが?

私が探しているのは、ある関数を一度だけ、必要に応じて実行させることです。たとえば、特定のボタンが押されたときなどです。これは、ユーザーが制御する多くのスイッチを持っている対話型アプリです。すべてのスイッチに対してジャンク変数を持つことは、それが実行されたかどうかを追跡するためだけであり、ちょっと非効率的に思えたのです。

どのように解決するのですか?

関数にデコレータを使用して、実行回数を追跡する処理を行いますね。

def run_once(f):
    def wrapper(*args, **kwargs):
        if not wrapper.has_run:
            wrapper.has_run = True
            return f(*args, **kwargs)
    wrapper.has_run = False
    return wrapper


@run_once
def my_function(foo, bar):
    return foo+bar

現在 my_function は一度だけ実行されます。他の呼び出しを行なうと None . 単に else 節を if を追加してください。あなたの例では、何も返す必要はありません。

関数の作成をコントロールしない場合、あるいは関数を他のコンテキストで普通に使用する必要がある場合は、同様にデコレータを手動で適用することができます。

action = run_once(my_function)
while 1:
    if predicate:
        action()

これは my_function を他の用途に使えるようにします。

最後に、もし2回だけ実行すればよいのであれば、単に

action = run_once(my_function)
action() # run once the first time

action.has_run = False
action() # run once the second time