2016-06-01 3 views
0

Hy ... 나는 단지 파이썬을 배우는 중이다. 그리고 저는 다음과 같은 프로그램을 만들었습니다 :파이썬에서 "OR"의 missbehaviour

guess = raw_input("please input something..."); 
while (guess != 'h'): 
    guess = raw_input("pleae input something again...."); 
    print(guess); 

print("Thanks..."); 

음 ... 위의 프로그램은 잘 돌아갑니다. ! 나는이 같은 "OR"추측 후 = '시간'을 넣을 때 : 프로그램 위

guess = raw_input("please input something..."); 
while (guess != 'h') or (guess != 't'): 
    guess = raw_input("pleae input something again...."); 
    print(guess); 

print("Thanks..."); 

는 while 루프에 영원히 실행됩니다. 거기서 무슨 일이 일어나고있는거야? 나는 루프가 귀하의 조건이 항상 보유하고

+1

'추측 '이'h' 일 때 분명히't'가 아닐 것입니다; 계속할 조건 중 하나가 '추측! ='t ''이므로 루프를 계속 진행하기위한 조건을 만족시킵니다. – metatoaster

답변

9

I 입력 h 또는 t 중 후 종료됩니다 생각 :

(guess != 'h') or (guess != 't') 

이 (한 부분은 사실이 아니다하는 경우는, 다른 하나는 의미) 항상 true입니다.

not (guess == 'n' and guess == 't') 

이 항상 참 (guess는 하나의 일이 될 수 있습니다) 분명히 : 여기 De-Morgan's law를 사용하는 경우

당신은 좀 더 분명 뭔가를 얻을.

당신은 아마 원하는 : 더 나은 아직

(guess != 'h') and (guess != 't') 

또는 :

while guess not in 'ht': 
+0

고마워, 나는 그것을 이해하지 못했다. :) –

2

하는 것은 잘못된 행동 아니에요; 그것은 모든 언어에서 부울 논리가 작동하는 방식입니다. 이러한 종류의 비교를 위해서는 and을 사용해야합니다.

5
while (guess != 'h') or (guess != 't') 

이 줄은 기본적으로 말합니다 : 입력이 'h'가 아니거나 입력이 't'가 아닌 경우 반복하십시오. 콘솔 입력은 동시에 'h'와 't'일 수 없으므로 루프는 영원히 반복됩니다. while guess != 'h' and guess != 't' 또는 while not (guess == 'h' or guess == 't') (둘 다 논리적 관점에서 동일하지 않음)을 찾고 있지 않습니까?