2016-07-09 2 views
0

기본적으로 나는 계산기를 만들고 있는데, 지금까지 프로그램은 덧셈, 뺄셈, 곱셈 및/또는 나눗셈을 포함하는 연산을 사용자에게 요청합니다. 그런 다음 프로그램은 두 개의 목록을 만듭니다. 하나는 전체 숫자를 포함하고 다른 하나는 연산자를 포함합니다. 코드의 다음 부분은 연산자가 포함 된 목록에 if 문 형식으로 곱셈 또는 나눗셈이 포함되어 있는지 확인하지만 if 문은 실패하고 목록에 "*"및 "/"가 포함되어 있다고 표시됩니다 그렇지 않습니다. 작동하지 않는 코드는 다음과 같습니다. 어떤 도움?왜 if 문에 두 개의 문자열이 목록에 없다고 표시됩니까?

if ("*") or ("/") in Oper_NAN: 
print("POSITIVE") 
else 
    print("NEGATIVE") 

문제는 두 개의 연산자 목록 Oper_NAN (Oper_NAN의 모든 항목이 BTW 문자열)에없는 경우에도 if 문은 항상 긍정적이고 결코 부정적인 반환합니다. if 문에 잘못 표시 했습니까? 읽어 주셔서 감사합니다!

답변

6

을 감안할 때 :

if ("*") or ("/") in Oper_NAN: print("POSITIVE") else print("NEGATIVE") 

은 당신의 or의 각면은 개별적으로 평가됩니다. 그래서 당신은 다음 중 하나에 해당하는 여부를 고려하고있다 :

("*") 
("/") in Oper_NAN 

첫 번째, 비 길이가 0 인 문자열되고, 항상 부울 맥락에서 True로 평가된다. 따라서 True 또는 무엇이든 입력 한 문자는 항상 True이므로 문은 항상 True입니다.

이 문제를 해결하는 가장 간단한 방법은 다음과 같습니다 if 문

if any(c in Oper_NAN for c in "*/"): 
+0

아를! 빠른 응답에 감사드립니다.그래서 근본적으로, 나는 양쪽 다 동시에 점검 할 수 없다? 그게 쉬운 해결책을 고맙게 생각한다면, 나중에 그 점을 염두에 두겠습니다. –

2

이이 두 문자 아마도 과잉이다하지만

if ("*") in Oper_NAN or ("/") in Oper_NAN: 

또한, any() 및 발전기 식을 사용하여 쓸 수 기본적으로 다음과 같이 구분됩니다.

if True or (condition): #code 

파이썬의 모든 것은 진리 값을 가지고 비어 있지 않은 문자열은 True으로 평가됩니다.

귀하의 if 상태가 지연 평가됩니다. 왼쪽면이 먼저 계산되고 오른쪽면은 왼쪽면이 False 인 경우에만 평가됩니다. 하지만 비어 있지 않은 문자열은 항상 True이므로 if 조건 안에있는 코드는 항상 실행됩니다.

부울 논리/진리 값의 물건 : P or Q 두 문에서도 PQ는 다음과 같은 경우에는 True로 평가됩니다. PTrue이고, Q가 참인지 거짓인지에 관계없이 PFalse이고 QTrue입니다. 다른 모든 경우는 False입니다.

진실 표라고 알려진 것을 사용하여 여기에 관심이 있다면 더 많은 "mathy"측면이 있습니다.

| P | Q | P v Q | 
----------------- 
| T | T | T | 
----------------- 
| T | F | T | 
----------------- 
| F | T | T | 
----------------- 
| F | F | F | 
----------------- 

당신은 사용할 수 있습니다

if "*" in Oper_NAN or "/" in Oper_NAN