2017-10-03 9 views
0

파이썬은 논리 연산자를 단락합니다. 예를 들어 대한 :파이썬의 단락을 어떻게 막을 수 있습니까?

if False and Condition2: 
    #condition2 won't even be checked because the first condition is already false. 

이 동작을 멈출 수있는 방법이 있나요. 조건을 모두 확인한 다음 작업을 수행해야합니다 (c, C++ 등에서와 같이). 조건과 함께 몇 가지 작업을 수행 할 때 유용합니다. 예 :

if a<p.pop() and b<p.pop(): 

한 가지 방법은 조건을 확인한 다음 부울 값을 비교하는 것입니다. 그러나 그것은 기억의 낭비 일 것입니다.

+1

내가 여기에 "낭비"메모리가 어떠한 방식으로 프로그램에 영향을 미치지을 보장합니다. –

+0

* 기억 낭비 *, 기억력 낭비 ** 낭비 ** 여기. –

+0

임시 해결 방법 :'(a

답변

8
if all([a < p.pop(), b < p.pop()]) 

이것은 전체가 평가 될 것입니다 목록을 만든 다음 두 값이 모두임을 확인 all를 사용 : 당신이 그것을 문자 그대로의 튜플 또는 목록을 제공하는 경우, 모든 구성원이 완벽하게 평가되고 진실. 그러나이 다소 불분명 나는 오히려 일반 쓰기 좋을 것, 쉬운 코드를 이해하기 :

a_within_limit = a < p.pop() 
b_within_limit = b < p.pop() 
if a_within_limit and b_within_limit: 
0

all()any() 기본 제공 함수를 사용하여 andor 연산자를 어떻게 든 에뮬레이션 할 수 있습니다. 둘 다 boolean-likes 값을 매개 변수로 사용합니다.

# all emulates the and operator 
if all((False, Condition2)): 
    do_stuff() 


# any emulates the or operator 
if any((False, Condition2)): 
    do_stuff() 
1

짧은 답변 : 아니, 당신은이 일을 멈출 수 없습니다. 예를 들어

:

av = p.pop() 
bv = p.pop() 
if a < av and b < bv: 
    pass 

또는 :

av, bv = p.pop(), p.pop() 
if a < av and b < bv: 
    pass 

또한,이 예에서는 메모리의 낭비가 없다. 파이썬에서는 거의 모든 것이 참조로 이루어집니다. popped되는 값 객체는 이미 어딘가에 존재합니다. 문자열, ints와 같은 스칼라조차도 객체입니다 (그 중 일부는 약간 최적화되어 있습니다). 유일한 메모리 변경 사항은 (1) 동일한 기존 객체를 참조하는 새 변수 작성 및 (2) 동시에 사전에있는 레코드 제거 (팝업 전에 해당 객체 참조)입니다. 그들은 비슷한 규모입니다. 그들이 당신의 예에있는 바에는, 불리언 경우

0

대신 &을 사용할 수

>>> a, b, p = 1, 1, [0, 0] 
>>> (a < p.pop()) & (b < p.pop()) 
False 
>>> p 
[]