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

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Linia 4:
 
{{Python/Przykład
|4.1517|Poznajemy <code>and</code>
|tekst=
>>> 'a' and 'b' #(1)
Linia 13:
{{samp|'c'}}
 
# Podczas używania <code>and</code>, wartości są oceniane od lewej do prawej w kontekście logicznym. <code>0</code>, <code><nowiki>''</nowiki></code>, <code>[]</code>, <code>()</code>, <code>{}</code> i <code>None</code> są 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/|rozdziale "Obiekty i klasy"]]. Jeśli wszystkie wartości są prawdą w kontekście logicznym, <code>and</code> zwraca ostatnią wartość. W tym przypadku <code>and</code> najpierw bierze <code>'a'</code>, co jest prawdą, a potem <code>'b'</code>, co też jest prawdą, więc zwraca ostatnią wartość, czyli <code>'b'</code>.
# Jeśli jakaś wartość jest fałszywa w kontekście logicznym, <code>and</code> zwraca pierwszą fałszywą wartość. W tym wypadku <code><nowiki>''</nowiki></code> jest pierwszą fałszywą wartością.
# Wszystkie wartości są prawdą, tak więc <code>and</code> zwraca ostatnią wartość, <code>'c'</code>.
Linia 19:
 
{{Python/Przykład
|4.1618|Poznajemy <code>or</code>
|tekst=
>>> 'a' or 'b' #(1)
Linia 33:
{{samp|'a'}}
 
# Używając <code>or</code>, wartości są wyliczane w kontekście logicznymoceniane od lewej do prawej, takpodobnie jak w <code>and</code>. Jeśli jakaś wartość jest prawdą, <code>or</code> zwraca tą wartość natychmiast. W tym wypadku, <code>'a'</code> jest pierwszą wartością prawdziwą.
# <code>or</code> wyznacza <code><nowiki>''</nowiki></code> jako fałsz, ale potem <code>'b'</code>, jako prawdę i zwraca <code>'b'</code>.
# Jeśli wszystkie wartości są fałszem, <code>or</code> zwraca ostatnią wartość. <code>or</code> ocenia <code><nowiki>''</nowiki></code> jako fałsz, potem <code>[]</code> jako fałsz, potem <code>{}</code> jako fałsz i zwraca <code>{}</code>.
Linia 39:
}}
 
Jeśli jesteś osobą programującą w języku [[C]], na pewno znajome jest ci wyrażenie <code class="lang-c">bool ? a : b</code>, z którego otrzymamy <code class="lang-c">a</code>, jeśli <code class="lang-c">bool</code> jest prawdą, lub <code class="lang-c">b</code> w przeciwnym wypadku. Dzięki sposobowi działania operatorów <code>and</code> i <code>or</code> w Pythonie, możemy osiągnąć podobny efekt.
 
=== Sztuczka <code>and</code>-<code>or</code> ===
 
{{Python/Przykład
|4.1719|Poznajemy sztuczkę <code>and</code>-<code>or</code>
|tekst=
>>> a = "first"
Linia 60:
 
{{Python/Przykład
|4.1820|Kiedy zawodzi sztuczka <code>and</code>-<code>or</code>
|tekst=
>>> a = ""
Linia 69:
}}
 
Sztuczka <code>and</code>-<code>or</code>, czyli wyrażenie <code>bool and a or b</code>, nie będzie działało w identyczny sposób, jak wyrażenie w C <code class="lang-c">bool ? a : b</code>, jeśli <code>a</code> będzie fałszem w kontekście logicznym.
 
Prawdziwą sztuczką kryjącą się za sztuczką <code>and</code>-<code>or</code>, jest upewnienie się, czy wartość <code>a</code> nigdy nie jest fałszywa. Jednym ze sposobów na wykonanie tego to przekształcenie <code>a</code> w <code>[a]</code> i <code>b</code> w <code>[b]</code>, a potem pobranie pierwszego elementu ze zwróconej listy, którym będzie <code>a</code> lub <code>b</code>.
 
{{Python/Przykład
|4.1921|Bezpieczne użycie sztuczki <code>and</code>-<code>or</code>
|tekst=
>>> a = ""
Linia 84:
}}
 
Jak dotąd, ta sztuczka może wydawać się bardziej uciążliwa niż pomocna. Możesz przecież osiągnąć to samo zachowanie instrukcją <code>if</code>, 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 robićczasami korzystać z tej sztuczki. Na przykład, są pewne przypadki w Pythonie gdzie instrukcje <code>if</code> nie są dozwolone np. w wyrażeniach <code>lambda</code>.
 
{{Infobox|1=W Pythonie 2.5 wprowadzono odpowiednik wyrażenia <code class="lang-c">bool ? a : b</code> z języka C; jest ono postaci: <code>a if bool else b</code>. Jeśli wartość <code>bool</code> będzie prawdziwa, to z wyrażenia zostanie zwrócona wartość <code>a</code>, a jeśli nie, to otrzymamy wartość <code>b</code>.
}}
 
=== Materiały dodatkowe ===