質問

C# では次のように簡単に書くことができます。

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

Python で同じことを簡単に実行する方法はありますか? それとも 'if' ステートメントで行き詰まっているのでしょうか?

役に立ちましたか?

解決

Python 2.5 には、

A if C else B

これは次のように動作しますか?:Cで。ただし、次の 2 つの理由で嫌われています。読みやすさ、そして問題に対処するもっと簡単な方法があることが多いという事実。たとえば、あなたの場合:

stringValue = otherString or defaultString

他のヒント

@ダン

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

このタイプのコードは長く、より表現力豊かですが、より読みやすくなっています。

はい、長くなりました。「より表現力豊かに」「より読みやすく」についてはよくわかりません。少なくとも、あなたの主張には議論の余地があります。私はそれが全く間違っているとまで言いたいのですが、その理由は 2 つあります。

まず、コードは意思決定を (かなり極端に) 強調しています。一方、条件演算子は別のもの、つまり値 (それぞれの値) を強調します。前記値の割り当て)。そしてこれは その通り このコードの作成者が望んでいること。意思決定は実際にはコードの副産物です。ここで重要なのは代入操作です。あなたのコードは、この代入を多くの構文ノイズの中に隠しています。分岐。

重要な部分から重点が移されているため、コードの表現力は低くなります。

それでも、あなたのコードはおそらく次のような不明瞭な ASCII アートよりも優れているでしょう。 ?:. 。インラインif の方が望ましいでしょう。個人的には、Python 2.5 で導入されたバリアントは逆向きなので好きではありません。C の三項演算子と同じフロー (方向) で読み取りますが、ASCII 文字の代わりに単語を使用するものを好みます。

C = if cond then A else B

これは間違いなく勝利です。

残念ながら、C と C# にはそのような表現力豊かなステートメントがありません。しかし (これが 2 番目の引数です)、C 言語の 3 項条件演算子は非常に長い間確立されているため、それ自体がイディオムになっています。三項演算子は、「従来の」演算子と同じくらい言語の一部です。 if 声明。これはイディオムであるため、その言語を知っている人なら誰でも、このコードをすぐに正しく読み取ることができます。さらに、これはこれらのセマンティクスを表現する非常に短く簡潔な方法です。実際、それは考えられる限り最短の方法です。不必要なノイズで本質を曖昧にしないので、非常に表現力豊かです。

最後に、ジェフ・アトウッドはこれに対する完璧な結論を書きました。 最良のコードはコードをまったく使用しないことです.

読みやすく表現力豊かなコードを書くことは決して悪いことではありません。

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

このタイプのコードは長くて表現力が豊かですが、読みやすく、途中でつまずいたり編集を誤ったりする可能性が低くなります。表現力豊かに書くことを恐れないでください。読みやすいコードは副産物ではなく目標であるべきです。

この質問にはいくつかの重複があります。

基本的に、一般的な設定では、2.5 より前のコードはこれを使用する必要があります。

 (condExp and [thenExp] or [elseExp])[0]

(condExp、thenExp、elseExp が任意の式であると仮定すると)、短絡評価を維持しながら thenExp がブール値 False に評価される場合に誤った結果が回避されるためです。

ちなみに、j0rd4n、あなたはそうしません(お願いします しないでください!) C# でこのようなコードを記述してください。という事実とは別に、 IsDefaultOrNull 実際に呼ばれます IsNullOrEmpty, 、これは純粋なコードの肥大化です。C# は、次のような状況に対応する合体演算子を提供します。

string stringValue = otherString ?? defaultString;

確かに、これは次の場合にのみ機能します otherStringnull (空ではなく) しかし、これが事前に保証できれば (そして多くの場合それが可能です)、コードははるかに読みやすくなります。

また、「or」演算子を使用するだけでかなり効果があることもわかりました。例えば:

finalString = get_override() or defaultString

もし get_override() "" または None を返します。常に使用されます デフォルト文字列.

diveintopython.net の第 4 章 答えがあります。これは Python では and-or トリックと呼ばれます。

論理式は true または false ステータスだけでなく値を返すという事実を利用できます。たとえば、いつでも次のように使用できます。

result = question and firstanswer or secondanswer

firstanswer が false の場合、三項演算子のようには機能しないことに注意してください。これは、質問が最初に評価され、それが true であると仮定され、firstanswer が false でない限り firstanswer が返されるため、この使用法は三項演算子のように機能しないためです。ただし、値がわかっていれば、通常は問題ありません。例は次のとおりです。

result = choice == 7 and "Seven" or "Another Choice"

Rubyを使用した場合は次のように書くことができます

stringValue = otherString.blank? ? defaultString : otherString;

内蔵されている blank? メソッドは null または空を意味します。
ダークサイドに来い…

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top