Aby odpowiedzieć na Twoje pytania w odwrotnej kolejności, powodem, dla którego jawne porównanie z True
nie zadziałało, jest to, że Python nie interpretował wyrażenia zgodnie z oczekiwaniami. Python parser ma specjalną obsługę porównać wyrażeń, dzięki czemu można łańcucha je razem i dostać sensowny rezultat, tak:
>>> "a" == "a" == "a"
True
Zauważ, że Python ma traktować tę całą rzecz jako jednej operacji, ponieważ jeśli go podzielić w dwóch operacjach albo sposób nie uzyskać ten sam rezultat:
>>> ("a" == "a") == "a"
False
>>> "a" == ("a" == "a")
False
te zachowują się inaczej, ponieważ część w nawiasach jest oceniany pierwszy i zwraca True
, ale True != "a"
więc całe wyrażenie zwraca wartość false.
Według prawa powyższe informacje w rzeczywistości nie powinny mieć żadnego wpływu na program. Niestety, Python obsługuje in
za pośrednictwem tego samego mechanizmu co ==
więc kiedy łańcuch te razem są one interpretowane jako sekwencję jak wyżej, więc Python rzeczywiście ocenia je następująco:
>> "a" in ["a"] == True
False
>>> ("a" in ["a"]) and ("a" == True)
False
To zwariowana i prawdopodobnie sprzeczne z intuicją, ale to niestety tylko jak to działa.Aby uzyskać zachowanie chciałeś trzeba użyć nawiasów, aby zmusić Pythona do oceny pierwszej części oddzielnie:
>>> ("a" in ["a"]) == True
True
Z wszystkich, że powiedziałem, == True
jest zbędny, ponieważ, jak podejrzewał, ekspresja już zwraca wartość logiczną i oświadczenie if
może po prostu ocenić je tak, jak jest.
Aby teraz powrócić do innego problemu, uważam, że próbujesz wykonać jedną linię danych wejściowych i wytworzyć jedną odpowiadającą linię wyjściową w zależności od wprowadzonego przez użytkownika. Można zastosować operator in
na ciąg i listy, aby sprawdzić, czy ciąg jest na liście, która pozwala wyeliminować pętlę for
sumie:
answer = ['Yes', 'yes', 'YES']
answer2 = ['No', 'no', 'NO']
ans = raw_input()
if ans in answer:
print "Yes!"
elif ans in answer2:
print "No!"
else:
print "Don't know what that means"
tej pierwszej próby, jeśli wejście mecze każdy z ciągów w answer
, to samo dla answer2
. Oczywiście można osiągnąć podobny efekt, ale można także obsługiwać inne formy, na przykład YeS
, konwertując dane wejściowe na małe litery i porównując je z małą literą:
if ans.lower() == "yes":
print "Yes!"
# (and so forth)