# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# ***
# ***
# # 5. 파이썬의 각종 연산자
# ***
# ***

# ***
# ## 1 산술 연산자
# ***

# | 연산자 |    우선순위  | 설명   | 결합순서 |
# |:------:|:------:|:-----------------:|:-----------:|
# | +, -     |    1   |   단항 연산자        |  -  | 
# |  **      |    2   |지수 연산자        | 왼쪽 <- 오른쪽 | 
# | *,/,%,// |    3    |곱하기,나누기,나머지,몫 | 왼쪽 -> 오른쪽 | 
# | +, -     |    4    |더하기,빼기           |   왼쪽 -> 오른쪽  |

print(2 ** 3)
print(5 % 2)
print(-5 % 2)

-5 / 2

print(3 + 5)
print(3 + 5.0)   # 정수 + 실수의 결과는 실수

# +
a = 5 / 2.0
b = 5 / 2
print(a)   # 정수 / 실수의 결과
print(b)   # 정수 / 정수의 결과 <-- python 3 부터는 /의 결과는 언제나 실수

print(type(a), type(b))

# +
a = 5 / 3
b = 5 % 3

print(a, b)
print(divmod(5,3))
# 1 2
# (1, 2)
# -

print(5 // 3)     # Floor Division
print(5 // 3.0)   # Floor Division - Floor Division은 '정수 // 정수'와 '정수 // 실수'의 결과 다름 

# - 단항 연산자(-)의 우선순위가 이항 연산자(/)의 우선순위보다 높다

print(-7/4)  # -7을 4로 나눈다
print(-(7/4))

print(2 + 3 * 4)
print((2 + 3) * 4)

print(4 / 2 * 2)

# - ** 연산자의 결합순서는 오른쪽에서 왼쪽

print(2 ** 3 ** 2)
print((2 ** 3) ** 2)

# ***
# ## 2 관계 연산자
# ***

# - 관계 연산자: 객체가 지닌 값의 크기(대소)를 비교하여 True 또는 False를 반환함

# +
print(6 == 9)
print(6 != 9)
print(1 > 3)
print(4 <= 5)

a = 5
b = 10
print(a < b)
# -

a = 5
b = 10
print(0 < a < b)

a = 5
b = 10
print(0 < a and a < b)

# - 문자열, 튜플, 리스트의 관계 연산 비교는 일반 사전 순서 

print('abcd' > 'abd')       
print((1, 2, 4) < (2, 1, 0))     
print([1, 3, 2] < [1, 2, 3])

# - 사전에 대해서는 대소관계 평가하는 관계연산 불가

print({0:0, 1:1} > {2:2, 3:3})

# - 사전에 대해 내용이 동일한지 알아보는 관계연산자는 수행가능함

print({0:0, 1:1} == {2:2, 3:3})
print({0:0, 1:1} == {0:0, 1:1})

# - 서로 다른 자료형간의 크기 관계 비교
#   - Python 3 버전에서는 지원하지 않음

print(9999999999999999999999 < 'abc')

print({3:2} < [1,2,3] < (1,2,3))

L = [1,2,3, 'abc', 'a', 'z', (1,2,3), [1,2,3], {1:2}, ['abc']]
L.sort()
print(L)
# [1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]

# +
x = [1,2,3]
y = [1,2,3]
z = y

print(x == y)
print(x == z)
print(x is y)
print(x is z)
print(y is z)
# -

# ![image](../images/objectIdentity.png)

# - [문제] 아래 예제를 통하여 위 그림의 오류를 지적하시오

print(x[0] == y[0])
print(x[0] is y[0])

# ***
# ## 3 논리 연산자 (or 부울 연산자)
# ***

# - 피연산자의 값으로 진리값인 True 또는 False을 취하여 논리 적인 계산을 수행하는 연산자
#   - and
#   - or
#   - not
# - [주의] 논리 연산자 자체가 값을 반환하지는 않는다. 
#   - 대신, 논리 연산을 따라 최종적으로 평가(Evaluation)되어진 값이 반환된다.

a = 20
b = 30
print(a > 10 and b < 50)
print(a > 10 or b < 50)

# - 진리값에 해당하는 True와 False는 다른 사칙연산자를 만나면 다음과 같이 평가됨
#   - True: 1
#   - False: 0

print(True + 1)
print(False + 1)
print(False * 75)
print(True * 75)

# - bool() 내장 함수를 이용해서 수치 값을 진리 값으로 교환 가능

print(bool(0)) # 정수 0은 거짓
print(bool(1))
print(bool(100))
print(bool(-100))
print()
print(bool(0.0)) # 실수 0.0은 거짓
print(bool(0.1))
print(bool(0.00000000000000000000000000000000000000000001))

# - 값이 없는 빈 객체나 None 객체는 False로 평가됨

print(bool('abc'))
print(bool('')) # 빈 문자열은 거짓 
print()
print(bool([])) # 공 리스트는 거짓
print(bool([1,2,3]))
print()
print(bool(())) # 공 튜플은 거짓
print(bool((1,2,3)))
print()
print(bool({})) # 공 사전은 거짓
print(bool({1:2}))
print()
print(bool(None)) # None 객체는 거짓

# +
print(1 and 2)
print(1 and 0)
print()

print(0 or 2)
print(1 or 0)
print()

print([] or 1)  # [] 거짓
print([] or ()) # [], () 거짓
print([] and 1) # [] 거짓이므로 1은 참조할 필요 없음
# -

print([[]] or 1) # [[]] 참으로 간주
print([{}] or 1) # [{}] 참으로 간주
print('' or 1)   # 빈 문자열('')은 거짓

print(not(True))
print(not(1 and 2))
print(not('' or 1))

# ***
# ## [참고] 연산자 우선 순위 표
# ***

# - 연산자 우선 순위 표: https://wikidocs.net/1165
# - 실제 코드 개발을 할 때에는 연산자 우선 순위에 많은 의존 없이 괄호(())를 적절하게 사용하여 코드의 가독성을 높이는 것이 좋다.

# <p style='text-align: right;'>참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일</p>

StarcoderdataJupyterScriptsDedupFiltered