Zanurkuj w Pythonie/Operatory and i or: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Nie podano opisu zmian
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Linia 1:
{{Podświetl|py}}
== Operatory <tt>and</tt> i <tt>or</tt> ==
 
W Pythonie,Operatory <tt>and</tt> i <tt>or</tt przeprowadzająodpowiadają operacjeboolowskim logiczneoperacjom jak mógłbyś oczekiwaćlogicznym, alejednak nie zwracają one wartości logicznych;. zamiastZamiast tego zwracają, jednąktórąś z aktualnie porównywanychpodanych wartości.
 
'''Przykład 4.15. Poznajemy <tt>and</tt>'''
 
>>> 'a' and 'b' #(1)
Linia 12 ⟶ 13:
'c'
 
# Podczas używania <tt>and</tt>, wartości są wyliczanie w kontekście logicznymoceniane od lewej do prawej w kontekście logicznym. <tt>0</tt>, <tt><nowiki>''</nowiki></tt>, <tt>[]</tt>, <tt>()</tt>, <tt>{},</tt> i <tt>None</tt> są fałszem kontekście logicznym;, natomiast wszystko inne jest prawdą. Cóż, prawie wszystko. Domyślnie instancje klasy są prawdą w kontekście logicznym są prawdą, ale możesz zdefiniować specjalne metody w swojej klasie, abyktóra klasasprawi, wyliczanaże byłabędzie jakoona fałsz.fałszem Nauczyszw siękontekście wszystkiegologicznym. Wszystkiego o klasach i specjalnych metodach nauczysz się w Rozdzialerozdziale [[Python../Obiekty i klasy|Obiekty i klasy]]. Jeśli wszystkie wartości są prawdą w kontekście logicznym, <tt>and</tt> zwraca ostatnią wartość. W tym przypadku and wylicza <tt>'a'</tt>, co jest prawdą, potem <tt>'b'</tt>, co jest prawdą i zwraca <tt>'b'</tt>.
# Jeśli jakaś wartość jest fałszywa w kontekście logicznym, <tt>and</tt> zwraca pierwszą fałszywą wartość. W tym wypadku <tt><nowiki>''</nowiki></tt> jest pierwszą fałszywą wartością.
# Wszystkie wartości są prawdą, tak więc <tt>and</tt> zwraca ostatnią wartość, <tt>'c'</tt>.
 
'''Przykład 4.16. Poznajemy <tt>or</tt>'''
 
>>> 'a' or 'b' #(1)
Linia 30 ⟶ 31:
'a'
 
# Używając <tt>or</tt>, wartości są wyliczane w kontekście logicznym od lewej do prawej, tak jak <tt>and</tt>. Jeśli jakaś wartość jest prawdą, or zwraca tą wartość natychmiast. W tym wypadku, <tt>'a'</tt> jest pierwszą wartością prawdziwą.
# <tt>or</tt> wylicza <tt><nowiki>''</nowiki></tt> jako fałsz, potem <tt>'b'</tt>, jako prawda, i zwraca <tt>'b'</tt>.
# Jeśli wszystkie wartości są fałszem, <tt>or</tt> zwraca ostatnią wartość. <tt>or</tt> wyliczaocenia <tt><nowiki>''</nowiki></tt> jako fałsz, potem <tt>[]</tt> jako fałsz, potem <tt>{}</tt> jako fałsz i zwraca <tt>{}</tt>.
# Zauważ, że <tt>or</tt> wyliczaocenia kolejne wartości od lewej do prawej, dopóki nie znajdzie takątakiej, która jest prawdą w kontekście logicznym, ia ignorujepozostałą resztę. To zachowanie jest ważne jeśli jakieś wartości mogą mieć efekty uboczneignoruje. Tutaj, funkcja <tt>sidefx</tt> nigdy nie jest wywołana, ponieważ <tt>'a'</tt> jest prawdą i <tt>'a'</tt> jestzostanie zwracanezwrócone natychmiastowo.
 
