Wie kann ich feststellen, ob eine bestimmte ganze Zahl zwischen zwei anderen ganzen Zahlen liegt (z. B. größer/gleich 10000
und weniger als/gleich 30000
)?
Antworten
Zu viele Anzeigen?Nachfolgend sind einige mögliche Wege aufgeführt, geordnet von der besten bis zur schlechtesten Leistung (d. h. der erste wird am besten funktionieren)
# Old school check
if 10000 <= b and b <=30000:
print ("you have to pay 5% taxes")
# Python range check
if 10000 <= number <= 30000:
print ("you have to pay 5% taxes")
# As suggested by others but only works for integers and is slow
if number in range(10000,30001):
print ("you have to pay 5% taxes")
Mit Python können Sie einfach schreiben. was Sie mit Worten meinen:
if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :)
In Python3, verwenden Sie range
anstelle von xrange
.
edit: Die Leute scheinen sich mehr Gedanken über Mikrobankmarken zu machen und darüber, wie cool die Verkettung von Operationen ist. Meine Antwort ist über defensive (weniger Angriffsfläche für Bugs) Programmierung.
Aufgrund einer Forderung in den Kommentaren habe ich hier den Micro-Benchmark für Python3.5.2 hinzugefügt
$ 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
Wenn Sie sich Sorgen um die Leistung machen, können Sie den Bereich einmal berechnen
$ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
10000000 loops, best of 3: 0.0551 usec per loop
Während 10 <= number <= 20
in Python funktioniert, finde ich diese Notation mit range()
besser lesbar:
if number in range(10, 21):
print("number is between 10 (inclusive) and 21 (exclusive)")
else:
print("outside of range!")
Beachten Sie, dass der 2., obere Schrankenparameter nicht im Bereichssatz enthalten ist, wie mit überprüft werden kann:
>>> list(range(10, 21))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Bevorzugen Sie jedoch die range()
nur dann, wenn es nicht auf einem leistungskritischen Pfad läuft. Ein einziger Aufruf ist für die meisten Anforderungen immer noch schnell genug, aber wenn er 10.000.000 Mal ausgeführt wird, stellt man eindeutig eine fast dreimal langsamere Leistung im Vergleich zu a <= x < b
:
> { time python3 -c "for i in range(10000000): x = 50 in range(1, 100)"; } 2>&1 | sed -n 's/^.*cpu \(.*\) total$/\1/p'
1.848
> { time python3 -c "for i in range(10000000): x = 1 <= 50 < 100"; } 2>&1 | sed -n 's/^.*cpu \(.*\) total$/\1/p'
0.630