2

Python 2.7

これを行うことは可能ですか?

print "Enter a number between 1 and 10:"
number = raw_input("> ")

if number in range(1, 5):
    print "You entered a number in the range of 1 to 5"
elif number in range(6, 10):
    print "You entered a number in the range of 6 to 10"
else:
    print "Your number wasn't in the correct range"

1から10までの数字を入れると、常にelseステートメントに該当します。

これは、if-elseステートメントでの範囲内の誤った使用ですか?

よろしくお願いします。

4

6 に答える 6

12

入力データが文字列だからです。だからそれは他に流れます。それを整数に変換すれば、すべてうまくいくでしょう。

>>> number = raw_input("> ")
>>> type(number)
<type 'str'>
int(number) converts to <type 'int'>

使ってください:

if int(number) in range(1, 6):
    print "You entered a number in the range of 1 to 5"
elif int(number) in range(6, 11):
    print "You entered a number in the range of 6 to 10"
else:
    print "Your number wasn't in the correct range"
于 2012-08-27T10:40:56.557 に答える
5
>>> number = raw_input()
3
>>> type(number)
<type 'str'>
>>> "3" in range(1,5)
False


number = int(raw_input())
于 2012-08-27T10:26:46.443 に答える
3

チェックする前に、まず入力(文字列)を数値に変換する必要があります。また、を使用するif 1 < number <= 5:必要があります。数値が範囲内にあるかどうかを確認するためだけにリストを作成する必要はありません。

于 2012-08-27T10:27:58.963 に答える
1

完全を期すために、in演算子は属性メンバーシップをテストするブール演算子として使用できます。したがって、 if..elseステートメントで使用できます(完全なドキュメントの抜粋については以下を参照してください)。

in演算子を使用する場合、(たとえばobj in container)インタプリタは最初にメソッドcontainerがある かどうかを調べます。__contains__そうでない場合でもcontainer、メソッドが定義されている__iter__場合、Pythonはオブジェクトに含まれるすべての値を反復処理し、等しいかどうかをテストします。つまり、基本的に次のようなパフォーマンスを実行します。

for value in container:
    if value == obj:
        return True
return False

最後に、どちらのメソッドも定義されていない場合、インタープリターは__getitem__コンテナーを反復処理するメソッドを探し、それでも。を使用して任意の値が等しいかどうかをテストしobjます。比較演算子のドキュメントも参照してください。

さて、あなたの場合、range([start], stop[, step])関数[documentation]は実際にリストを返します(このリストは最後の要素を保持していないことに注意してください)。これはメソッドrange(1, 5) == [1, 2, 3, 4]を定義します。__contains__

>>> type(range(1, 10))
list
>>> hasattr(list, '__contains__')
True
>>> 4 in range(1, 10)
True

したがって、これは完全に書き込みを許可されていますx in range(1, 10)。他の回答が指摘しているように、あなたの問題は実際には入力データを整数にキャストすることによって解決される型の問題"3" == 3です(Falseのように)。ただし、入力値が適切に制限されているかどうかをテストするだけの場合は、比較演算子を使用することを強くお勧めします。

>>> if 1 <= x < 10:
...     print 'ok'
... else:
...     print 'ko'

見た目が読みやすく、廃止されたリストを作成していないため、メモリフットプリントを最小限に抑えることができます

xrangeリストの暗黙的な構築を回避するために、リストではなくイテレータを返す関数を使用できます。この場合、値は遅延評価されるため、メソッドxrangeを定義しませんが、メソッドを定義するため、すべてが引き続き行われます。うまくいきます!__contains____iter__

>>> type(xrange(1, 10))
xrange
>>> hasattr(xrange, '__contains__')
False
>>> hasattr(xrange, '__iter__')
True
>>> 4 in xrange(1, 10)
True

最後に、演算子に関するPythonドキュメントからの抜粋ですin

コレクションメンバーシップのテストに参加しているオペレーターとテストしていないオペレーター。x in sは、xがコレクションsのメンバーである場合はtrueと評価され、それ以外の場合はfalseと評価されます。sにないxは、sにあるxの否定を返します。コレクションメンバーシップテストは、伝統的にシーケンスにバインドされてきました。コレクションがシーケンスであり、そのオブジェクトと等しい要素が含まれている場合、オブジェクトはコレクションのメンバーです。ただし、他の多くのオブジェクトタイプが、シーケンスでなくてもメンバーシップテストをサポートすることは理にかなっています。特に、辞書(キー用)とセットはメンバーシップテストをサポートします。

リストおよびタプルのタイプの場合、x == y [i]がtrueであるようなインデックスiが存在する場合にのみ、yのxがtrueになります。

Unicodeおよび文字列型の場合、xがyの部分文字列である場合に限り、yのxはtrueになります。同等のテストはy.find(x)!=-1です。xとyは同じタイプである必要はないことに注意してください。したがって、'abc'のu'ab'はTrueを返します。空の文字列は常に他の文字列のサブ文字列と見なされるため、「abc」の「」はTrueを返します。

バージョン2.3で変更:以前は、xは長さ1の文字列である必要がありました。

()メソッドを定義するユーザー定義クラス__contains__の場合、yのxは、yの場合にのみtrueになります。__contains__(x)は真です。

__contains__()を定義しないが()を定義するユーザー定義クラス__iter__の場合、yの反復中にx == zの値zが生成されると、yのxは真になります。反復中に例外が発生した場合は、その例外が発生した場合と同じです。

最後に、古いスタイルの反復プロトコルが試されます。クラスが()を定義する場合__getitem__、x == y [i]のような非負の整数インデックスiがあり、すべての下位整数がある場合にのみ、yのxはtrueになります。インデックスはIndexError例外を発生させません。(他の例外が発生した場合は、その例外が発生した場合と同じです)。

inでない演算子は、inの逆の真の値を持つように定義されています。

演算子はオブジェクトの同一性をテストしますが、テストしません。xとyが同じオブジェクトである場合に限り、xはyです。xがyではない場合、逆真理値が得られます。[7]

于 2012-08-27T11:29:40.093 に答える
1

別の可能な解決策は、最初にintを使用することです。

number = int(raw_input("> "))
于 2017-09-17T23:51:50.540 に答える
1

オンラインでお試しください

python3で

print ("Enter a number between 1 and 10:")
number = int(input( ))



if int(number) in range(1, 6):
   print ("You entered a number in the range of 1 to 5")
elif int(number) in range(6, 11):
    print ("You entered a number in the range of 6 to 10")
else:
    print ("Your number wasn't in the correct range")

結果:

Enter a number between 1 and 10:
4
You entered a number in the range of 1 to 5
于 2021-09-01T03:54:00.527 に答える