Jeśli jesteś hakeremosobą programującą w języku [[C]], na pewno znajome jest ci wyrażenie <tt class="lang-c">bool ? a : b</tt>, którez wyliczaktórego sięotrzymamy na<tt class="lang-c">a</tt> jeśli <tt class="lang-c">bool</tt> jest prawdą, ilub <tt class="lang-c">b</tt> w przeciwnym wypadku. Dzięki temusposobowi jakdziałania działaoperatorów <tt>and</tt> i <tt>or</tt> w Pythonie, możeszmożemy osiągnąć ten sampodobny efekt.
 
==== Używanie sztuczki <tt>and</tt>-<tt>or</tt> ====
 
'''Przykład 4.17. Poznajemy sztuczkę and-or'''
Linia 48 ⟶ 49:
'second'
 
# Ta składnia wygląda podobnie do wyrażenia <tt class="lang-c">bool ? a : b</tt> w C. Całe wyrażenie jest wyliczaneoceniane od lewej do prawej, tak więc andnajpierw jestokreślony wyliczanezostanie najpierw<tt>and</tt>. <tt>1 and 'first'</tt> daje <tt>'first'</tt>, potem <tt>'first' or 'second'</tt> daje <tt>'first'</tt>.
# <tt>0 and 'first'</tt> daje fałsz<tt>0</tt>, a potem <tt>0 or 'second'</tt> daje <tt>'second'</tt>.
 
Jakkolwiek tote wyrażeniewyrażenia Pythona jest po prostu logiką boolowską, a nie specjalną konstrukcją języka, istnieje jedna bardzo ważna różnica pomiędzy tą sztuczką <tt>and</tt>-<tt>or</tt> w Pythonie a składnią <tt class="lang-c">bool ? a : b</tt> w C. Jeśli wartość <tt>a</tt> jest fałszem, wyrażenie to nie będzie działało jaktak, mógłbyśjakbyśmy oczekiwaćchcieli. (Czy naciąłemMożna się na to?tym Więcejnieźle niżprzejechać, jedenco raz?)zobaczymy w poniższym przykładzie.
 
'''Przykład 4.18. Kiedy zawodzi sztuczka <tt>and</tt>-<tt>or</tt>'''
 
'''Przykład 4.18. Kiedy zawodzi sztuczka and-or'''
 
>>> a = ""
Linia 61:
'second'
 
# Jako że <tt>a</tt> jest pustym napisem, który Python uważa jako fałsz w kontekście logicznym, <tt>1 and <nowiki>''</nowiki></tt> daje <tt><nowiki>''</nowiki></tt>, następnie <tt><nowiki>''</nowiki> or 'second'</tt> daje <tt>'second'</tt>. UupsUps! To nie to, coczego chciałeśchcieliśmy.
 
Sztuczka <tt>and</tt>-<tt>or</tt>, czyli wyrażenie <tt>bool and a or b</tt>, nie będzie działaładziałało jak wyrażenie C <tt class="lang-c">bool ? a : b</tt>, kiedygdy <tt>a</tt> jest fałszem w kontekście logicznym.
 
Prawdziwą sztuczką kryjącą się za sztuczką <tt>and</tt>-<tt>or</tt>, jest upewnienie się, że wartość <tt>a</tt> nigdy nie jest fałszywa. Jednym ze sposobów na wykonanie tego to przekształcenie <tt>a</tt> w <tt>[a]</tt> i <tt>b</tt> w <tt>[b]</tt>, potem pobranie pierwszego elementu ze zwróconej listy, którym będzie <tt>a</tt> lub <tt>b</tt>.
 
'''Przykład 4.19. Bezpieczne użycie sztuczki <tt>and</tt>-<tt>or</tt>
>>> a = ""
>>> b = "second"
Linia 73:
''
 
# Jako że <tt>[a]</tt> jest nie pustą listą, nigdy nie daje fałszu. Nawet gdy <tt>a</tt> jest równe <tt>0</tt> lub <tt><nowiki>''</nowiki></tt> lub inną wartością dającą fałsz, lista <tt>[a]</tt> jest 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ą <tt>if</tt>, 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 tak robić. Na przykład, są pewne przypadki w Pythonie gdzie instrukcje <tt>if</tt> nie są dozwolone, tak jak w funkcjach lambda.
 
<noinclude>