2

私はPythonで自分の道を歩んできましたが、過去の文字列比較を取得できないようです。ユーザー入力を受け取って評価する関数を書きました。ユーザー入力は「a」または「b」のいずれかのみであり、それ以外の場合はエラーが発生します。私はこれを使用しています:

def checkResponse(resp):
    #Make the incoming string trimmed & lowercase
    respRaw = resp.strip()
    respStr = respRaw.lower()
    #Make sure only a or b were chosen
    if respStr != "a" | respStr != "b":
        return False
    else:
        return True

ただし、aまたはを入力すると、次のように表示されbます。TypeError: unsupported operand type(s) for |: 'str' and 'str'

これは文字列を比較する間違った方法ですか? Javaのようにこれを行う組み込み関数はありますか? ありがとう!

4

2 に答える 2

7

|ビットごとの or 演算子です。あなたがしたいor。(実際には が必要ですand。)

あなたが書いた:

if respStr != "a" | respStr != "b":

ビット単位の演算子は (他の算術演算子と同様に) 優先順位が高いため、次のようになります。

if respStr != ("a" | respStr) != "b":

ここで、2 つの!=演算は連鎖比較演算子です(x != y != zは と同等ですx != y and y != z)。ビット単位または 2 つの文字列に適用しても意味がありません。

あなたが書くつもりだった:

if respStr != "a" and respStr != "b":

連鎖演算子を使用して、次のように書くこともできます。

if "a" != respStr != "b":

または、包含演算子を使用してin:

if respStr not in ("a", "b"):
于 2012-07-16T17:00:07.723 に答える
5

必要なのはrespStr != 'a' and respStr != 'b'(orはブール演算子、ビットごとの演算子ですが、チェック|には必要です)。and

ただし、変数名を繰り返さずに、さらに適切な方法で条件を記述することができます。

return respStr in ('a', 'b')

これはTrue、respStr がaorの場合に返さbれ、Falseそうでない場合に返されます。

于 2012-07-16T17:02:59.353 に答える