5

Pythonへのダイブからのこの特定の例で立ち往生しています

例 4.18。and-or トリックが失敗する場合

>>>>a = ""
>>>>b = "second"
>>>1 and a or b
>>>>'second'

a は空の文字列であるため、Python はブール値のコンテキストでは false と見なします。1 と '' は '' に評価され、次に '' または 'second' は 'second' に評価されます。おっとっと!それはあなたが望んでいたことではありません。and-or トリック、bool と a または b は、C 式の bool ? のようには機能しません。a : b ブール値のコンテキストで a が false の場合。

ユーザーが望んでいるものではないと言われるのはなぜですか。つまり、1 と "" は False と評価され、"" または b は "second" と評価されます。間違っていますか?

4

4 に答える 4

4

いいえ、何かが欠けているわけではありません。

インライン条件はPEP 308expr if cond else exprで Python 2.5 に導入されました。それ以前は、条件は完全な形式でなければなりませんでした

if cond:
    expr
else:
    expr

expr and cond or exprしかし、人々は、最初の式がたまたまブール値 true に評価される限り、一種のインライン条件として機能することに気付きました。Python のほとんどのことは正しいので、この構文は一般的に機能する傾向があり、もちろん失敗することもあります。実際、これが「適切な」インライン条件を追加する動機でした。

于 2012-05-24T16:55:17.803 に答える
2

「and-or トリック」は、三項条件演算子などをエミュレートするために使用されましたcondition ? if-true : if-false。はブール コンテキストで1と同等であるため、式はではなくを生成することが期待されます。したがって、レッスンは、and-or トリックを使用しないことです。Python には 2.5 以降の 3 項条件があります。Trueab

true if condition else false
于 2012-05-24T16:55:32.133 に答える
2

Dive into Python は良いチュートリアルではなく、従うべきではありません


このx and y or z式は、Python が適切な三項式 ( y if x else z) を持つ前に使用されました。このセクションでは、C のx ? y : z.


python wikiにチュートリアルのリストがあります。これにより、より最新のリソースが得られる場合があります。

于 2012-05-24T16:57:58.700 に答える
0

ユーザーが望んでいるものではないと言われるのはなぜですか。つまり、1 と "" は False と評価され、"" または b は "second" と評価されます。間違っていますか?

質問のこの部分が無視されているように感じます。condition and if-true or if-false他の回答で説明されているように、バージョン> 2.5で使用されるトリックで、他の言語condition ? if-true : if-falseまたはそれ以降のバージョンを模倣しますif-true if condition else if-false

問題は、 ifif-trueが false と評価されるオブジェクト ( ""[]()Falseまたは0) である場合、評価を見ると予想どおり失敗することですが、if-trueが動的に設定されて評価できる場合、バグとして忍び寄る可能性があります。偽に。

の単純に期待される結果はcondition and a or ba( "", 空文字列)の1内容でした。true1 and afalseb

この問題の解決策は、Python 2.5 以降の構文 ( if-true if condition else if-false) を使用するか、if-true決して false にならないようにすることです。2 番目を達成する 1 つの方法は、タプルまたはリストでパックすることif-trueですif-false。これは、空でない iterable が常に true であるためです。

>>> a = ""
>>> b = "second"
>>> condition = 1
>>> condition and a or b
'second'

>>> condition and [a] or [b]
['']

>>> (condition and [a] or [b])[0]
''

これは一種の見苦しい解決策ですが、古いバージョンの Python をターゲットにする必要がある場合に利用できます。

于 2012-05-24T17:57:50.933 に答える