0

多くの場合、次の構造のように、そのような値が条件を満たす場合にのみ、関数によって返される値を使用する必要があります。

tmp = my_func(x)
if tmp == some_value:
    # do something with tmp

次のように、 new variable の使用を避けることで、このコードをより簡潔で読みやすくしたいと思いますtmp

if my_func(x) == some_value:
    # do something with my_func(x) last return

別の例は次のとおりです。

tmp = initialization_value
while tmp != some_value:
    tmp = my_func(x)
    # do something with tmp
    # change value of x

それはより簡潔で読みやすいでしょう

while my_func(x) != some_value:
    # do something with my_func(x) last return
    # change value of x

そのようなコーディング スタイルを取得または実装することは可能ですか?

ファローアップ

それを取得する最良の方法は、最後に返された値をキャッシュするデコレーターを使用することです。以下の回答を参照してください。

究極かつ決定的なソリューション

この質問には投票がありませんでしたが、そのような言語機能を求めたのは私だけではなかったようです。実際、最終的に Python 3.8 では、このニーズに正確に対応するwarus operatorが導入されました。Python 3.8+ では、上記のコードは次のように非常に便利に記述されます。

if (result := my_func(x)) == some_value:
    # do something with result
4

5 に答える 5

2

いいえ、 if ステートメントで割り当てることはできません。最初のコードは問題ありません。

于 2012-12-04T11:01:33.523 に答える
1

次のように書くことは有効です:

if my_func(x) == some_value:
    # do something 
    return something

ただし、ステートメントmy_func(x)内での結果を使用する場合は、再計算する必要があるため、その方法は問題ありません。if

于 2012-12-04T11:07:42.010 に答える
0

この構造が頻繁にある場合は、次のことができます

def cmp_iter(a, b):
    if a == b:
        yield a
# general case:
def if_iter(a, b, testfunc):
    if testfunc(a, b):
        yield a

その時するために

for tmp in cmp_iter(my_func(x), some_value):
    frobnicate(tmp)
    return tmp

この for ループは、条件が満たされない場合は実行されず、条件が満たされた場合は 1 回だけ実行されます。

ただし、これは非常に珍しいことであり、コードの潜在的な読者を混乱させる可能性があるため、そうすることを控えるか、十分にドキュメントを作成してください。

于 2012-12-04T11:13:45.307 に答える
-1

装飾された関数によって返された最後の値を属性に保存するデコレーターを使用して、きちんとした解決策を見つけました (より良い解決策を歓迎します) last。私の構成は次のようになります。

if my_func(x) == some_value:
    # do anything with the value returned by my_func, saved in my_func.last
    # such as
    print my_func.last
    return my_func.last

簡潔明瞭。関数は 1 回だけ評価されるため、煩わしい一時変数を導入する必要はありません。

もちろん、属性を '有効' にしたい関数を次のように装飾することを忘れないでくださいlast(デコレータ名は であると仮定しますsave_last):

@save_last
def my_func(...):
    # function definition

デコレータは次のように定義されます。

# last value returned by decorated function is accessible as 'last' attribute
def save_last(f):
    def w(*args, **kwargs): # w is the 'wrapper' function
        w.last=f(*args, **kwargs)
        return w.last
    return w
于 2012-12-06T15:04:56.800 に答える