38

私はPythonの三項演算子のアプローチに精通しています:

value = foo if something else bar

私の質問は非常に単純です: 事前の割り当てなしで、( if ...) で評価される用語を戻りオペランド (... ifまたはelse ...) の 1 つから参照する方法はありますか?

ここでの動機はif ...、三項演算の結果としてまさに私が望むものである式を時々使用することです。ただし、小さな式の場合は繰り返しても問題ありませんが、少し長い式の場合はやや厄介になります。これを例にとります:

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"
4

2 に答える 2

44

これを行う方法はありません。これは意図的なものです。三項 if は、些細な場合にのみ使用することになっています。

計算結果を 2 回使用する場合は、一時変数に入れます。

value = info.findNext("b")
value = value if value else "Oompa Loompa"

これを行うと、何かばかげたことをしていることは明らかになります。実際、これを Python で書く方法は次のとおりです。

value = info.findNext("b")
if not value:
    value = "Oompa Loompa"

そして、実際には、最初の試行よりもキーストロークが5 回少なくなっています。

本当にキーストロークを節約したい場合は、代わりにこれを行うことができます:

value = info.findNext("b") or "Oompa Loompa"

しかし、それは多くのスタイル ガイドや BDFL によって推奨されていません。

これを 1 回だけ行う場合は、より明確にすることをお勧めします。6 回も実行している場合は、すべての組み込み関数や stdlib 関数と同様に、findNextの代わりにオプションのデフォルト値を返すようにするのが簡単で、はるかに優れています。None

def findNext(self, needle, defvalue=None):
    # same code as before, but instead of return None or falling off the end,
    # just return defvalue.

次に、これを行うことができます:

value = info.findNext("b", "Oompa Loompa")
于 2012-12-31T20:01:17.903 に答える
22

絶対に使わないif ... elseでください。代わりに、Python の合体演算子を利用してください。

value = info.findNext("b") or "Oompa Loompa"
于 2012-12-31T19:46:15.017 に答える