타언어에서 &&, ||로 표현 되는 and, or 연산자에 대해서 알아보겠습니다.
연산자 우선순위는 and > or 로 되어 있지만 (곱셈, 나눗셈), (덧셈, 뺄셈)처럼 연산하는 순서가 바뀌어도 결과값은 같에 나옵니다.
and, or과 비트연산자 &, | 의 다른점
and, or은 논리값을 반환, &, |은 연산의 결과를 나타냅니다.
x > 5 and x < 10과 (x > 5) & (x < 10)은 같은 조건문에서 같은 결과를 나타내기 때문이 착각할수 있지만 하는 행위가 다름을 알아두셔야 합니다.
# and or 과 비트연산자 & | 의 다른점
x = 7
print(x > 5 and x < 10)
print((x > 5) & (x < 10))
print(4 and 10)
print(4 & 10)
x > 5, x < 10 모두 True를 반환하기 때문에 and를 사용하든 &을 사용하든 같은 값이 나옵니다.
하지만 단순한 숫자를 대상으로 and와 &을 사용하면 어떨까요?
4 and 10을 했는데 10이라는 결과를 던져줍니다. 왜일까요?
and와 or은 식을 평가함에서 마지막으로 평가한 값을 return 해줍니다.
자세한 내용인 단락평가에 대해서는 아래에 적도록하겠습니다.
4 and 10에서 True가 나오고 식을 더 이상 평가할게 없습니다. 그러므로 10을 던져주는것인데, 뭔가 이해하기 어렵습니다. 예시를 하나더 봐볼까요?
print(4 and 10 or 20)
print(4 and 10 and 20)
위에꺼는 10인데 왜 아래꺼는 20일까요?
바로 단락평가로 인해 4 and 10이 True인것까지 평가하였을때 뒤 부분의 or 20에 무슨값이 오든지 간에 항상 True이기 때문입니다. or 0이 온다고 한들 결과값은 항상 True일것입니다. 따라서 마지막 평가값인 10을 반환해줍니다.
하지만 뒤에 and 20이 오는 경우 20이 마지막 평가값이 되기 때문에 20을 반환해주는 것입니다.
그럼 되돌아 와서 4 & 10은 0이 나왔는데요. &의 정확한 역할을 바로 비트연산을 하는것입니다.
4와 10을 2진수로 표현하면 100(2), 1010(2)인데, &연산을 할 경우 겹치는 비트가 없기 때문에 0이라는 값이 나온거죠.
그럼 (x > 5) & (x < 10)은 왜 같은 값이 나왔을까요? 바로 1 & 1 = 1 이기 때문에 조건문에 한하여 and와 &가 같은 기능을 하는것이라고 착각하게 되는것입니다.
컴퓨터가 False로 인식하는 것들
조건문에서 False로 인식하는것은 무엇이 있을까요?
- "" # 빈 문자열
- None # 아무것도 없는 빈값
- 0 # 숫자 0
- [] # 비어있는 리스트, 딕셔너리, 튜플
- {}
- ()
바로 비어있거나 값이 정의되어 있지 않는 값들을 False로 인식한답니다.
반대로 생각하면 이러한 값들이 아닌것들은 전부 True로 인식한다는 애기죠
True, False는 무슨값일까?
그럼 우리가 사용하는 True, False는 무슨 값을 갖고 있을까요?
타 언어에서는 True=1, False=0이라는 값을 가지고 있습니다.
만약 강제 형변환을 할 경우 어떤값을 뱉을까요?
# True, False는 무슨값일까?
print(int(True))
print(int(False))
print(str(True))
print(str(False))
print(True.__str__())
if str(False):
print("False Str -> True")
print(True + True)
먼저 int로 변환할 경우 타언어와 같이 1, 0이 출력됨을 알 수 있습니다.
그런데 str로 변환할 경우 "True", "False"가 출력되네요?
이는 True, False가 하나의 객체이기 때문인데, __str__() 메소드에 str로 변환할때 "True", "False"를 반환해줘~ 라고 정의되어 있기 때문에 이렇게 값이 나오는 것입니다.
그럼 str(False)는 False와 같은 작동을 할까요?
답은 No! "False"는 비어있는문자열 ""가 아니기 때문에 True로 판정됩니다.
연산의 경우 숫자값인 1, 0으로 판정되어 True+True=2를 출력하는것을 볼 수 있습니다.
문자열에서 and, or 반환
앞서서 and, or은 마지막 평가값을 반환한다고 하였는데요. 문자열은 어떨까요?
# 문자열 반환
print("python" and "")
print("python" or "")
print("" or "python")
빈값과 python이 두번 출력된걸 볼 수 있는데요.
첫번째의 경우 마지막 평가값이 ""
두번째의 경우 마지막 평가값이 "python"
세번째의 경우 마지막 평가값이 "python"임을 알 수 있습니다( ""은 false이기 때문에 or 뒤에꺼가 마지막 평가값)
만약 if문에서 평가를 받게 된다면 첫번째줄은 false, 두번째, 세번째줄은 true를 반환하게되는거죠
단락평가
단락 평가란? 차례로 평가를 진행 했을때 더 이상 평가를 진행할 필요가 없는경우, 해당 부분까지만 진행하는 것을 말합니다.
예를 들어 1 or ~~ 이라는 구문이 있는 경우 맨앞에값이 True이므로 뒤에 무슨값이 오더라도 True값이 될것입니다.
0 and ~~~ 이라는 구문은 어떨까요? 맨앞에값이 False이므로 뒤에 무슨값이 오더라도 False값이 될것입니다. 이 경우 0을 반환하게 되겠죠?
# 단락 평가
print(1 and 0 or 2 and 3)
print(1 and 2 or 0 and 3)
print(0 and 2 or 0 and 3)
print(0 or 1 or 0 and 2)
위 코드에서 단락평가를 하게 될 경우 어떤값이 마지막 평가값이 될까요??
직접 풀어보고 코드를 실행해서 확인해보세요~
'Coding Challenge > 오늘의 코드' 카테고리의 다른 글
html canvas로 별찍기 (0) | 2020.09.21 |
---|---|
파이썬 문자열(str)을 이용해 변수(variable)값 출력하기 (0) | 2020.09.13 |
pyqt 창끼리 데이터 전달 (1) | 2020.09.12 |
판다스로 여러개의 csv파일 수정하기 (0) | 2020.09.10 |