파이썬은 단락을 지원합니까?


답변:



192

연산자의 동작을 쇼트 - 단락 and, or:

먼저 무언가가 실행되는지 여부를 결정하는 유용한 함수를 정의 해 봅시다. 인수를 허용하고 메시지를 인쇄 한 후 입력을 변경없이 반환하는 간단한 함수입니다.

>>> def fun(i):
...     print "executed"
...     return i
... 

하나는 관찰 할 수 파이썬의 단락 행동and, or다음 예에서 연산자를 :

>>> fun(1)
executed
1
>>> 1 or fun(1)    # due to short-circuiting  "executed" not printed
1
>>> 1 and fun(1)   # fun(1) called and "executed" printed 
executed
1
>>> 0 and fun(1)   # due to short-circuiting  "executed" not printed 
0

참고 : 다음 값은 인터프리터에서 false를 의미하는 것으로 간주됩니다.

        False    None    0    ""    ()    []     {}

기능에서의 단락 동작 : any(), all():

파이썬 any()all()함수도 단락을 지원합니다. 문서에 표시된 것처럼; 평가의 조기 종료를 허용하는 결과를 찾을 때까지 순서의 각 요소를 순서대로 평가합니다. 아래 예제를 고려하여 두 가지를 모두 이해하십시오.

이 함수 any()는 요소가 True인지 확인합니다. True가 발생하자마자 실행을 중지하고 True를 반환합니다.

>>> any(fun(i) for i in [1, 2, 3, 4])   # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])   
executed                               # bool(0) = False
executed                               # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True

이 함수 all()는 모든 요소가 True인지 확인하고 False가 발생하자마자 실행을 중지합니다.

>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False

체인 비교에서 단락 동작 :

또한 파이썬에서

비교는 임의로 연결될 수 있습니다 . 예를 들어, x < y <= z동일합니다 x < y and y <= z것을 제외하고, y(그러나 두 경우에 한 번만 평가 z때 전혀 평가되지 않습니다 x < y허위로 발견된다).

>>> 5 > 6 > fun(3)    # same as:  5 > 6 and 6 > fun(3)
False                 # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3)    # 5 < 6 is True 
executed              # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7)   # 4 <= 6 is True  
executed              # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3    # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False

편집 :
참고로 한 가지 더 흥미로운 점 : - 논리는 and,or 파이썬에서 연산자는 피연산자의 반환 대신 부울 (의 True또는 False). 예를 들면 다음과 같습니다.

작업 x and y결과if x is false, then x, else y

다른 언어와 달리 &&, 예를 들어 , ||0 또는 1을 반환하는 C의 연산자.

예 :

>>> 3 and 5    # Second operand evaluated and returned 
5                   
>>> 3  and ()
()
>>> () and 5   # Second operand NOT evaluated as first operand () is  false
()             # so first operand returned 

마찬가지로 or연산자는 단락 동작에 따라 bool(value)== 를 제외한 가장 왼쪽 값을 반환 True합니다 (예 : 단락 동작에 따라).

>>> 2 or 5    # left most operand bool(2) == True
2    
>>> 0 or 5    # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()

그렇다면 어떻게 유용합니까? Practical Python 에서 사용 된 한 가지 사용 예 : Magnus Lie Hetland :
사용자가 자신의 이름을 입력해야하지만 아무 것도 입력하지 않을 수 있습니다.이 경우 기본값을 사용하려고합니다 '<unknown>'. if 문을 사용할 수는 있지만 간결하게 설명 할 수도 있습니다.

In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name: 

In [172]: name
Out[172]: '<Unkown>'

즉, raw_input의 리턴 값이 true 인 경우 (빈 문자열 아님) name에 지정됩니다 (변경 사항 없음). 그렇지 않으면 기본값 '<unknown>'이로 지정됩니다 name.


1
경미한 퀴즈 : 잘못된 값의 명시적인 목록이 약간 잘못되었습니다. 모든 유형은 하나 이상의 잘못된 값을 가질 수 있습니다. 규칙에 따라 값이 모든 숫자 유형 0(그냥하지 그래서 falsy입니다 0, 그건 0.0, 0j, decimal.Decimal(0), fractions.Fraction(0), 등), 모든 컬렉션 길이있다 0(그래서 당신이 나와 무슨의 위에, b''[Py3], u''[Py2가] 및 set()/ frozenset()있습니다 허위로 평가되는 모든 내장 기능이지만 사용자 정의 / 타사 유형은 직접 정의 할 수 있습니다 ( __bool__[Py3] / __nonzero__[Py2]를 사용하여 직접 또는 간접적으로 정의 __len__).
ShadowRanger

@ShadowRanger 여기에 귀하의 의견은 내 답변을 완료합니다. 이 메모를 추가해 주셔서 감사합니다.
Grijesh Chauhan

: 나중에 논리 값으로 사용하는 경우 문 경우가 priviliged되는,에 있지 않으면 또한, 파이썬을 두 번 평가하여 짧은 ..., 조건문을 단락 gist.github.com/earonesty/08e9cbe083a5e0583feb8a34cc538010
에릭 Aronesty

48

예. 파이썬 인터프리터에서 다음을 시도하십시오.

>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero

또는

>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.