Jak ustalić, czy dana liczba całkowita znajduje się między dwiema innymi liczbami całkowitymi (np. Większa niż / równa 10000
i mniejsza niż / równa 30000
)?
Używam 2.3 IDLE i to, co do tej pory próbowałem, nie działa:
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
Odpowiedzi:
źródło
if number in range(10000, 30001)
sugerowanym przez inne rozwiązanie? Ponadto, czy jest szybszy czy wolniejszy, gdy używaszset
zamiastrange
?number
jest najpierw porównywane10000
. Jeśli jest mniejszy niż,10000
wyrażenie jest natychmiast zwierane, a drugie porównanie nie jest sprawdzane. Złożoność jestO(1)
.in range(0, n)
zamiast tego generuje całą sekwencję liczb, a następnie iteruje przez nią. Złożoność jestO(n)
. Złożonośćin set(range(0, n))
jest nadal,O(n)
ponieważ budowanie zestawu ma złożoność czasową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ódło
range
(lubxrange
w python2) zwraca generator, więc nie można wielokrotnie testować na nim.4 in range(1,4)
jest to fałsz. Lepiej więc użyj tego,1 >= r <= 4
ponieważ pozwala uniknąć ewentualnych błędów przez nowych graczy1.5 in r
dajeFalse
, nawet w 3.4. Ta odpowiedź jest dobra tylko dla liczb całkowitych.1 <= r <= 4
if a <= x <= b
...) (2.) nie działa dlafloat
typów (3) .) test zasięgu nie obejmuje ... tak wielu programistów może wprowadzić błędy, ponieważ spodziewają się włączenia zakresuTwój operator jest niepoprawny. Powinno być
if number >= 10000 and number <= 30000:
. Dodatkowo, Python posiada skrót do tego typu rzeczy,if 10000 <= number <= 30000:
.źródło
Twój fragment kodu,
faktycznie sprawdza, czy liczba jest większa niż zarówno 10000, jak i 30000.
Zakładając, że chcesz sprawdzić, czy liczba mieści się w zakresie od 10000 do 30000, możesz użyć porównania interwałów w języku Python:
Ta funkcja Pythona jest dokładniej opisana w dokumentacji Pythona .
źródło
źródło
Problem z porównaniami polega na tym, że mogą one być trudne do debugowania, gdy umieścisz tam,
>=
gdzie powinno być<=
Python pozwala ci pisać po prostu to, co masz na myśli
W Python3 musisz użyć
range
zamiastxrange
.edytuj: Ludzie wydają się być bardziej zaniepokojeni śladami mikrobench i tym, jak fajne są operacje łańcuchowe. Moja odpowiedź dotyczy programowania defensywnego (mniejsza powierzchnia ataku dla błędów).
W wyniku twierdzenia w komentarzach dodałem tutaj test porównawczy mikro dla Python3.5.2
Jeśli martwisz się wydajnością, możesz raz obliczyć zakres
źródło
range(10000, 30001)
w Python3. Nie tworzy listyxrange
w Python2 lubrange
w Python3 mają testy członkostwa. Spróbuj sam, jeśli nie wierzysz.<=
jest tylko bardziej wydajny, ponieważ nie tworzy obiektu zakresu. Oba sposoby jak O (1). Punkt jest OP została stara się zrobić to na swój sposób, a zakończył się z błędem . Nieprawidłowy szybki kod jest gorszy.Zdefiniuj zakres między liczbami:
Następnie użyj go:
źródło
range
nie liczy ostatniej wartości 10 w twoim przypadku.range(1,11)
jest poprawne, jeśli chcesz porównać między 1 a 10Istnieją dwa sposoby porównania trzech liczb całkowitych i sprawdzenia, czy b ma wartość między a i c :
i
Pierwszy wygląda na bardziej czytelny, ale drugi działa szybciej .
Porównajmy za pomocą dis.dis :
i używając timeit :
możesz także użyć zasięgu , jak sugerowano wcześniej, jednak jest on znacznie wolniejszy.
źródło
Załóżmy, że istnieją 3 nieujemne liczby całkowite:
a
,b
, ic
. Z matematycznego punktu widzenia, jeśli chcemy ustalić, czyc
jest pomiędzy,a
ib
włącznie, można użyć tej formuły:lub w Pythonie:
źródło
Chcesz, aby wynik wypisał podaną instrukcję tylko wtedy, gdy liczba mieści się w przedziale od 10 000 do 30 000.
Kod powinien być;
źródło
Warunkiem powinno być
powodem użycia
number == 10000
jest to, że jeśli wartość liczby wynosi 50000 i jeśli użyjemy,number >= 10000
warunek przejdzie, co nie jest tym, czego chcesz.źródło