0

ネストされた if (および動作を停止したスクリプト) を削減しようとして多くの問題が発生した後、Python でブール値がどのように機能するかについて間違った考えを持っている可能性があることに気付きました。

私はこれを持っていました(正常に動作しますが、ゆがんでいます):

if (not gotside):
    if (j > 1):
        if (j < a.shape[1] - 1):
            if a[i, j+unit]:
                print "only now I do stuff!"

そして、これを試しました(希望どおりに動作しないことでスリム化されているように見えます):

if (not gotside) and (j > 1) and (j < a.shape[1] - 1) and a[i, j+unit]:
    print "I'm well tested but not so indented..."

x and y次に、「and」の代わりに「 or 」を使用しようとしましたが、うまくいきませx or yx, yでしTrue, Falseた.

Falseしたがって、最初のテストが False と評価されるとすぐに式全体が返されるように、一握りのテストを次々に (できればブール演算子を使用して同じ行に) 配置する方法がわかりません。

読んでくれてありがとう!

4

5 に答える 5

6

あなたの例はうまくいくはずです。

if x and y and z:
    ...

x、y、z のいずれも に評価されない場合にのみ発生する必要がFalseあり、Python ではandショートサーキットであるためFalse、1 つの項目が失敗するとすぐに値が返されます。これは非常に簡単に示すことができます。

>>> def test(n):
...     print("test", n)
...     return n
... 
>>> test(1) and test(2)
test 1
test 2
2
>>> test(0) and test(2)
test 0
0
>>> test(0) and test(2) and test(3)
test 0
0
>>> test(1) and test(0) and test(3)
test 1
test 0
0
于 2012-04-27T18:37:48.993 に答える
3

あなたの懸念はわかりますが、何かがifPython のステートメントに含まれている場合は常に、暗黙的にboolfor 条件に変換されることを覚えておいてください。したがって、スタンドアロンで実行すると while と return を返します。言うことは3 or 2実際には と言うのと同じです。そのため、ブール論理が他のコンテキストで何を返すかに関係なく、条件付きで使用されたときにロジックが返すものの falsey または truey 値を取得します。33 and 22if 3 or 2if bool(3 or 2)

于 2012-04-27T18:44:43.820 に答える
3

ええ、あなたの例はあなたが意図したとおりに機能するはずだという点で、他の人に同意する必要があります。x、y のいずれかを返すのは正しいですx or yが、そのオブジェクトは True または False として評価できます。これが、python がifステートメントを評価する方法です。式は順番に評価され、行内のテストが False (または 0 など) として返されると False が返されるため、記述どおりに機能するはず[]です{}。Pythonが実際に試した場合にエラーが発生するテストでそれを見ることができます。

x = 1; y = 2
if x < y and x == y and d['a']: # d doesn't exist
    print 'This will never be printed'

コードが意図したとおりに機能しない場合は、コードが何を期待しているのか、実際に何をしているのかを正確に説明してください。

于 2012-04-27T19:09:37.207 に答える
1

Python(および他のほとんどのプログラミング言語)のブール値と演算子は、「短絡」機能を提供します。これは、最初の用語または式がfalseと評価された場合、2番目の用語も評価されないことを意味します。

>>> False and expensiveFunctionReturningBool()
False

最初の項がFalseであると判断された後、Pythonインタープリターは式をFalseとしてすぐに評価するため、高価な関数が呼び出されることはありません。ブール論理では、and式の片側がfalseの場合、式全体が定義上falseになるため、これは機能します。

Pythonは、またはの短絡ロジックも使用します。この場合、最初の項がTrueであると判断された場合、2番目の項は評価されません。

>>> True or expensive()
True

したがって、ブール式を使用してネストされたifステートメントを折りたたむことができ(次々に宣言されている場合)、短絡ロジックを念頭に置いて巧妙に使用すると、条件式を最適化することもできます。

幸運を!

于 2012-04-27T18:52:16.647 に答える
1

含まれていないコードについていくつかの仮定を立て、プログラムを実行するために追加しました。

gotside = False
j = 2
i = 1
unit = 3

class A:
    def __init__(self):
        self.shape = [1, 4]
    def __getitem__(self, pos):
        return pos

a = A()


if (not gotside):
    if (j > 1):
        if (j < a.shape[1] - 1):
            if a[i, j+unit]:
                print("only now I do stuff!")

if (not gotside) and (j > 1) and (j < a.shape[1] - 1) and a[i, j+unit]:
   print("I'm well tested but not so indented...")

私にとって、これはpython 2.5、2.6、2.7、および3.2で機能します。

only now I do stuff!
I'm well tested but not so indented...

これがうまくいくかどうか、上記のプログラムを確認していただけますか?もしそうなら、あなたが使用しているクラス、特に variable のクラスについての詳細を教えてくださいa

于 2012-04-27T19:05:54.800 に答える