Zanurkuj w Pythonie/Operatory and i or
Operatory and i or
[edytuj]Operatory and i or odpowiadają boolowskim operacjom logicznym, jednak nie zwracają one wartości logicznych. Zamiast tego zwracają którąś z podanych wartości.
and
>>> 'a' and 'b' #(1) 'b' >>> '' and 'b' #(2) '' >>> 'a' and 'b' and 'c' #(3) 'c'
- Podczas używania
andwartości są oceniane od lewej do prawej.0,'',[],(),{}iNonesą fałszem w kontekście logicznym, natomiast wszystko inne jest prawdą. Cóż, prawie wszystko. Domyślnie instancje klasy w kontekście logicznym są prawdą, ale możesz zdefiniować specjalne metody w swojej klasie, które sprawią, że będzie ona fałszem w kontekście logicznym. Wszystkiego o klasach i specjalnych metodach nauczymy się w rozdziale "Obiekty i klasy". Jeśli wszystkie wartości są prawdą w kontekście logicznym,andzwraca ostatnią wartość. W tym przypadkuandnajpierw bierze'a', co jest prawdą, a potem'b', co też jest prawdą, więc zwraca ostatnią wartość, czyli'b'. - Jeśli jakaś wartość jest fałszywa w kontekście logicznym,
andzwraca pierwszą fałszywą wartość. W tym wypadku''jest pierwszą fałszywą wartością. - Wszystkie wartości są prawdą, tak więc
andzwraca ostatnią wartość,'c'.
or
>>> 'a' or 'b' #(1) 'a' >>> '' or 'b' #(2) 'b' >>> '' or [] or {} #(3) {} >>> def sidefx(): ... print "in sidefx()" ... return 1 >>> 'a' or sidefx() #(4) 'a'
- Używając
orwartości są oceniane od lewej do prawej, podobnie jak wand. Jeśli jakaś wartość jest prawdą,orzwraca tą wartość natychmiast. W tym wypadku,'a'jest pierwszą wartością prawdziwą. orwyznacza''jako fałsz, ale potem'b', jako prawdę i zwraca'b'.- Jeśli wszystkie wartości są fałszem,
orzwraca ostatnią wartość.orocenia''jako fałsz, potem[]jako fałsz, potem{}jako fałsz i zwraca{}. - Zauważmy, że
orocenia kolejne wartości od lewej do prawej, dopóki nie znajdzie takiej, która jest prawdą w kontekście logicznym, a pozostałą resztę ignoruje. Tutaj, funkcjasidefxnigdy nie jest wywołana, ponieważ już'a'jest prawdą i'a'zostanie zwrócone natychmiastowo.
Jeśli jesteś osobą programującą w języku C, na pewno znajome jest ci wyrażenie bool ? a : b, z którego otrzymamy a, jeśli bool jest prawdą, lub b w przeciwnym wypadku. Dzięki sposobowi działania operatorów and i or w Pythonie, możemy osiągnąć podobny efekt.
Sztuczka and-or
[edytuj]and-or
>>> a = "first" >>> b = "second" >>> 1 and a or b #(1) 'first' >>> 0 and a or b #(2) 'second'
- Ta składnia wygląda podobnie do wyrażenia
bool ? a : bw C. Całe wyrażenie jest oceniane od lewej do prawej, tak więc najpierw określony zostanieand. Czyli1 and 'first'daje'first', potem'first' or 'second'daje'first'. 0 and 'first'daje0, a potem0 or 'second'daje 'second'.
Jakkolwiek te wyrażenia Pythona są po prostu logiką boolowską, a nie specjalną konstrukcją języka. Istnieje jedna bardzo ważna różnica pomiędzy Pythonową sztuczką and-or, a składnią bool ? a : b w C. Jeśli wartość a jest fałszem, wyrażenie to nie będzie działało tak, jakbyśmy chcieli. Można się na tym nieźle przejechać, co zobaczymy w poniższym przykładzie.
and-or
>>> a = ""
>>> b = "second"
>>> 1 and a or b #(1)
'second'
- Ponieważ
ajest pustym napisem, który Python uważa za fałsz w kontekście logicznym, więc1 and ''daje'', a następnie'' or 'second'daje'second'. Ups! To nie to, czego oczekiwaliśmy.
Sztuczka and-or, czyli wyrażenie bool and a or b, nie będzie działało w identyczny sposób, jak wyrażenie w C bool ? a : b, jeśli a będzie fałszem w kontekście logicznym.
Prawdziwą sztuczką kryjącą się za sztuczką and-or, jest upewnienie się, czy wartość a nigdy nie jest fałszywa. Jednym ze sposobów na wykonanie tego to przekształcenie a w [a] i b w [b], a potem pobranie pierwszego elementu ze zwróconej listy, którym będzie a lub b.
and-or
>>> a = "" >>> b = "second" >>> (1 and [a] or [b])[0] #(1) ''
- Jako że
[a]jest niepustą listą, więc nigdy nie będzie fałszem (tylko pusta lista jest fałszem). Nawet gdyajest równe0lub''lub inną wartością dającą fałsz, lista [a] będzie prawdą, ponieważ ma jeden element.
Jak dotąd, ta sztuczka może wydawać się bardziej uciążliwa niż pomocna. Możesz przecież osiągnąć to samo zachowanie instrukcją if, więc po co to całe zamieszanie. Cóż, w wielu przypadkach, wybierasz pomiędzy dwoma stałymi wartościami, więc możesz użyć prostszego zapisu i się nie martwić, ponieważ wiesz, że wartość zawsze będzie prawdą. I nawet kiedy potrzebujesz użyć bardziej skomplikowanej, bezpiecznej formy, istnieją powody, aby i tak czasami korzystać z tej sztuczki. Na przykład, są pewne przypadki w Pythonie gdzie instrukcje if nie są dozwolone np. w wyrażeniach lambda.
W Pythonie 2.5 wprowadzono odpowiednik wyrażenia bool ? a : b z języka C; jest ono postaci: a if bool else b. Jeśli wartość bool będzie prawdziwa, to z wyrażenia zostanie zwrócona wartość a, a jeśli nie, to otrzymamy wartość b.
|
Materiały dodatkowe
[edytuj]