特定の整数が他の2つの整数の間にあるかどうかを判断するにはどうすればよいですか(たとえば、より大きい/等しい10000、より小さい/等しい30000)。
私は2.3 IDLEを使用していますが、これまでに試みたことが機能しません。
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
特定の整数が他の2つの整数の間にあるかどうかを判断するにはどうすればよいですか(たとえば、より大きい/等しい10000、より小さい/等しい30000)。
私は2.3 IDLEを使用していますが、これまでに試みたことが機能しません。
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
回答:
if 10000 <= number <= 30000:
pass
if number in range(10000, 30001)他のソリューションで示唆されている速度の違いは何ですか?さらに、のset代わりに使用すると、それは速くなりますか、遅くなりrangeますか?
numberは、最初にと比較され10000ます。それよりも小さい場合10000、式はすぐに短絡され、2番目の比較はチェックされません。複雑さはO(1)。 in range(0, n)代わりに、一連の数値全体を生成し、それを繰り返し処理します。複雑さはO(n)。複雑さはin set(range(0, n))まだあるO(n)セットを構築する際の複雑さがあるのでO(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
> python -m timeit '10000 <= 10 <= 30000' > python -m timeit '10 in range(10000, 30001)' > python -m timeit '10 in set(range(10000, 30001))'
>>> r = range(1, 4)
>>> 1 in r
True
>>> 2 in r
True
>>> 3 in r
True
>>> 4 in r
False
>>> 5 in r
False
>>> 0 in r
False
range(またはxrangepython2で)ジェネレーターを返すので、繰り返しテストすることはできません。
4 in range(1,4)はFalseであることを覚えておくことが重要です。1 >= r <= 4
1.5 in rFalse3.4でも、を与える。この答えは整数にのみ有効です。
1 <= r <= 4
if a <= x <= b...)(2.)はfloat型に対して機能しない(3 。)範囲テストは包括的ではありません...包括的範囲を期待しているため、多くの開発者はバグを導入する可能性があります
あなたのコードスニペット、
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
実際には、数値が10000と30000の両方より大きいかどうかをチェックします。
数値が10000から30000の範囲にあることを確認する場合、Pythonの間隔比較を使用できます。
if 10000 <= number <= 30000:
print ("you have to pay 5% taxes")
このPython機能については、Pythonのドキュメントで詳しく説明しています。
比較の問題は>=、あるはずの場所に配置するとデバッグが困難になる可能性があることです。<=
# v---------- should be <
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
Pythonはあなたが意味することを言葉で書くだけです
if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :)
Python3では、のrange代わりにを使用する必要がありますxrange。
編集:人々はマイクロベンチマークといかにクールな連鎖操作にもっと関心があるようです。私の答えは、防御的(バグの攻撃対象が少ない)プログラミングについてです。
コメントでの主張の結果として、ここにPython3.5.2のマイクロベンチマークを追加しました
$ python3.5 -m timeit "5 in range(10000, 30000)"
1000000 loops, best of 3: 0.266 usec per loop
$ python3.5 -m timeit "10000 <= 5 < 30000"
10000000 loops, best of 3: 0.0327 usec per loop
パフォーマンスが心配な場合は、一度範囲を計算できます
$ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
10000000 loops, best of 3: 0.0551 usec per loop
range(10000, 30001)、Python3で使用します。それはリストを作成しません
xrangePython2またはrangePython3にはメンバーシップテストがあります。信じられない場合は、自分で試してみてください。<=範囲オブジェクトを作成しないため、効率が向上するだけです。O(1)と同じです。重要なのは、OP が それを自分のやり方で行おうとしていて、バグが発生したことです。間違っている高速なコードはさらに悪い。
数値間の範囲を定義します。
r = range(1,10)
次にそれを使用します:
if num in r:
print("All right!")
rangeあなたの場合、最後の値10はカウントされません。 range(1,11)正解です。1と10を比較する必要がある場合
3つの整数を比較し、bがaとcの間にあるかどうかを確認するには、2つの方法があります。
if a < b < c:
pass
そして
if a < b and b < c:
pass
最初のものは読みやすいように見えますが、2番目のものはより速く実行されます。
dis.disを使用して比較してみましょう:
>>> dis.dis('a < b and b < c')
1 0 LOAD_NAME 0 (a)
2 LOAD_NAME 1 (b)
4 COMPARE_OP 0 (<)
6 JUMP_IF_FALSE_OR_POP 14
8 LOAD_NAME 1 (b)
10 LOAD_NAME 2 (c)
12 COMPARE_OP 0 (<)
>> 14 RETURN_VALUE
>>> dis.dis('a < b < c')
1 0 LOAD_NAME 0 (a)
2 LOAD_NAME 1 (b)
4 DUP_TOP
6 ROT_THREE
8 COMPARE_OP 0 (<)
10 JUMP_IF_FALSE_OR_POP 18
12 LOAD_NAME 2 (c)
14 COMPARE_OP 0 (<)
16 RETURN_VALUE
>> 18 ROT_TWO
20 POP_TOP
22 RETURN_VALUE
>>>
そしてtimeitを使用する:
~$ python3 -m timeit "1 < 2 and 2 < 3"
10000000 loops, best of 3: 0.0366 usec per loop
~$ python3 -m timeit "1 < 2 < 3"
10000000 loops, best of 3: 0.0396 usec per loop
また、前に提案したようにrangeを使用することもできますが、速度ははるかに遅くなります。
:3非負の整数があると仮定しa、bとc。私たちがどうかを判断したい場合は、数学的に言えば、c間にあるaとb、包括的、人はこの式を使用することができます。
(c-a)*(b-c)> = 0
またはPythonで:
> print((c - a) * (b - c) >= 0)
True
数値が10,000から30,000の間にある場合にのみ、出力に特定のステートメントを印刷させます。
コードはする必要があります。
if number >= 10000 and number <= 30000:
print("you have to pay 5% taxes")