3

私はここの新しいメンバーであり、Python も初めてです。私の質問は次のとおりです。このような行を持つことは有効ですか?

if x or y is 'whatever':

これをインタープリターでテストしたところ、一貫性のない結果が得られました。この行は、より一貫した期待される結果をもたらすように思われます

if (x or y) is 'whatever':

それとも、すべてをそのように明示的にレイアウトするのが常に最善ですか

if x is 'whatever' or y is 'whatever':

この最後のものは常に機能しますが、ベスト プラクティスに従いながら、コードをもう少し簡潔にしようとしています。冗長な質問をしないように検索してみましたが、「is」「or」「and」の検索はかなり難しいです。ご協力いただきありがとうございます。

編集:迅速な返信ありがとうございます。「または」が必要な場合、これは私にとって完璧に機能します

if 'whatever' in [x,y]:

しかし、「and」が必要な場合、これをどのように要約すればよいでしょうか?

if x == 'whatever' and y == 'whatever':
4

4 に答える 4

8

or英語のようには機能しません。

x or yx が true-ish 値の場合は x を返し、そうでない場合は y を返します。文字列が空でない場合、文字列は true-ish です。

さらに悪いことに、「is」は「or」よりも優先順位が高いため、式は と同じx or (y is 'whatever')です。したがって、x が空でない場合は x を返します (これは true になるため、if が実行されます)。x が空の場合、 と評価されy is 'whatever'ます。

ところで: 値の等価性を比較するために「is」を使用しないでください。== を使用してください。

これが必要です(括弧はオプション):

if (x == 'whatever') or (y == 'whatever'):

またはより簡潔ですが、見知らぬ人:

if 'whatever' in [x, y]:
于 2011-10-06T17:39:40.553 に答える
3

Python は英語ではありません。

if x or y is 'whatever':

意味:

if x or (y is 'whatever'):

X が true である、または y が「なんでも」である

if (x or y) is 'whatever':

x or yx または y のいずれかになります。x が true の場合は X を返し、それ以外の場合は Y になります。次に、その結​​果が「whatever」と比較されます。

isとにかく文字列を決して比較しないでください。文字列は を使用して比較する必要があります==。is は、偶然に機能する別の何かを意味します。

実際のリクエストは次のように記述できます。

if 'whatever' in [x,y]:

これは、文字列が list にあるかどうかをチェックします[x,y]

于 2011-10-06T17:42:53.287 に答える
1

私はこれがうまくいくと思います:

if "whatever" in (x, y):

ちょっと変ですけどね。

于 2011-10-06T17:41:20.373 に答える
1
if x or y is 'whatever' # this is akin to if x or (y is 'whatever')

if (x or y) is 'whatever': # (x or y) returns the first non-false value...

if x is 'whatever' or y is 'whatever': # this is valid and correct (aside from the fact you shouldn't be using `is`, see below)

あなたが持っているかもしれません

if 'whatever' in (x, y)

または、条件のリストが長い場合は、' any ' 関数を使用すると便利です。

if any([condition(k) for k in list])

しかし、[x, y] に「何でも」が含まれているかどうかを知りたいだけなので、公開した場合はやり過ぎです。

アップデート:

「is」は実際にはメモリアドレスを比較していることを考慮してください。(ここで指摘されているように)文字列で使用することはお勧めできません。

于 2011-10-06T17:44:12.713 に答える