2011-11-07 2 views
4

짧은 조건 변수 정의에 3 진 연산자를 사용하고 있습니다. 식이 표현식 값 대신 True를 반환하면 궁금합니다.삼항 연산자는 주어진 값 대신 'True`를 반환합니다.

>>> digits = '123456' 

>>> conv_d = digits != None if int(digits) else None 

>>> conv_d 
>>> True 

>>> int(digits) 
>>> 123456 

설명해주세요. 어떻게됩니까? 파이썬에서 삼항 연산자와 정규 조건식의 논리적 차이점은 무엇입니까?

답변

7

int(digits) == 123456 이는 참값이다. 그래서 conv_d = digits != None. digitsNone이 아니므로 conv_d이 true로 설정됩니다.

당신은 아마이 원 :

conv_d = int(digits) if digits is not None else None 

문자열이 숫자 불구하고 예외를 발생하지 않습니다 뭔가를 포함하는 것을 기억하십시오! 이 값에 0 또는 None을 사용하려면 다음과 같이 작은 함수를 작성하십시오.

def toint(s): 
    try: 
     return int(s) 
    except (ValueError, TypeError): 
     return None # or 0 
+0

우수! 감사. – I159

5

파이썬 조건부 연산자는 다른 언어와 순서가 동일하지 않습니다. 그리고 당신이 필요하다고 확신하지 않는 한 평등을 None과 비교해서는 안됩니다.

원 - 사업자
conv_d = int(digits) if digits is not None else None 
0

대안 :

conv_d = 숫자 = 없음 및 INT (숫자) 또는 없음 # 단락]! 자리가 없음 다른 없음

하지 않는 경우

또는

conv_d = INT (자리) 아래를 참조하십시오 코멘트 (들) -이 자리를 위해 = "0"작동하지 않는 한이 상황에서 단지 잘못된

두 번째 표현식이 더 명확하여 선호됩니다.

+0

'int (digits)'가 0이면 첫 번째 명령은 실패합니다.'digits'가'None'과 평등을 공정하게 비교하지 않으면 두 명령 모두 실패합니다. –

+0

첫 번째 오류를 발견해 주셔서 감사합니다! 아이디어는 단순히 파이썬에서 누락 된 삼항 연산자에 대한 몇 가지 대안이 있다는 것을 보여주기위한 것이므로 단순히 숫자를 [0-9] 또는 [없음]으로 구성된 문자열로 가정합니다 (ThiefMaster의 응답은이 문제를 다룹니다). 이 점을 감안할 때, 나는 None과 비교할 때 "is not"가 선호 연산자라고 동의합니다. – buckdeer

0

키워드 배치 방법에 유의하십시오. "X이면 Y, 그렇지 않으면 Z". "Y"는 "if"다음에 오는 부분이므로 조건입니다. "X if Y"는 "if Y, X"와 같은 의미를 갖는 완벽하게 유효한 (비록 적지 만) 영어 구조이므로 X는 Y가 충족 될 때 평가되는 표현식입니다. Z는 Y가 만족되지 않을 때 평가되는 표현식입니다.

관련 문제