#!/usr/bin/env python # coding: utf-8 # *** # *** # # 5. 파이썬의 각종 연산자 # *** # *** # *** # ## 1 산술 연산자 # *** # | 연산자 | 우선순위 | 설명 | 결합순서 | # |:------:|:------:|:-----------------:|:-----------:| # | +, - | 1 | 단항 연산자 | - | # | ** | 2 |지수 연산자 | 왼쪽 <- 오른쪽 | # | *,/,%,// | 3 |곱하기,나누기,나머지,몫 | 왼쪽 -> 오른쪽 | # | +, - | 4 |더하기,빼기 | 왼쪽 -> 오른쪽 | # In[1]: print(2 ** 3) print(5 % 2) print(-5 % 2) # In[2]: print(3 + 5) print(3 + 5.0) # 정수 + 실수의 결과는 실수 # In[3]: a = 5 / 2.0 b = 5 / 2 print(a) # 정수 / 실수의 결과 print(b) # 정수 / 정수의 결과 <-- python 3 부터는 /의 결과는 언제나 실수 print(type(a), type(b)) # In[4]: a = 5 / 3 b = 5 % 3 print(a, b) print(divmod(5,3)) # 1 2 # (1, 2) # In[1]: print(5 // 3) # Floor Division print(5 // 3.0) # Floor Division - Floor Division은 '정수 // 정수'와 '정수 // 실수'의 결과 다름 # - 단항 연산자(-)의 우선순위가 이항 연산자(/)의 우선순위보다 높다 # In[6]: print(-7/4) # -7을 4로 나눈다 print(-(7/4)) # In[7]: print(2 + 3 * 4) print((2 + 3) * 4) # In[8]: print(4 / 2 * 2) # - ** 연산자의 결합순서는 오른쪽에서 왼쪽 # In[9]: print(2 ** 3 ** 2) print((2 ** 3) ** 2) # *** # ## 2 관계 연산자 # *** # - 관계 연산자: 객체가 지닌 값의 크기(대소)를 비교하여 True 또는 False를 반환함 # In[10]: print(6 == 9) print(6 != 9) print(1 > 3) print(4 <= 5) a = 5 b = 10 print(a < b) # In[11]: a = 5 b = 10 print(0 < a < b) # In[12]: a = 5 b = 10 print(0 < a and a < b) # - 문자열, 튜플, 리스트의 관계 연산 비교는 일반 사전 순서 # In[20]: print('abcd' > 'abd') print((1, 2, 4) < (2, 1, 0)) print([1, 3, 2] < [1, 2, 3]) # - 사전에 대해서는 대소관계 평가하는 관계연산 불가 # In[21]: print({0:0, 1:1} > {2:2, 3:3}) # - 사전에 대해 내용이 동일한지 알아보는 관계연산자는 수행가능함 # In[22]: print({0:0, 1:1} == {2:2, 3:3}) print({0:0, 1:1} == {0:0, 1:1}) # - 서로 다른 자료형간의 크기 관계 비교 # - Python 3 버전에서는 지원하지 않음 # In[24]: print(9999999999999999999999 < 'abc') # In[25]: print({3:2} < [1,2,3] < (1,2,3)) # In[26]: 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)] # In[27]: 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) # - [문제] 아래 예제를 통하여 위 그림의 오류를 지적하시오 # In[29]: print(x[0] == y[0]) print(x[0] is y[0]) # *** # ## 3 논리 연산자 (or 부울 연산자) # *** # - 피연산자의 값으로 진리값인 True 또는 False을 취하여 논리 적인 계산을 수행하는 연산자 # - and # - or # - not # - [주의] 논리 연산자 자체가 값을 반환하지는 않는다. # - 대신, 논리 연산을 따라 최종적으로 평가(Evaluation)되어진 값이 반환된다. # In[32]: a = 20 b = 30 print(a > 10 and b < 50) print(a > 10 or b < 50) # - 진리값에 해당하는 True와 False는 다른 사칙연산자를 만나면 다음과 같이 평가됨 # - True: 1 # - False: 0 # In[26]: print(True + 1) print(False + 1) print(False * 75) print(True * 75) # - bool() 내장 함수를 이용해서 수치 값을 진리 값으로 교환 가능 # In[34]: 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로 평가됨 # In[28]: 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 객체는 거짓 # In[37]: 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은 참조할 필요 없음 # In[38]: print([[]] or 1) # [[]] 참으로 간주 print([{}] or 1) # [{}] 참으로 간주 print('' or 1) # 빈 문자열('')은 거짓 # In[31]: print(not(True)) print(not(1 and 2)) print(not('' or 1)) # *** # ## [참고] 연산자 우선 순위 표 # *** # - 연산자 우선 순위 표: https://wikidocs.net/1165 # - 실제 코드 개발을 할 때에는 연산자 우선 순위에 많은 의존 없이 괄호(())를 적절하게 사용하여 코드의 가독성을 높이는 것이 좋다. #

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일