파이썬에서 논리 문 NOT AND & OR의 우선 순위


82

내가 아는 한, C & C ++에서 NOT AND & OR의 우선 순위 시퀀스는 NOT> AND> OR입니다. 그러나 이것은 파이썬에서 비슷한 방식으로 작동하지 않는 것 같습니다. Python 문서에서 검색을 시도했지만 실패했습니다 (조금 참을성이 없네요). 누군가 나를 위해 이것을 해결할 수 있습니까?


2
연산자 우선 순위가 생각대로 작동하지 않는 예를 들어 줄 수 있습니까?
dodgethesteamroller

not 크거나 크거나보다 크거나
CtrlAltF2

답변:


95

연산자 우선 순위 에 대한 문서에 따르면 NOT, AND, OR이 가장 높은 것부터 낮은 것까지입니다.

다음은 가장 낮은 우선 순위에서 가장 높은 우선 순위의 전체 우선 순위 테이블입니다. 행은 동일한 우선 순위와 왼쪽에서 오른쪽으로 연결됩니다.

 0. :=
 1. lambda
 2. ifelse
 3. or
 4. and
 5. not x
 6. in, not in, is, is not, <, <=, >, >=, !=, ==
 7. |
 8. ^
 9. &
 10. <<, >>
 11. +, -
 12. *, @, /, //, %
 13. +x, -x, ~x
 14. **
 14. await x
 15. x[index], x[index:index], x(arguments...), x.attribute
 16. (expressions...), [expressions...], {key: value...}, {expressions...}

1
참고 **는 산술 연산자를 선행 과제에 관해서 각주에서 언급 한 몇 가지 예외가있다.
Martijn Pieters

1
이것은 저의 수학자를 혼란스럽게합니다. 산술에서 산술 연산자보다 우선권이 있다고 말할 것입니다. 오른쪽에있는 **연산자는 산술 연산보다 우선권이 없지만 왼쪽에는 ... 예를 들어 5*2**2 == 5*(2**2). 그러나 그렇게 말하는 것은 옳습니다 2**-1 == 2**(-1).
PhilMacKay

@PhilMacKay는 - 마이너스가의 일부 예를 들면 것을 보일 수 int문자,하지만 그것을 구문 분석 할 때 ast그것은 그렇지 않다 - 그것의 UnaryOpUSub1피연산자로. 진짜 이유는 그것을 파싱 할 다른 방법이 없다는 것입니다. 즉 2**, 바이너리 마이너스에 대한 올바른 왼쪽 피연산자가 아닙니다. 따라서 "지수 우선 순위 예외"이지만 "오른쪽에만".
토마스 Gandor

32

다음 테스트를 수행하여 and및 의 우선 순위를 알아낼 수 있습니다 or.

먼저 0 and 0 or 1Python 콘솔에서 시도하십시오 .

or먼저 바인드 하면 0출력으로 예상 됩니다.

내 콘솔 1에는 출력이 있습니다. 이 수단 and제 어느 바인딩 또는 동등 or(왼쪽에서 오른쪽으로 아마 표현식 평가).

그런 다음 1 or 0 and 0.

만약 orand바인드 똑같이와 내장, 바로 평가하기 위해 왼쪽 우리가 가야 0출력한다.

내 콘솔 1에는 출력이 있습니다. 그리고 우리는 그 결론을 내릴 수 and보다 더 높은 우선 순위를가집니다 or.


3
보다 명시 적으로 표현은 다음 ((0 and 0) or 1)과 같이 평가됩니다.(1 or (0 and 0))
Conchylicultor

1
그러나 두 번째 표현식에서는 if is (0 and 0)(exp1 or exp2)직접 반환하는 exp1것으로 평가되지 않습니다 True. 마찬가지로 첫 번째 표현식에서 and 0부품은 exp1 and exp2if exp1가 직접 반환되는 것으로 평가되지 않습니다 False.
Conchylicultor


4

