C# では、次のように簡単に記述できます。
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
Python で同じことを行う簡単な方法はありますか、それとも「if」ステートメントにこだわっていますか?
C# では、次のように簡単に記述できます。
string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;
Python で同じことを行う簡単な方法はありますか、それとも「if」ステートメントにこだわっていますか?
In Python 2.5, there is
A if C else B
which behaves a lot like ?: in C. However, it's frowned upon for two reasons: readability, and the fact that there's usually a simpler way to approach the problem. For instance, in your case:
stringValue = otherString or defaultString
@ダン
if otherString: stringValue = otherString else: stringValue = defaultString
このタイプのコードはより長く、より表現力豊かですが、より読みやすくなっています
そうですね、長くなりました。「より表現力豊か」と「より読みやすく」についてはよくわかりません。少なくとも、あなたの主張には議論の余地があります。2 つの理由から、それは完全に間違っているとさえ言えます。
まず、あなたのコードは意思決定を (かなり極端に) 強調しています。一方、条件演算子は、他の何か、つまり値 (またはその値の代入) を強調します。そして、これはまさにこのコードの作成者が望んでいることです。意思決定は、むしろコードの副産物です。ここで重要な部分は代入操作です。あなたのコードは、この割り当てを多くの構文ノイズ、つまり分岐に隠しています。
あなたのコードは、重要な部分から重点を移すため、表現力が低下します。
それでも、あなたのコードはおそらく?:
. inline-if
が望ましいでしょう。個人的には、Python 2.5 で導入されたバリアントは逆なので好きではありません。C の三項演算子と同じフロー (方向) で読み取るものを好みますが、ASCII 文字の代わりに単語を使用します。
C = if cond then A else B
これは圧倒的に勝ちます。
残念ながら、C と C# には、そのような表現力のあるステートメントはありません。しかし (これが 2 番目の引数です)、C 言語の三項条件演算子は非常に長い間確立されているため、それ自体がイディオムになっています。if
三項演算子は、「従来の」ステートメントと同じくらい言語の一部です。これはイディオムなので、その言語を知っている人なら誰でもすぐにこのコードを正しく読むことができます。さらに、これらのセマンティクスを表現する非常に短く簡潔な方法です。実際、それは想像できる最短の方法です。無用なノイズで本質を覆い隠していないため、非常に表現力豊かです。
最後に、Jeff Atwood はこれに対する完璧な結論を書いています。
It's never a bad thing to write readable, expressive code.
if otherString:
stringValue = otherString
else:
stringValue = defaultString
This type of code is longer and more expressive, but also more readable and less likely to get tripped over or mis-edited down the road. Don't be afraid to write expressively - readable code should be a goal, not a byproduct.
この質問にはいくつかの重複があります。
本質的に、一般的な設定では、2.5 より前のコードはこれを使用する必要があります。
(condExp and [thenExp] or [elseExp])[0]
(与えられた condExp、thenExp および elseExp は任意の式です)、短絡評価を維持しながら、thenExp がブール値 False に評価された場合に誤った結果を回避するためです。
ところで、j0rd4n さんは C# でこのようなコードを書きません (しないでください!)。IsDefaultOrNull
が実際に と呼ばれているという事実は別としてIsNullOrEmpty
、これは純粋なコードの肥大化です。C# は、次のような状況で合体演算子を提供します。
string stringValue = otherString ?? defaultString;
これotherString
がnull
(空ではなく) である場合にのみ機能することは事実ですが、これが事前に保証されている場合 (多くの場合、保証されている場合)、コードがはるかに読みやすくなります。
また、「or」演算子を使用するだけでかなりうまくいくこともわかりました。例えば:
finalString = get_override() or defaultString
get_override()が "" または None を返す場合、常に defaultString を使用します。
Rubyを使用した場合、次のように書くことができます
stringValue = otherString.blank? ? defaultString : otherString;
組み込みblank?
メソッドは null または空を意味します。
ダークサイドに来て...
論理式が true または false ステータスだけでなく、その値を返すという事実を利用できます。たとえば、いつでも使用できます。
result = question and firstanswer or secondanswer
firstanswer が false の場合、三項演算子のように機能しないことに注意してください。これは、firstanswer が false でない限り、firstanswer が返されると仮定して、最初に question が評価されるためです。したがって、この使用法は三項演算子のようには機能しません。ただし、値がわかっている場合は、通常は問題ありません。例は次のとおりです。
result = choice == 7 and "Seven" or "Another Choice"