Menu

파이썬 and, or, not: 논리 연산자, 단축 평가, truthy와 falsy

파이썬의 and, or, not 연산자가 동작하는 방식: 진리표, truthy와 falsy 값, 단축 평가, and/or가 피연산자 중 하나를 돌려주는 이유, 우선순위, 그리고 and/or와 &, |의 차이.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

기호 대신 세 단어

파이썬의 논리 연산자는 영어 단어 and, or, not이에요. 다른 언어에서는 &&, ||, !로 씁니다. 파이썬에서 &&와 ||는 SyntaxError이고, !는 !=("같지 않음")의 일부로만 등장해요.

True와 False에서는 예상하는 그대로의 규칙이에요:

aba and ba or bnot a
TrueTrueTrueTrueFalse
TrueFalseFalseTrueFalse
FalseTrueFalseTrueTrue
FalseFalseFalseFalseTrue

and는 양쪽이 모두 참이어야 해요. or는 적어도 하나면 됩니다. not은 값 하나를 받아서 뒤집어요.

실제 코드에서는 양쪽이 대개 비교식이고, 그 결과가 if나 while로 들어가요:

출력:

eligible
standard ticket

대부분의 조건에는 여기까지면 충분해요. 이 페이지의 나머지 부분에서는 True나 False가 아닌 값에 이 연산자들이 무엇을 하는지, 그리고 식의 어느 쪽이 실행될지 정하는 규칙을 다룹니다.

truthy 값과 falsy 값

and, or, not은 불리언뿐 아니라 어떤 값이든 받아요. 파이썬은 값의 truthiness로 그 값을 참으로 칠지 정합니다. 다음 값들은 falsy예요:

  • False와 None
  • 모든 숫자 타입의 0: 0, 0.0
  • 빈 컨테이너와 빈 문자열: "", [], (), {}, set(), range(0)

나머지는 전부 truthy예요. "0", "False", [0], -1도 마찬가지입니다. 파이썬이 어떤 값을 어떻게 분류하는지는 bool()로 볼 수 있어요:

출력:

0 False
1 True
-1 True
'' False
'0' True
[] False
[0] True
None False
0.0 False

문자열 "0"은 비어 있지 않은 문자열이라서 truthy예요. 입력에서 숫자를 읽고 변환하기 전에 검사하는 사람들이 여기서 자주 걸려요. bool과 int의 관계는 숫자와 불리언 페이지에서 다룹니다.

and와 or는 피연산자를 돌려줘요

파이썬이 대부분의 언어와 다른 지점이 여기예요. and와 or는 새로운 True나 False를 만들지 않아요. 넘겨준 두 값 중 하나를 돌려줍니다:

  • x or y는 x가 truthy면 x를, 아니면 y를 돌려줘요.
  • x and y는 x가 falsy면 x를, 아니면 y를 돌려줘요.

두 피연산자가 모두 불리언이면 "피연산자를 돌려준다"와 "불리언을 돌려준다"는 같은 말이에요. 그래서 다른 타입을 섞기 전까지는 이 차이를 알아채지 못합니다.

not은 예외예요. 항상 True나 False를 돌려줍니다.

and/or 식에서 진짜 불리언이 필요하다면, 예를 들어 값을 저장하거나 bool을 돌려주기로 한 함수에서 반환할 때라면 bool()로 감싸세요:

단축 평가

파이썬은 and와 or를 왼쪽에서 오른쪽으로 평가하고, 답이 정해지는 순간 멈춰요:

  • and는 첫 번째 falsy 값에서 멈춰요. 그 뒤에 무엇이 와도 식 전체를 참으로 만들 수 없으니까요.
  • or는 첫 번째 truthy 값에서 멈춰요. 그 뒤에 무엇이 와도 식 전체를 거짓으로 만들 수 없으니까요.

건너뛴 쪽은 아예 실행되지 않아요. 호출될 때 출력하는 함수로 이 과정을 직접 볼 수 있어요:

출력:

and:
  checking A
False
or:
  checking A
True

두 경우 모두 B는 한 번도 검사되지 않아요. 단축 평가 덕분에 가드 조건이 안전해집니다. 아래 각 조건의 뒷부분은 혼자서라면 프로그램을 멈추게 하지만, 앞부분이 문제가 되는 경우를 걸러낸 뒤에만 실행돼요:

비용이 싸거나 보호 역할을 하는 검사를 앞에 두세요. 순서를 뒤집어 user.startswith("admin") and user is not None으로 쓰면 user가 None일 때 AttributeError가 발생해요.

or와 and로 만드는 패턴

or는 첫 번째 truthy 피연산자를 돌려주기 때문에 기본값을 한 줄로 줄 수 있어요:

출력:

Hello, Ada!
Hello, guest!
Hello, guest!

함정은 or가 None만이 아니라 모든 falsy 값을 바꿔 버린다는 거예요. 0, "", []가 정상적인 입력이라면 or가 그 값을 버립니다:

0이나 빈 값이 유효한 값이라면 x if x is not None else default를 쓰세요. 이 조건부 표현식은 if/else 페이지에서 다뤄요.

and에도 짝이 되는 패턴이 있어요. "첫 번째 값이 있을 때만 이 값을 쓴다"는 뜻이에요. 덜 흔하고 if로 쓰는 편이 더 명확할 때가 많으니 아껴서 쓰세요:

