TL; DR
두 논리 연산자 and
및 의 두 동작을 요약하여 시작합니다 or
. 이러한 관용구는 아래 논의의 기초가 될 것입니다.
and
첫 번째 Falsy 값이 있으면 반환하고, 그렇지 않으면 표현식의 마지막 값을 반환합니다.
or
첫 번째 Truthy 값이 있으면 반환하고, 그렇지 않으면 식의 마지막 값을 반환합니다.
동작은 문서 , 특히이 표에 요약되어 있습니다 .
피연산자에 관계없이 부울 값을 반환하는 유일한 연산자는 not
연산자입니다.
"진실성"및 "진실성"평가
진술
len(args) and max(args) - min(args)
A는 매우 파이썬 간결 (틀림없이 적은 읽기) "하면 말하는 방법 args
비어 있지의 결과를 반환 max(args) - min(args)
그렇지 않으면 반환"는 0
. 일반적으로 표현을보다 간결하게 표현한 것입니다 if-else
. 예를 들면
exp1 and exp2
(대략) 번역해야합니다 :
r1 = exp1
if r1:
r1 = exp2
또는 동등하게
r1 = exp1 if exp1 else exp2
비슷하게,
exp1 or exp2
다음과 같습니다.
r1 = exp1
if not r1:
r1 = exp2
어디 exp1
및 exp2
일부 개체를 반환 임의의 파이썬 객체, 또는 표현입니다. 여기 에서 논리 연산자 and
와 or
연산자 의 사용을 이해하는 데있어 핵심 은 부울 값을 연산하거나 반환하는 데 제한되지 않는다는 것을 이해하는 것입니다. 진실성 값을 가진 모든 개체를 여기서 테스트 할 수 있습니다. 여기에는 int
, str
, list
, dict
, tuple
, set
, NoneType
, 및 사용자 객체를 정의했다. 단락 규칙도 여전히 적용됩니다.
그러나 진실이란 무엇입니까?
조건식에서 사용될 때 객체가 평가되는 방식을 나타냅니다. @Patrick Haugh는 이 게시물 에서 진실성을 멋지게 요약 합니다.
"허위"인 다음을 제외하고 모든 값은 "진정한"것으로 간주됩니다.
None
False
0
0.0
0j
Decimal(0)
Fraction(0, 1)
[]
-빈 list
{}
-빈 dict
()
-빈 tuple
''
-빈 str
b''
-빈 bytes
set()
-빈 set
- 빈
range
처럼,range(0)
- 대상
obj.__bool__()
보고 False
obj.__len__()
보고 0
"truthy"값은 if
또는 while
문에 의해 수행 된 검사를 충족합니다 . 우리는 차별화에 "truthy"와 "falsy을"사용
bool
가치 True
와 False
.
어떻게 and
작동
우리는 이러한 경우에 이러한 연산자가 어떻게 작동하는지에 대한 토론의 후속으로 OP의 질문을 기반으로합니다.
정의가있는 함수가 주어짐
def foo(*args):
...
0 개 이상의 인수 목록에서 최소값과 최대 값의 차이를 어떻게 반환합니까?
최소값과 최대 값을 찾는 것은 쉽습니다 (내장 함수 사용!). 여기서 유일한 문제는 인수 목록이 비어있을 수있는 코너 케이스를 적절하게 처리하는 것입니다 (예 : 호출 foo()
). and
연산자 덕분에 한 줄로 두 가지를 모두 수행 할 수 있습니다 .
def foo(*args):
return len(args) and max(args) - min(args)
foo(1, 2, 3, 4, 5)
# 4
foo()
# 0
and
이 사용 되므로 첫 번째 표현식이 인 경우 두 번째 표현식도 평가되어야합니다 True
. 첫 번째 표현식이 진실로 평가되면 반환 값은 항상 두 번째 표현식 의 결과입니다 . 첫 번째 표현식이 Falsy로 평가되면 반환 된 결과는 첫 번째 표현식의 결과입니다.
위의 함수에서 foo
하나 이상의 인수를받는 경우 는 (양수) len(args)
보다 크므 0
로 반환 된 결과는입니다 max(args) - min(args)
. 인수가 전달되지 않은 경우 OTOH, len(args)
이다 0
Falsy하고, 어떤 0
반환됩니다.
이 함수를 작성하는 다른 방법은 다음과 같습니다.
def foo(*args):
if not len(args):
return 0
return max(args) - min(args)
또는 더 간결하게
def foo(*args):
return 0 if not args else max(args) - min(args)
물론, 이러한 함수 중 어떤 것도 유형 검사를 수행 하지 않으므로 제공된 입력을 완전히 신뢰 하지 않는 한 이러한 구성의 단순성에 의존 하지 마십시오 .
어떻게 or
작동
or
인위적인 예를 들어 비슷한 방식으로 작업을 설명합니다 .
정의가있는 함수가 주어짐
def foo(*args):
...
foo
모든 숫자를 반환 하려면 어떻게 완료 9000
하시겠습니까?
or
여기서 코너 케이스를 처리하는 데 사용 합니다. 우리는 다음 foo
과 같이 정의 합니다.
def foo(*args):
return [x for x in args if x > 9000] or 'No number over 9000!'
foo(9004, 1, 2, 500)
# [9004]
foo(1, 2, 3, 4)
# 'No number over 9000!'
foo
목록에서 필터링을 수행하여 모든 숫자를 유지합니다 9000
. 그러한 숫자가 있으면 목록 이해의 결과는 Truthy 인 비어 있지 않은 목록이되므로 반환됩니다 (여기에서 작동중인 단락). 그러한 숫자가 없으면 목록 comp의 결과 []
는 Falsy입니다. 이제 두 번째 표현식이 평가되고 (비어 있지 않은 문자열) 반환됩니다.
조건문을 사용하여이 함수를 다음과 같이 다시 작성할 수 있습니다.
def foo(*args):
r = [x for x in args if x > 9000]
if not r:
return 'No number over 9000!'
return r
이전과 마찬가지로이 구조는 오류 처리 측면에서 더 유연합니다.
and
(뿐만 아니라or
)은 부울 값으로 작업하거나 반환하는 데 제한되지 않습니다.