5. 파이썬의 각종 연산자




1 산술 연산자


연산자 우선순위 설명 결합순서
+, - 1 단항 연산자 -
** 2 지수 연산자 왼쪽 <- 오른쪽
*,/,%,// 3 곱하기,나누기,나머지,몫 왼쪽 -> 오른쪽
+, - 4 더하기,빼기 왼쪽 -> 오른쪽
In [1]:
print(2 ** 3)
print(5 % 2)
print(-5 % 2)
8
1
1
In [2]:
print(3 + 5)
print(3 + 5.0)   # 정수 + 실수의 결과는 실수
8
8.0
In [3]:
a = 5 / 2.0
b = 5 / 2
print(a)   # 정수 / 실수의 결과
print(b)   # 정수 / 정수의 결과 <-- python 3 부터는 /의 결과는 언제나 실수

print(type(a), type(b))
2.5
2.5
<class 'float'> <class 'float'>
In [4]:
a = 5 / 3
b = 5 % 3

print(a, b)
print(divmod(5,3))
# 1 2
# (1, 2)
1.6666666666666667 2
(1, 2)
In [1]:
print(5 // 3)     # Floor Division
print(5 // 3.0)   # Floor Division - Floor Division은 '정수 // 정수'와 '정수 // 실수'의 결과 다름 
1
1.0
  • 단항 연산자(-)의 우선순위가 이항 연산자(/)의 우선순위보다 높다
In [6]:
print(-7/4)  # -7을 4로 나눈다
print(-(7/4))
-1.75
-1.75
In [7]:
print(2 + 3 * 4)
print((2 + 3) * 4)
14
20
In [8]:
print(4 / 2 * 2)
4.0
  • ** 연산자의 결합순서는 오른쪽에서 왼쪽
In [9]:
print(2 ** 3 ** 2)
print((2 ** 3) ** 2)
512
64

2 관계 연산자


  • 관계 연산자: 객체가 지닌 값의 크기(대소)를 비교하여 True 또는 False를 반환함
In [10]:
print(6 == 9)
print(6 != 9)
print(1 > 3)
print(4 <= 5)

a = 5
b = 10
print(a < b)
False
True
False
True
True
In [11]:
a = 5
b = 10
print(0 < a < b)
True
In [12]:
a = 5
b = 10
print(0 < a and a < b)
True
  • 문자열, 튜플, 리스트의 관계 연산 비교는 일반 사전 순서
In [20]:
print('abcd' > 'abd')       
print((1, 2, 4) < (2, 1, 0))     
print([1, 3, 2] < [1, 2, 3])
False
True
False
  • 사전에 대해서는 대소관계 평가하는 관계연산 불가
In [21]:
print({0:0, 1:1} > {2:2, 3:3})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-6c72580154ad> in <module>()
----> 1 print({0:0, 1:1} > {2:2, 3:3})

TypeError: '>' not supported between instances of 'dict' and 'dict'
  • 사전에 대해 내용이 동일한지 알아보는 관계연산자는 수행가능함
In [22]:
print({0:0, 1:1} == {2:2, 3:3})
print({0:0, 1:1} == {0:0, 1:1})
False
True
  • 서로 다른 자료형간의 크기 관계 비교
    • Python 3 버전에서는 지원하지 않음
In [24]:
print(9999999999999999999999 < 'abc')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-1ad077f7dbdc> in <module>()
----> 1 print(9999999999999999999999 < 'abc')

TypeError: '<' not supported between instances of 'int' and 'str'
In [25]:
print({3:2} < [1,2,3] < (1,2,3))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-b7a2598f4f7e> in <module>()
----> 1 print({3:2} < [1,2,3] < (1,2,3))

TypeError: '<' not supported between instances of 'dict' and 'list'
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)]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-d35459624c4c> in <module>()
      1 L = [1,2,3, 'abc', 'a', 'z', (1,2,3), [1,2,3], {1:2}, ['abc']]
----> 2 L.sort()
      3 print(L)
      4 # [1, 2, 3, {1: 2}, [1, 2, 3], ['abc'], 'a', 'abc', 'z', (1, 2, 3)]

TypeError: '<' not supported between instances of 'str' and 'int'
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)
True
True
False
False
True

image

  • [문제] 아래 예제를 통하여 위 그림의 오류를 지적하시오
In [29]:
print(x[0] == y[0])
print(x[0] is y[0])
True
True

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
True
  • 진리값에 해당하는 True와 False는 다른 사칙연산자를 만나면 다음과 같이 평가됨
    • True: 1
    • False: 0
In [26]:
print(True + 1)
print(False + 1)
print(False * 75)
print(True * 75)
2
1
0
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))
False
True
True
True

False
True
True
  • 값이 없는 빈 객체나 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 객체는 거짓
True
False

False
True

False
True

False
True

False
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은 참조할 필요 없음
2
0

2
1

1
()
[]
In [38]:
print([[]] or 1) # [[]] 참으로 간주
print([{}] or 1) # [{}] 참으로 간주
print('' or 1)   # 빈 문자열('')은 거짓
[[]]
[{}]
1
In [31]:
print(not(True))
print(not(1 and 2))
print(not('' or 1))
False
False
False

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


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

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