質問

らかの理由でこの機能が混乱してい:

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で、私は完全に誤解をどの諸表す。

役に立ちましたか?

解決

これは、古いっぽいイディオムです。ショーの優先度に括弧を挿入し、

(port == "443" and "https://") or "http://"
x and yがfalsishある場合yはtruish、xある場合

x戻ってxa or b、その逆、返品は、それのtruish場合はそうでないabます。

port == "443"が真であるもしそうであれば、この戻りand、即ち、"https://"のRHS。 andは遊びやリターン `に入ったので、それ以外の場合は、orは、偽である "のhttp://"。、のそののRHS

現代Pythonでは、この古いっぽいイディオムを翻訳行うには良い方法があります:

"https://" if port == "443" else "http://"

他のヒント

左がtrueの場合は、

andは、右オペランドを返します。左が偽の場合orは、右オペランドを返します。それ以外の場合は、両方の左オペランドを返します。これらは、の合体のに言われています。

C and X or Y が、初の試みであるPythonユーザが代理人 C ? X : Y

にしてください。 を除く の場合 XFalse --これは、多くのバグはPythonコードでは、 PythonのFAQ, アーティストをより正しい解 (C and [X] or [Y])[0] このリストの単一の要素に関わらず、その評価をブール値は常に True!例えば: [None]TrueNone い分けるどれがいいですか?OPの記の例では、作品の文字列表現 X は空です。

しかし、すべてこの変更にPython2.5、三者又は条件付きのオペレーターを追加した言語に対応可能な利用のクリーナー X if C else Y 記その他の投稿です。された場合を使用したコードの形式で、ユーザーにおいてはPythonプログラマだの方を採用した新しい構文でない-n-ペーストのその他の古いコード、またはその勤務先がない2.4.x(以前のリリース)など。

これは推奨されません醜いハックです。それは理由andorの短絡挙動を、彼らはその引数の一つではなく、ブール値を返すことを動作します。この技術を使用すると、その新しいコードでは使用しないでください、見つけにくいバグを導入する危険性を与えます。

はここで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://"

あなたは、この記事ではPythonの「および/またはトリック」独特の上に読むことをお勧めしますANDとORのPython の中の自然。それは少しVBAやVBでIIF()、またはCスタイルの言語で?:ようなものです。

この工事は、作品次のコードとそれが繰り広げられる "ので、

とB - >

if a:
  return b
else:
  return a

またはB - >

if a:
  return a
else:
  return b

すべての答えが、これらの記述っこよくわかっ脳作品は、今もりあり):

  • "や""を返します最初はFalse項目(例:なし, "", [], (), {}, 0) 最後に、項目のない場合(例えばないFalseの場合)

  • "または"を返します最初の真の商品はの最後の項目例ないんだたくさんの環境変数が初期化され**

概要:

  • 彼らはすべて返しの最初の項目を決める結果に。(最悪の場合、最後の項目の配列)

注記この原則にも適用される連鎖の全ての"および"全て"または"声明

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top