우선순위: not, 그다음 and, 그다음 or

세 연산자가 한 식에 섞이면 파이썬은 not을 먼저, 그다음 and, 그다음 or를 적용해요. ==, <, in 같은 비교는 이 셋보다 먼저 적용됩니다.

a or b and c와 (a or b) and c는 같은 값에서 다른 답을 내요. 그러니 섞인 조건에는 기본 순서가 우연히 맞더라도 괄호를 넣으세요. 비용은 없고, 다음에 읽는 사람이 고민할 필요가 없어져요.

and/or와 &/|

&와 |는 and, or와 비슷해 보이고 가끔 같은 답을 내기도 하지만, 서로 다른 연산자예요.

  • and / or는 truthy 여부를 검사하고, 단축 평가를 하고, 피연산자 중 하나를 돌려줘요.
  • & / |는 비트 연산자예요. 정수에서는 두 수의 비트를 조합해요. 집합에서는 교집합과 합집합을 뜻해요. True와 False에서는 불리언을 돌려줘요. 단축 평가는 절대 하지 않아서, 양쪽이 항상 평가됩니다.

비트 연산자는 비교 연산자보다 우선순위도 높아서, &로 쓴 조건은 전혀 다른 식이 돼 버려요:

1 & y는 1 & 5, 즉 1이라서 가운데 줄은 5 > 1 > 1이라는 연쇄 비교가 되고, 1 > 1은 거짓이에요. 일반적인 파이썬 코드에서는 조건에 and, or, not을 쓰세요.

조건에 &, |, ~를 쓰는 게 맞는 곳은 NumPy와 pandas뿐이에요. 배열은 값을 여러 개 담고 있어서 하나의 진릿값이 없고, and를 쓰면 ValueError: The truth value of an array ... is ambiguous가 발생해요. 이 라이브러리들은 &와 |를 원소별로 동작하도록 오버로드해요. 그래서 pandas 필터는 df[(df.age > 18) & (df.country == "CA")]처럼 생겼고, 위에서 본 우선순위 때문에 비교식마다 괄호를 둘러요.

any()와 all(): 리스트 전체에 대한 and와 or

조건 여러 개를 한꺼번에 묶으려면 내장 함수 all()(모든 항목에 걸친 and)과 any()(모든 항목에 걸친 or)를 쓰세요. 둘 다 같은 방식으로 단축 평가를 해요:

and, or와 달리 any()와 all()은 항상 불리언을 돌려줘요.

흔한 실수

변수 하나를 or로 여러 값과 비교하기. 이 조건은 항상 참이에요:

파이썬은 첫 번째 조건을 (color == "red") or "blue"로 읽어요. 비교 결과가 False니까 or는 "blue"를 돌려주고, 비어 있지 않은 문자열은 truthy예요. 양쪽에 비교를 반복해 쓰거나, 더 좋게는 in으로 포함 여부를 검사하세요.

&&나 || 쓰기. 둘 다 SyntaxError예요. and와 or를 쓰세요.

and/or에서 불리언을 기대하기. x = a or b는 a나 b 자체를 저장해요. 대개는 그게 원하는 동작이지만, 함수가 True나 False를 돌려줘야 한다면 bool()로 변환하세요.

섞인 조건에서 우선순위에 기대기. a or b and c는 문법상 맞고 뜻도 분명하지만, 아무도 규칙을 기억할 필요가 없도록 괄호를 넣으세요.

자주 묻는 질문

파이썬에서 and 연산자는 무엇을 하나요?

a and b는 양쪽이 모두 참일 때만 참이에요. 파이썬은 a를 먼저 평가해서, a가 falsy면 b는 보지도 않고 a를 돌려주고, 그렇지 않으면 b를 돌려줘요. 순수한 불리언끼리라면 익숙한 결과가 나옵니다: True and False는 False예요.

0 or 5는 왜 True가 아니라 5를 돌려주나요?

or와 and는 새 불리언을 만들지 않고 피연산자 중 하나를 돌려줘요. x or y는 x가 truthy면 x를, 아니면 y를 돌려줍니다. 0은 falsy라서 0 or 5는 5예요. 진짜 True나 False가 필요하면 식을 bool()로 감싸세요.

파이썬에서 and와 &는 뭐가 다른가요?

and는 논리 연산자예요. truthy 여부를 검사하고 단축 평가를 합니다. &는 비트 연산자예요. 정수에서는 비트를 조합하고(6 & 3은 2), 집합에서는 교집합을 구하며, 항상 양쪽을 모두 평가해요. if 조건에는 and를 쓰세요. 예외는 NumPy와 pandas로, 거기서는 &가 원소별 and입니다.

파이썬에서 and와 or 중 무엇이 먼저 실행되나요?

not이 가장 강하게 묶이고, 그다음이 and, 그다음이 or예요. 그래서 a or b and c는 a or (b and c), not a or b는 (not a) or b라는 뜻이에요. ==, < 같은 비교 연산자는 이 셋보다 모두 강하게 묶입니다.

파이썬에서 &&와 ||를 쓸 수 있나요?

아니요. 파이썬에서 &&와 ||는 SyntaxError예요. 논리 연산자는 and, or, not이라는 단어입니다. &나 | 하나만 쓰는 건 문법상 맞지만 뜻이 달라요(비트 and/or).

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기