web-dev-qa-db-ja.com

より短く、よりPython的なifステートメントの記述方法

私はこれを持っています

bc = 'off'

if c.page == 'blog':
    bc = 'on'

print bc

Pythonでこれを書くためのよりPython的な(および/または短い)方法はありますか?

44
32423hjh32423

最も短いものは次のとおりです。

bc = 'on' if c.page=='blog' else 'off'

一般に、これは少しわかりにくいかもしれませんので、意味が明確な場合にのみ使用してください。 booleanい高速に見え始めるので、大きなブール句には使用しないでください。

95
freiksenet

これは:

  1. 間違いなく短い
  2. おそらくPythonic(Python 2.5より前、論争の的になったX if Z else Y構文)
  3. 疑わしいほど読みやすい。これらの警告を念頭に置いて、ここにそれが行きます:

    bc = ("off","on")[c.page=="blog"]
    

編集:要求ごとに、一般化された形式は次のとおりです。

   result = (on_false, on_true)[condition]

説明:conditionは、ブールに評価されるものであれば何でもかまいません。 Tupleのインデックス付けに使用されるため、整数として扱われます:False == 0True == 1は、タプルから適切なアイテムを選択します。

65
Arkady

まあ、pythonの男ではないので、これを塩の大粒で取ってください。しかし、多くのことを書きました(そして、より困難に、read)。長年にわたる巧妙なコード、私は今、読みやすいコードを強く好みます。私はPythonガイとしては誰でもないのに、あなたの元のコードが何をしていたかの要点を知った。確かに、あなたはそれを隠すことができ、多分Pythonワンクを印象づけることができますが、なぜですか?

33
John Lockwood

または、インラインifステートメントを使用できます。

>>> cpage = 'blog'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'on'
>>> cpage = 'asdf'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'off'

このブログ でその機能について少し説明しています。関連するPEPは PEP308 です。インラインifステートメントは、Python 2.5。

これはもう少しPythonicかもしれませんが、次の方法で使用できます:

>>> cpage = 'asdf'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'off'
>>> cpage = 'blog'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'on'

これは、1行だけでなくラムダステートメントでより頻繁に使用されますが、

 A and B or C

と類似しています

   if A:
       return B
   else:
       return C

私はもう少し長い説明を書くつもりでしたが、彼らはそれをよりよくカバーしていました at Dive into Python 。彼らはまた、おそらくあなたが知る必要があるいくつかの警告に注意しました。

13
Mark Rushakoff

別の可能性は、それらにアクセスする関数の外部で値を計算できる場合に辞書を使用することです(つまり、値は静的であり、これはscribleの回答のコメントで評価の問題に対処します)。

want_bc = {True: "on", False: "off"}
# ...
bc = want_bc[c.page == "blog"]

私はこれを好むか、テストよりも計算を好むという一般的なルーブリックの下でのタプルインデックスソリューションを好みます。

5
user135331

使用できます

a = b if c else d 

ただし、python 2.5より前のバージョンを使用している場合、

bc = c.page == "blog" and "on" or "off"

トリックもできます。

2