부울 연산자 중 가장 약한 것부터 가장 강한 것까지의 우선 순위는 다음과 같습니다.

  1. or
  2. and
  3. not x
  4. is not; not in

연산자의 우선 순위가 동일한 경우 평가는 왼쪽에서 오른쪽으로 진행됩니다.


죄송합니다. # 2는 기술적으로 정확하지만 여전히 오해의 소지가 있습니다. 우선, 문서가 바뀌지 않는 것 같습니다. 둘째, 귀하의 의견 # 2 (제안 andnot x왼쪽에서 오른쪽으로 평가됨)는 공식적인 효과와 기술적으로 동일하지만 단순히 "cond1 and not cont2"에서 ​​파이썬은 기본적으로 cont2를 먼저 계산해야하기 때문입니다.
RayLuo 2015

@RayLuo에게 감사하지만 기술적으로도 정확 하지 않았습니다 . 나는 그 테이블의 행을 나누는 잘못 렌더링 된 선에 의미를 두었습니다. 2.7 문서를 보면 오늘 orand사용하여 동일한 셀에있는 것으로 표시 파이어 폭스 하지만 오페라 . 사이의 우선 순위의 차이 or와는 and분명하다 (예. 1 or 0 and 0(1 or 0) and 0) 그 사이 andnot x순전히 당신이주는 이유. 문서가 실제로 말하는 내용을 반영하기 위해 내 대답을 고칠 것 입니다.
Oswald Wirt 2015

2

파이썬이 C / C ++를 포함한 (거의) 다른 모든 프로그래밍 언어에서 잘 확립 된 연산자보다 다른 우선 순위 시퀀스 를 가질 이유없습니다 .

당신은 그것을 찾을 수 있습니다 파이썬 언어 참조 , 일부 6.16 -에서 연산자 우선 순위 (현재 버전은 다른 모든 표준 설명서와 함께 포장) 다운로드 https://docs.python.org/3/download.html , 또는 그것을 읽고 온라인 : 6.16. 연산자 우선 순위 .

그러나 여전히 당신을 오해 할 수 파이썬에서 무언가가 다음 결과andor운영자는있을 수 있습니다 다른 에서 True또는 False- 참조 6.11 부울 연산을 동일한 문서에.


1

몇 가지 간단한 예; 연산자 우선 순위에 유의하십시오 (and 또는 또는 아님). 인간의 해석을 돕기 위해 괄호를 사용합니다.

a = 'apple'
b = 'banana'
c = 'carrots'

if c == 'carrots' and a == 'apple' and b == 'BELGIUM':
    print('True')
else:
    print('False')
# False

비슷하게:

if b == 'banana'
True

if c == 'CANADA' and a == 'apple'
False

if c == 'CANADA' or a == 'apple'
True

if c == 'carrots' and a == 'apple' or b == 'BELGIUM'
True

# Note this one, which might surprise you:
if c == 'CANADA' and a == 'apple' or b == 'banana'
True

# ... it is the same as:
if (c == 'CANADA' and a == 'apple') or b == 'banana':
True

if c == 'CANADA' and (a == 'apple' or b == 'banana'):
False

if c == 'CANADA' and a == 'apple' or b == 'BELGIUM'
False

if c == 'CANADA' or a == 'apple' and b == 'banana'
True

if c == 'CANADA' or (a == 'apple' and b == 'banana')
True

if (c == 'carrots' and a == 'apple') or b == 'BELGIUM'
True

if c == 'carrots' and (a == 'apple' or b == 'BELGIUM')
True

if a == 'apple' and b == 'banana' or c == 'CANADA'
True

if (a == 'apple' and b == 'banana') or c == 'CANADA'
True

if a == 'apple' and (b == 'banana' or c == 'CANADA')
True

if a == 'apple' and (b == 'banana' and c == 'CANADA')
False

if a == 'apple' or (b == 'banana' and c == 'CANADA')
True
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.