이번 시간에서는 파이썬 if not 에 대해 알아보려고 합니다.
조건문의 구조는 보통 아래처럼 일반화 됩니다.
if 조건문:
실행문
elif 조건문:
실행문
else:
실행문
여기서 조금 디테일하게 이해할 필요가 있습니다.
if True:
print('참') # True 는 참
else:
print('거짓')
if False:
print('참')
else:
print('거짓') # False 는 거짓
if None:
print('참')
else:
print('거짓') # None 은 거짓
(None 은 False 로 취급됨을 위 코드에서 확인해주세요)
-----------------------------
if 와 not 조건문 을 구분해서 보셔야 합니다.
저도 처음에 같이 결합해서 보다보니 이 부분이 좀 헷갈렸습니다.
"조건문을 만족하면 실행된다" 라고 이해를 했었는데 이러면 " not 때문에 false 일 때 if 문의 실행문이 동작하는구나 " 라고 생각했습니다.
이걸 자연스럽게 이해하는 분도 있을 겁니다. 하지만, 저처럼 잘못이해해서 헷갈려하는 분들도 분명히 있을 거 같아서 정리하는 겁니다. 자, 이제 이걸 응용한 코드를 보겠습니다.
if 'Hello':
print('참') # 문자열은 참
else:
print('거짓')
if '':
print('참')
else:
print('거짓') # 빈 문자열은 거짓
참
거짓
(위 코드에서 0 과 '' 은 False로 취급됨을 확인합시다. )
값 자체가 있으면 if는 동작합니다. 반대로 0, None, ''은 False로 취급하므로 else가 동작합니다.
자, 이제 본 내용에 들어가보죠.
우선, if 문은 "조건문+실행문" 으로 구조화 해서 이해할 필요가 있습니다. if 문이 True 이어야 그 밑에 따린 '실행문'이 작동합니다. 위 코드들을 쭉 보면 else 의 '실행문' 이 작동하려면 조건문의 bool 값이 False 이어야 합니다.
즉, if 문의 실행문은 조건문이 true 일때만 작동합니다. 여기서 우리는 조건문을 bool 값으로 생각해줘야 합니다.
bool(인자)
해주면 true 나 False 를 Return 합니다. 이 관점에서 조건문을 보셔야 하고, if not 에서는 'not +조건문'을 bool 값으로 생각해줘야 합니다.
if not
if not 0:
print('참')
if not None:
print('참')
if not '':
print('참')
참
참
참
자, 위의 if not 코드들은 모두 '참'이 print 됩니다.
아까 if 는 true 여야만 if 밑에 딸린 실행문이 실행됩니다.
not 0
not None
not ''
모두 true 입니다.
"if" 와 "not 조건문" 을 구분해서 보셔야 합니다.
저도 처음에 같이 결합해서 "if not 조건" 으로 보다보니 이 부분이 좀 헷갈렸습니다.
"조건문을 만족하면 실행된다" 라고 이해를 했었는데 이러면 " not 때문에 false 일 때 if 문의 실행문이 동작하는구나 " 와 같은 식으로 생각했는데 이게 좀 애매한 이해입니다.
물론 이걸 자연스럽게 이해하는 분도 있을 겁니다. 하지만, 저처럼 잘못 이해해서 헷갈려하는 분들도 분명히 있을 거 같아서 정리하는 겁니다. 자, 이제 이걸 응용한 코드를 보겠습니다.
def outer_check(type_code):
def type_check(a):
return isinstance(a, type_code) # return bool
def inner_(x,y):
if not type_check(x): # 매개변수가 type_code에 속하지 않으면 실행문(type_code로 타입변환)이 실행된다.
x = type_code(x)
if not type_check(y):
y = type_code(y)
return x+y
return inner_
자, 외부 함수 안에 내부함수를 만들어 보았고 2번째 내부함수 inner_ 에 if not 구문이 들어있습니다.
isinstance 구문은 잘 아실 겁니다. 1번째 인자가 2번째 인자의 instance 이면 true , 아니면 false 입니다. 관계에 대한 참거짓 유무를 bool 값으로return 해주는 기초적인 메소드이죠.
이제 위 함수를 동작시키는 코드를 볼게요.
외부 함수를 인스턴스화 하면 내부 함수가 나와있을테니 inner_ 함수의 매개변수는 2개가 필요하닌 2개 숫자 넣어주면 잘 작동합니다. 여기서 인자 '1.1' 을 한 번 보죠. '1.1' 은 float 타입입니다. type_check 함수에 들어갔을 때 bool 이 나오겠죠? (int 기준입니다.)
if not type_check(1.1)
의 bool값은 뭐죠?
true 입니다. not false = true 당연한거죠?
if not 조건문 에서
not 조건문 = True 이므로 그 밑에 따린 x = type_code(x) 가 작동합니다. 정확히 표현하자면 x = int(1.1) 입니다.
혹시 어? 할당되는건 1.1 아니야? 라고 생각할 수 있을까봐 말하자면 callable 안에 들어간 x,y 와 inner_ 함수 안에서 할당되는 x , y 는 다릅니다. id 로 레퍼런스 찍어보면 다르게 나올겁니다.
그렇다면 if not 조건문 밑에 있는 실행문에서 할당되는 x,y 의 변수명을 다른 기호(a,b, ...등)로 쓰면 어떻게 될까요?
그러면 unboundlocalerror 가 납니다 ㅎㅎ 변수명은 같지만 실제 레퍼런스는 다르게 되는 위와 같은 형태를 써줘야합니다.
한 번 다르게 해서 레퍼런스를 찍어보시면 이해가 더 잘 될겁니다!
이상 if not 이해하기 포스팅을 마치겠습니다 :)
참고
dojang.io/mod/page/view.php?id=1256
'Python_programming > 초중급편' 카테고리의 다른 글
파이썬 '예외 처리' 기본 개념 (0) | 2021.05.15 |
---|---|
python 범위 규칙, 할당, assignment, UnboundLocalError: local variable referenced before assignment (4) | 2020.12.12 |
python 3 부터는 f-string 만 기억하자. (문자열 포매팅) (0) | 2020.12.05 |
파이썬 이터레이터(iterator)와 이터러블(iterable) 차이점 (0) | 2020.04.20 |
파이썬 함수 코드 스타일 PEP20 - 1 (0) | 2020.04.16 |