Wyrażenia logiczne w Pythonie są wyznaczane od lewej do prawej. Jeśli więc masz w if wyrażenie logiczne expr1 and expr2, to expr2 będzie wyliczane tylko wtedy jeśli expr1 ma wartość True. Jest to całkiem oczywiste z punktu widzenia optymalizacji liczby wykonywanych obliczeń – gdyby expr1 już miało wartość False, to nie ma sensu wyliczać wartości dla expr2, bo ostateczna wartość dla expr1 and expr2 to False!
Jednak informacja o kolejności wyznaczania wartości jest istotna. Popatrz na ten przykład:
i = 0 box = ['ab','bcd','cde'] while len(box[i])>0 and i < len(box): print(box[i]) i += 1
Uruchomienie skryptu skończy się błędem
IndexError: list index out of range
Dlaczego? Bo w pewnym momencie i będzie wynosiło 3 i odwołanie do box[i] nie ma sensu. Jeśli jednak zmieni się kolejność warunków w while:
i = 0 box = ['ab','bcd','cde'] while i < len(box) and len(box[i])>0: print(box[i]) i += 1
To nim odwołamy się do box[i], najpierw odbędzie się sprawdzenie, czy i<len(box). To wyrażenie zwróci wartość False, a co za tym idzie nie odbędzie się obliczanie dla prawej części wyrażenia and.
Sprytne!