Python Language
Porównania
Szukaj…
Składnia
! = - Nie jest równy
== - jest równe
>
- większy niż<
- mniej niż>=
- większy lub równy<=
- mniejszy lub równyis
- sprawdź, czy obiekty są dokładnie tym samym obiektemnie jest = sprawdź, czy obiekty nie są dokładnie tym samym obiektem
Parametry
Parametr | Detale |
---|---|
x | Pierwszy przedmiot do porównania |
y | Drugi element do porównania |
Większy lub mniejszy niż
x > y
x < y
Operatory te porównują dwa typy wartości, są one mniejsze i większe niż operatory. W przypadku liczb po prostu porównuje wartości liczbowe, aby zobaczyć, która jest większa:
12 > 4
# True
12 < 4
# False
1 < 4
# True
W przypadku ciągów porównają leksykograficznie, co jest podobne do porządku alfabetycznego, ale nie do końca takie samo.
"alpha" < "beta"
# True
"gamma" > "beta"
# True
"gamma" < "OMEGA"
# False
W tych porównaniach małe litery są uważane za „większe niż” wielkie litery, dlatego "gamma" < "OMEGA"
jest fałszem. Gdyby wszystkie były dużymi literami, zwracałby oczekiwany wynik uporządkowania alfabetycznego:
"GAMMA" < "OMEGA"
# True
Każdy typ definiuje obliczenia za pomocą operatorów <
i >
inaczej, dlatego przed użyciem należy sprawdzić, co oznaczają operatory dla danego typu.
Nie równy
x != y
Powrócisz True
jeśli x
i y
nie są sobie równe, a inaczej zwraca False
.
12 != 1
# True
12 != '12'
# True
'12' != '12'
# False
Równy
x == y
Wyrażenie to jeśli x
i y
są takie same i powrotu wynik jako wartość logiczna. Zasadniczo zarówno typ, jak i wartość muszą być zgodne, więc liczba całkowita 12
nie jest taka sama jak ciąg '12'
.
12 == 12
# True
12 == 1
# False
'12' == '12'
# True
'spam' == 'spam'
# True
'spam' == 'spam '
# False
'12' == 12
# False
Zauważ, że każdy typ musi zdefiniować funkcję, która będzie używana do oceny, czy dwie wartości są takie same. W przypadku typów wbudowanych funkcje te zachowują się tak, jak można się spodziewać, i po prostu oceniają rzeczy na podstawie bycia tą samą wartością. Jednak typy niestandardowe mogą definiować testowanie równości jako cokolwiek chcą, w tym zawsze zwracając True
lub Zawsze zwracając False
.
Porównania łańcuchowe
Możesz porównać wiele elementów za pomocą wielu operatorów porównania z porównaniem łańcucha. Na przykład
x > y > z
jest tylko krótką formą:
x > y and y > z
Doprowadzi to do wartości True
tylko wtedy, gdy oba porównania będą True
.
Ogólna forma to
a OP b OP c OP d ...
Gdzie OP
reprezentuje jedną z wielu operacji porównania, których można użyć, a litery reprezentują dowolne prawidłowe wyrażenia.
Zauważ, że
0 != 1 != 0
wartośćTrue
, nawet jeśli0 != 0
toFalse
. W przeciwieństwie do zwykłego zapisu matematycznego, w którymx != y != z
oznacza, żex
,y
iz
mają różne wartości. Łańcuchy==
operacje mają naturalne znaczenie w większości przypadków, ponieważ równość jest na ogół przechodnia.
Styl
Nie ma teoretycznego ograniczenia liczby używanych elementów i operacji porównania, o ile masz odpowiednią składnię:
1 > -1 < 2 > 0.5 < 100 != 24
Powyższe zwraca wartość True
jeśli każde porównanie zwraca wartość True
. Jednak stosowanie zawiłego łączenia nie jest dobrym stylem. Dobry łańcuch będzie „kierunkowy”, nie bardziej skomplikowany niż
1 > x > -4 > y != 8
Skutki uboczne
Gdy tylko jedno porównanie zwróci wartość False
, wyrażenie natychmiast False
wartość na False
, pomijając wszystkie pozostałe porównania.
Zauważ, że wyrażenie exp
w a > exp > b
zostanie ocenione tylko raz, podczas gdy w przypadku
a > exp and exp > b
exp
zostanie obliczone dwukrotnie, jeśli a > exp
jest prawdziwe.
Porównanie przez `is` vs` == `
Częstym błędem jest niejasna operatory porównania równość is
i ==
.
a == b
porównuje wartość a
i b
.
a is b
porówna tożsamości a
i b
.
Ilustrować:
a = 'Python is fun!'
b = 'Python is fun!'
a == b # returns True
a is b # returns False
a = [1, 2, 3, 4, 5]
b = a # b references a
a == b # True
a is b # True
b = a[:] # b now references a copy of a
a == b # True
a is b # False [!!]
Zasadniczo is
może być uważany jako skrót dla id(a) == id(b)
.
Poza tym istnieją dziwactwa środowiska wykonawczego, które jeszcze bardziej komplikują sytuację. Krótkie ciągi i małe liczby całkowite powróci True
w porównaniu ze is
, ze względu na maszynie Pythona próbuje użyć mniej pamięci dla identycznych obiektów.
a = 'short'
b = 'short'
c = 5
d = 5
a is b # True
c is d # True
Ale dłuższe ciągi i większe liczby całkowite będą przechowywane osobno.
a = 'not so short'
b = 'not so short'
c = 1000
d = 1000
a is b # False
c is d # False
Powinieneś użyć is
przetestować na None
:
if myvar is not None:
# not None
pass
if myvar is None:
# None
pass
Zastosowanie is
jest test na „Sentinel” (czyli unikalny obiekt).
sentinel = object()
def myfunc(var=sentinel):
if var is sentinel:
# value wasn’t provided
pass
else:
# value was provided
pass
Porównywanie obiektów
Aby porównać równość klas niestandardowych, możesz przesłonić ==
i !=
, Definiując metody __eq__
i __ne__
. Możesz również zastąpić __lt__
( <
), __le__
( <=
), __gt__
( >
) i __ge__
( >
). Zauważ, że wystarczy zastąpić dwie metody porównania, a Python może obsłużyć resztę ( ==
jest taki sam, jak not <
i not >
itd.)
class Foo(object):
def __init__(self, item):
self.my_item = item
def __eq__(self, other):
return self.my_item == other.my_item
a = Foo(5)
b = Foo(5)
a == b # True
a != b # False
a is b # False
Zauważ, że to proste porównanie zakłada, że other
(porównywany obiekt) jest tego samego typu. Porównanie z innym typem spowoduje błąd:
class Bar(object):
def __init__(self, item):
self.other_item = item
def __eq__(self, other):
return self.other_item == other.other_item
def __ne__(self, other):
return self.other_item != other.other_item
c = Bar(5)
a == c # throws AttributeError: 'Foo' object has no attribute 'other_item'
Sprawdzanie isinstance()
lub podobnego pomoże temu zapobiec (w razie potrzeby).
Typowa Gotcha: Python nie wymusza pisania
W wielu innych językach, jeśli uruchomisz następujące (przykład Java)
if("asgdsrf" == 0) {
//do stuff
}
... dostaniesz błąd. Nie można po prostu porównywać ciągów znaków z liczbami całkowitymi. W Pythonie jest to całkowicie legalne oświadczenie - po prostu rozwiąże się ono na False
.
Typowa gotcha jest następująca
myVariable = "1"
if 1 == myVariable:
#do stuff
To porównanie zmieni się w False
bez błędu, za każdym razem, potencjalnie ukrywając błąd lub łamiąc warunek.