12

何らかの理由で、この関数は私を混乱させました:

def protocol(port):
    return port == "443" and "https://" or "http://"

誰かが舞台裏で起こっていることの順序を説明して、この作品をそのように機能させることができますか?

私はそれを試すまでこれとしてそれを理解しました:

いずれかA)

def protocol(port):
    if port == "443":
        if bool("https://"):
            return True
    elif bool("http://"):
        return True
    return False

またはB)

def protocol(port):
    if port == "443":
        return True + "https://"
    else:
        return True + "http://"

これはPythonのある種の特殊なケースですか、それともステートメントがどのように機能するかを完全に誤解していますか?

4

7 に答える 7

32

古いイディオムです。括弧を挿入して優先度を示します。

(port == "443" and "https://") or "http://"

x and yytrue の場合は戻りますx。false のx場合xは戻ります。a or b、逆の場合はatrue の場合は を返し、そうでない場合は を返しますb

したがって、port == "443"が true の場合、これは の RHS and、つまりを返します"https://"。それ以外の場合、andは false であるため、が機能し RHSであるor「http://」を返します。

現代の Python では、この古いイディオムを翻訳するより良い方法は次のとおりです。

"https://" if port == "443" else "http://"
于 2010-04-05T17:50:41.117 に答える
8

and左オペランドが true の場合、右オペランドを返します。or左オペランドが false の場合、右オペランドを返します。それ以外の場合、どちらも左オペランドを返します。それらは合体すると言われています。

于 2010-04-05T17:50:25.220 に答える
5

C and X or Yは、Python ユーザーによる長期にわたる初期の試みであり、C ? X : Y

である場合を除いて、ほとんどの場合Xは機能しますFalse-これはPythonコードに多くのバグをもたらしたため、Python FAQ(C and [X] or [Y])[0]では、評価されたブール値に関係なく、単一の要素を持つリストであるため、より正しい解決策を見つけることができます値は常にTrueです!例: [None]is Truebut Noneis not. 上記のOPの例は、表す文字列Xが空ではないため機能します。

ただし、Python 2.5 では、三項演算子または条件演算子が言語に追加されたときにすべてが変更され、X if C else Yここの他の投稿で述べられているようにクリーナーを使用できるようになりました。古い形式を使用しているコードが表示された場合、それは、ユーザーが長い間 Python プログラマーであり、新しい構文をまだ採用していないか、他の古いコードをカットアンドペーストしたか、雇用主がまだ 2.4.x を使用しているためです (またはそれ以前のリリース) など。

于 2010-04-05T18:10:29.693 に答える
2

これは、推奨されない醜いハックです。andこれは、 andとの短絡動作のために機能しor、ブール値ではなく引数の 1 つを返します。この手法を使用すると、見つけにくいバグが発生するリスクがあるため、新しいコードでは使用しないでください。

and/orイディオムが予期しない結果をもたらす可能性がある例を次に示します。

>>> foo = 'foobar'
>>> bar = 'foobar'
>>> x = 0
>>> y = 1
>>> (foo == bar) and x or y   # Will this return the value of x if (foo == bar)?
1

代わりに新しい表記法を優先します:

return "https://" if port == "443" else "http://"
于 2010-04-05T17:51:09.310 に答える
1

この記事The Peculiar Nature of And and Or in Python で、Pythonの「and/or トリック」について読みたいと思うかもしれません。IIF()これは、VBA や VB、または?:C スタイル言語の に少し似ています。

于 2010-04-05T17:52:27.803 に答える
0

この構造は、次のコードに「展開」されるため機能します。

a と b -->

if a:
  return b
else:
  return a

a または b -->

if a:
  return a
else:
  return b
于 2010-04-05T17:55:03.587 に答える
0

すべての良い答えで、これらのステートメントは、これをよりよく覚えて、私の脳の働きに適合するのに役立つことがわかりました(そして、うまくいけば、そこにもっといくつかのことがあります):

  • 「and」は、最初の False 項目 (例: None、""、[]、()、{}、0) を返します。または、何もない場合は最後の項目 (例: False が見つからない) を返します。

  • 「or」は、最初の True 項目または最後の項目を返します (例: True が見つからない)**

要約すると

  • それらはすべて、ステートメントの結果を決定する最初の項目を返します。(最悪の場合、シーケンスの最後の項目)

この規則は、チェーン化されたすべての「and」またはすべての「or」ステートメントにも適用されることに注意してください。

于 2017-08-01T23:16:35.947 に答える