2016-08-22 48 views
6

W Javie lub C mamy <condition> ? X : Y, co oznacza Python jako X if <condition> else Y.X i Y lub Z - trójskładnikowy operator

Ale jest też ta mała sztuczka: <condition> and X or Y.

Chociaż rozumiem, że jest to równoważne ze wspomnianymi wcześniej operatorami trójskładnikowymi, trudno mi zrozumieć, w jaki sposób operatorzy mogą uzyskać poprawny wynik. Jaka jest logika tego?

+0

Powiązane użyteczne informacje: wyrażenie " i X" rozwiąże "X" (lub "False", jeśli "" jest "Fałsz"). Podobnie do działania operatora 'or'. Jest to połączenie dwóch operatorów, a nie specjalnej składni. – SuperBiasedMan

+0

Wyjaśnienie znajduje się tutaj, po zlikwidowaniu kroków procesu: [Logiczny operator Pythona I] (http://stackoverflow.com/questions/18195322/pythons-logical-operator-) – SuperBiasedMan

+1

Możesz znaleźć [to odpowiedź] (http://stackoverflow.com/a/36551857/4014959) pomocne. –

Odpowiedz

8

Choć rozumiem, że jest to równoznaczne z wyżej wymienionych trójskładnikowych operatorów

To jest błędne:

In [32]: True and 0 or 1 
Out[32]: 1 

In [33]: True and 2 or 1 
Out[33]: 2 

Dlaczego pierwszy wyrażenie zwraca 1 (tj Y), podczas gdy warunek jest True i "oczekiwana" odpowiedź to 0 (tj. X)?

Według dokumentów:

EXPRESSION x i y ocenia najpierw x; jeśli x jest fałszywe, zwracana jest jego wartość: ; w przeciwnym razie wartość y jest obliczana, a otrzymana wartość zwraca wartość .

Wyrażenie x lub y najpierw ocenia x; jeśli x jest prawdziwe, zwracana jest jego wartość: ; w przeciwnym razie wartość y jest obliczana, a otrzymana wartość zwraca wartość .

Więc True and 0 or 1 ocenia pierwszy argument operatora and, który jest True. Następnie zwraca drugi argument, który jest 0.

Od True and 0 zwraca false wartości, operator or zwraca drugi argument (tj 1)

1

myślę, że najpierw sprawdzi <condition> czy to True to wykonać X i pominąć wykonanie Y jeśli X wartość PRAWDA

Ale jeśli <condition> nie powiedzie się, to pominie wykonanie X i wykona instrukcję OR i wykona Y.

4

Jeśli przyjrzymy A and B, B będą oceniane tylko jeżeli A jest True.

Podobnie jak w przypadku A or B, B zostanie oceniony tylko w przypadku, gdy A jest False.

Dlatego <condition> and X or Y powróci X jeśli <condition> jest True i Y jeśli <condition> jest False. Jest to wynikiem zwarcia i faktu, że and ma pierwszeństwo przed or.

Należy jednak zachować ostrożność przy takim podejściu. Jeśli X sama jest oceniana na False (np pusty ciąg znaków, listy lub 0) <condition> and X or Y powróci Y nawet jeśli <condition> jest True:

X = 1 
Y = 2 

print(True and X or Y) 
>> 1 

porównaniu do:

X = 0 # or '' or [] 
Y = 2 

print(True and X or Y) 
>> 2 
0

Sztuką jest, jak pyton operatory logiczne work

Wyrażenie x and y najpierw ocenia x; jeśli x ma wartość false, zwracana jest jego wartość; w przeciwnym razie wartość y jest obliczana, a wynikowa wartość jest zwracana.

Wyrażenie x or y najpierw ocenia x; jeśli x ma wartość true, zwracana jest jego wartość; w przeciwnym razie wartość y jest obliczana, a wynikowa wartość jest zwracana.

0

Wykorzystuje to fakt, że pierwszeństwo wartości and jest wyższe niż or.

Tak więc <condition> and X or Y jest w zasadzie (<condition> and X) or Y. Jeśli wartość <condition> and X jest równa True, nie ma potrzeby dalszej oceny, ponieważ dowolna wartość to True or Y. Jeśli wartość <condition> and X jest równa False, to wartość Y jest zwracana jako False or Y w zasadzie Y.