7

式を短く書く方法:

return '%.0f' % float_var if float_var else float_var

また

if float_var:
    return formatted_string
else:
    return None

ありがとう!

4

5 に答える 5

32

この表現<value> if <condition> else <other_value>はすでにかなり慣用的です-確かに他の例よりもそうです、そしておそらく<value>単純なときはいつでも好まれます。これはPythonの三項演算子なので、のようなものを探していた場合<condition> ? <value> : <other_value>、それは存在しません。

計算する<value><other_value>、いくつかの手順を実行する場合は、より長いif: ... else: ...代替手段を使用してください。

于 2010-03-27T14:06:30.790 に答える
6

式を読みやすくするために角かっこを使用します。

return ('%.0f' % float_var) if float_var else float_var

私が最初にそれを見たとき、私はそれを次のように読みました

return '%.0f' % (float_var if float_var else float_var)

それはばかげているでしょう。私はそれがどちらの方法で機能するかを確認するためにそれを試してみなければなりませんでした。

ところで、最初の例は2番目の例と同等ではありません

if float_var:
    return formatted_string
else:
    return None

これは常にフォーマットされた文字列またはNoneのいずれかを返します。Falseと評価されるもの(False、0、0.0、 ""、[]など)を渡した場合の最初の例では、変更されていないものが返されるため、戻りタイプはstring、boolean、list、int、floatなどになります。特に0.0がfloat_varの正当な値である場合は、おそらくあなたが望むものではありません。コードを次のように変更します。

return ('%.0f' % float_var) if isinstance(float_var, float) else None

または:

try:
    return "%.0f" % float_var
except TypeError:
    return None

これは、他の整数(およびlong)をfloatに変換することで機能します。

于 2010-03-27T14:29:08.507 に答える
2
  • 正確に何をしたいのかは明確ではありません。

    1. 最も文字通りの解釈では、このように機能します

      >>> float_var = 4.5
      >>> '%.0f' % float_var if float_var else float_var
      '5' # This is a string
      >>> float_var = 0.0
      >>> '%.0f' % float_var if float_var else float_var
      0.0 # This is a float
      

      あなたが望んでいないことはほぼ確実です。

    2. None「 」でチェックしたいのif float_varですか?その場合は、" if foo is not None" ではなく常に " " と綴りますif foo。前者の方が明確で、バグが発生しにくいためです。

      それ意図したものである場合は、モデルを修正することをお勧めします。繰り返し戻ってエラーを伝播するNoneのは悪いことです。それは醜く、バグが発生しやすく、慣用的ではありません。代わりに例外を使用してください。

  • 短いほど良いとは限りません。あなたのスニペットは、痛々しいほど長くも、扱いにくいものでもありません。実際、潜在的なバグを避けるためにそれらを使用する場合は、もう少し長くしたいと思うでしょう。

    • このための短絡動作を悪用することを提案する人がいるかもしれませんor。ただし、これによりコードが読みにくくなり、 との間で他の false 値を指定することができなくなりNone、バグにつながることがよくあります。
于 2010-03-27T17:28:59.387 に答える
1

すでに使用しているv if c else u場合は、最も読みやすく効率的な三項演算子をすでに使用しています。

他の方法もありますが、読みやすさに問題があります。

于 2010-03-27T14:08:23.237 に答える
0
float_var and "%.0f" % float_vav

すごいじゃないですか。

于 2010-03-27T18:51:35.953 に答える