6

まず、コード:

>>> False or 'hello'
'hello'

この驚くべき動作により、がそうxでないかどうかNoneを確認し、 の値をx1 行で確認できます。

>>> x = 10 if randint(0,2) == 1 else None
>>> (x or 0) > 0
# depend on x value...

説明: 次のようor関数:

x が false の場合は y、それ以外の場合は x

私が知っているどの言語でも、これを行うことはできません。では、なぜ Python は?

4

6 に答える 6

14

2 つの問題を 1 つにまとめているようですね。

まず、短絡の問題があります。Marcin's answer はこの問題に完全に対処しているため、これ以上改善しようとはしません。

次に、ブール値に変換するのではなく、最後に評価された値orを返します。and両方の方法で行われる議論があり、分割のどちらかの側に多くの言語を見つけることができます.

最後に評価された値を返すことでfunctionCall(x) or defaultValueショートカットが可能になり、おそらく無駄な変換が回避されます (それを使用する唯一のことが非ゼロかどうかを確認することである場合、なぜ anint 2を a に変換するのでしょうか?)、一般的に説明が簡単です。bool 1したがって、これらの理由のさまざまな組み合わせにより、C、Lisp、Javascript、Lua、Perl、Ruby、VB などの言語はすべてこの方法で処理を行い、Python も同様です。

true演算子から常にブール値を返すことは、いくつかのエラーをキャッチするのに役立ちます(特に、論理演算子とビットごとの演算子が混同しやすい言語で)。ゼロ以外をチェックするだけで、演算子の型を簡単に書き出すことができ、2 つのオペランドが異なる型である場合の変換を処理する必要がなくなります ( ?:C ファミリ言語の演算子を参照してください)。したがって、これらの理由のさまざまな組み合わせにより、C++、Fortran、Smalltalk、Haskell などの言語はすべてこのように動作します。


あなたの質問では(私が正しく理解している場合)、この機能を使用して次のようなものを書くことができます:

if (x or 0) < 1:

いつxでも簡単にできますNonex if x else 0この特定の使用例は、 (Python 2.5 以降では) より明示的な方が書きやすく、おそらく理解しやすい (少なくとも Guido はそう考えている) だけでなく、とにかくNone < 1と同じであるため、あまり有用ではありません。 0 < 1(少なくとも Python 2.x では、常に 2 つのオプションのうち少なくとも 1 つを使用できます)... しかし、これ役立つ同様の例があります。次の 2 つを比較してください。

return launchMissiles() or -1

return launchMissiles() if launchMissiles() else -1

2 つ目は、南極で敵を 1 回ではなく 2 回吹き飛ばして大量のミサイルを無駄にします。


Python がこのようにする理由に興味がある場合は、次のようにします。

1.x の時代に型はありませんでしboolた。None0[]()、などの偽の値があり""、それ以外はすべて真です。から戻るのはばかげていたでしょう。が追加されるまでに(IIRC の 2 つの 2.x バージョンで徐々に)、現在のロジックは既に言語にしっかりと組み込まれており、変更すると多くのコードが壊れていました。FalseTrue1or1[1, 2, 3]"dsfsdf"bool

では、なぜ 3.0 で変更しなかったのでしょうか? orBDFL Guido を含む多くの Python ユーザーは、この場合 (少なくとも "TOOWTDI" に違反しているため) を使用しないことを提案しています。代わりに、式の結果を変数に格納する必要があります。たとえば、次のようになります。

missiles = launchMissiles()
return missiles if missiles else -1

実際、Guido は を禁止したいと述べており、それが、彼が以前に何度も拒否した 3 項式をlaunchMissiles() or -1最終的に受け入れた理由の1 つです。しかし、他の多くの人は同意しません。Guido は 慈悲深いDFL です。また、ここでやりたいことを拒否しながら (しかし、Guido はあなたが望んでいないことを) 他の場所で期待どおりに動作させることは、実際にはかなり複雑です。ifelseor


したがって、Python は、Java、Smalltalk、および Haskell と同じ側ではなく、ここではおそらく常に C、Perl、および Lisp と同じ側にあるでしょう。

于 2012-12-13T23:52:53.027 に答える
10

私が知っている言語では、これを行うことはできません。では、なぜ Python が行うのでしょうか。

それから、あなたは多くの言語を知りません。私が知っている言語で、この「ショートサーキット」動作を示さない言語は考えられません。

次のように言うと便利なので、それを行います。

a = b or K

b が None (または false) でない場合は a が b になり、そうでない場合はデフォルト値 K を取得します。

于 2012-12-13T23:33:05.993 に答える
6

実際、多くの言語がそうです。短絡評価についてウィキペディアを参照してください

短絡評価が存在する理由について、ウィキペディアは次のように書いています。

条件として使用される両方の式が単純なブール変数である場合、短絡評価で使用される 1 つまたは 2 つのサイクルとは対照的に、ブール演算で使用される両方の条件を一度に評価する方が、常に 1 つの計算サイクルを必要とするため、実際には高速になります (最初の値に応じて)。

于 2012-12-13T23:31:43.353 に答える
1

「私が知っている言語でこれを行うことはできません。では、なぜPythonがそうするのですか?」あなたはすべての言語が同じであるべきだと思っているようです。プログラミング言語の革新によって、人々が評価する独自の機能が生み出されることを期待しませんか?

なぜそれが便利なのかを指摘したばかりですが、なぜPythonはそれを行わないのでしょうか?おそらく、他の言語がそうしない理由を尋ねるべきです。

于 2012-12-13T23:46:04.373 に答える