10. Python에서 제공하는 연산자

안녕하세요. 언휴예요.

이번에는 Python에서 제공하는 연산자들을 간략하게 살펴볼게요.

Python에서 제공하는 연산자 종류에는 산술, 비교, 대입, 논리, 비트, 멤버쉽, 참조 비교 연산자가 있어요. 여기에서는 간략하게 연산 기호와 예제를 보여줄게요.

  • 산술 연산자 (+, -, *, /, %, **, //)

+, -, *, /는 사칙 연산에 사용합니다. %는 나머지를 구할 때 사용하여 나머지 연산자라고 부릅니다. **는 지수 연산을 수행합니다. //는 Floor Division으로 소수점 이하 자릿수를 제거한 몫을 구하는 연산입니다. 예제 코드와 결과를 살펴보세요.

#산술 연산자
a=12.34
b=2.1

print("a:{0}, b:{1}".format(a,b))
print("a+b=",a+b)
print("a-b=",a-b)
print("a*b=",a*b)
print("a/b= {0:.3f}".format(a/b))

print("{0}/{1}의 나머지:{2}".format(14,2,14%2))
print("{0}의 {1}승={2}".format(3,7,3**7))

print("===Floor Division===")
print("{0}//{1}=>{2}".format(10,3,10//3))
print("{0}//{1}=>{2}".format(10.8123,3.1,10.8123//3.1))
[그림 1] 산술 연산자
[그림 1] 산술 연산자

 0에서 1 사이에 실수는 셀 수가 없죠. 이러한 이유로 실수 계산에서 오차는 발생할 수 있어요.

특히 당혹스러운 것은 10진수에 익숙한 우리에게 0.1+0.2의 계산 결과가 0.3이 아니라는 것은 이해하기 힘들 수도 있어요.

 print(0.1+0.2) 의 결과는?

한 번 10진수 0.1을 이진수로 표현해 보시면 왜 오차가 발생하는지 이해할 수 있을 거예요. 그리고 난 후에 다음 글을 보시길 바랍니다.

실수 형식의 메모리 구조

  • 비교 연산자(==, !=, >, <, >=, <=)

비교 연산자는 같음(==), 다름(!=), 크다(>), 작다(<), 크거나 같다(>=), 작거나 같다(<=)가 있습니다. ==, !=, >=, <=는 하나의 연산자이므로 사이에 공백이 올 수 없어요.

#비교 연산자
a=10
b=7
c=10
print("{0}=={1}=>".format(a,b),a==b)
print("{0}=={1}=>".format(a,c),a==c)
print("{0}!={1}=>".format(a,b),a!=b)
print("{0}!={1}=>".format(a,c),a!=c)
print("{0}>{1}=>".format(a,b),a>b)
print("{0}>{1}=>".format(a,c),a>c)
print("{0}>={1}=>".format(a,b),a>=b)
print("{0}>={1}=>".format(a,c),a>=c)
print("{0}<{1}=>".format(a,b),a<b)
print("{0}<{1}=>".format(a,c),a<c)
print("{0}<={1}=>".format(a,b),a<=b)
print("{0}<={1}=>".format(a,c),a<=c)
[그림 2] 비교 연산자
[그림 2] 비교 연산자
  • 대입 연산자(=, +=, -=, *=, /=, %=, **= //=)

대입 연산자는 좌항 표현으로 관리하는 메모리를 우항의 값으로 배정하는 연산자입니다. a+=b 는 a= a+b와 같은 표현이며 a-=b는 a=a-b와 같은 표현입니다. 이 외에도 같은 원리입니다.

#대입연산자

a=2
print("a:",a)

a+=3
print("a+=3 , a:",a)

a-=1
print("a-=1 , a:",a)

a*=3
print("a*=3 , a:",a)

a/=2
print("a/=2 , a:",a)

a%=4
print("a%=4 , a:",a)

a**=3
print("a**=3 , a:",a)

a//=2
print("a//=2 , a:",a)
[그림 3] 대입 연산자
[그림 3] 대입 연산자
  • 비트 연산자 (&, |, ^, ~, <<, >>)

비트 연산자는 비트 단위로 연산을 수행하며 비트 논리곱(&), 비트 논리합(|), 비트 상호배제(^), 비트 부정(~), 왼쪽 쉬프트(<<), 오른쪽 쉬프트(>>)가 있습니다.

비트 논리곱은 같은 자리가 모두 1일 때 해당 자리의 연산 결과가 1이며 그렇지 않을 때 0입니다. 예를 들어 a가 6이고 b가 3일 때 a&b는 2입니다. (110 & 011 => 010)

비트 논리합은 같은 자리에 하나라도 1이면 해당 자리의 연산 결과가 1이며 둘 다 0일 때만 0입니다. 예를 들어 a가 6이고 b가 3일 때 a|b는 7입니다.(110 | 011 => 111)

비트 상호배제는 같은 자리의 값이 서로 다르면 해당 자리의 연산 결과가 1이며 같을 때 0입니다. 예를 들어 a가 6이고 b가 3일 때 a^b는 5입니다.(110^011 => 101)

비트 부정은 0인 자리는 1로 1인 자리는 0으로 변환합니다.

왼쪽 쉬프트는 지정한 비트 수만큼 왼쪽으로 자리 이동하며 1자리 이동하면 2를 곱한 결과와 같습니다. 오른쪽 쉬프트는 지정한 비트 수만큼 오른쪽으로 자리 이동하며 1자리 이동하면 2로 나눈 결과와 같습니다.

#비트 연산자
a=6
b=3
print("{0}&{1} => {2}".format(a,b,a&b))
print("{0}|{1} => {2}".format(a,b,a|b))
print("{0}^{1} => {2}".format(a,b,a^b))
print("~{0} => {1}".format(a,~a))
print("{0}<<{1} ==> {2}".format(a,3,a<<3))
print("{0}>>{1} ==> {2}".format(a,1,a>>1))
[그림 4] 비트 연산자
[그림 4] 비트 연산자
  • 논리 연산자(and, or, not)

논리 연산자는 둘 다 참일 때 연산 결과가 참인 and, 하나라도 참일 때 연산 결과가 참인 or, 참이면 결과가 거짓이고 거짓일 때 결과가 참인 not이 있습니다.

#논리 연산자
print("True and True:",True and True)
print("True and False:",True and False)
print("False and True:",False and True)
print("False and False:",False and False)

print("True or True:",True or True)
print("True or False:",True or False)
print("False or True:",False or True)
print("False or False:",False or False)

print("not True :", not True)
print("not False :", not False)
[그림 5] 논리 연산자
[그림 5] 논리 연산자
  • 멤버쉽 연산자(in, not in)

Python에는 여러 개의 자료를 보관하는 컬렉션을 제공하고 있습니다. 그리고 멤버쉽 연산자는 특정 자료가 해당 컬렉션에 속하는지(in) 혹은 속하지 않는지(not in) 판별하는 연산자입니다. 컬렉션에 관한 사항은 별도로 다룰 거예요.

#멤버쉽 연산자

fruits =["사과","배","복숭아"]
print("사과"in fruits)
print("딸기"in fruits)
print("사과"not in fruits)
print("딸기"not in fruits)

멤버쉽 연산자

  • 참조 비교 연산자(is, is not)

Python에서 참조 비교 연산자에는 같다(is)와 같지 않다(is not)이 있습니다. 비교 연산자의 같다(==)와 같지 않다(!=)는 값이 같은지 판별하는 연산자입니다. 반면 참조 비교 연산자는 같은 메모리를 참조하는지 판별하는 연산자입니다. 정수나 실수 등의 값을 기억하는 형식에서는 비교 연산자와 참조 비교 연산자는 차이가 없습니다. 하지만 클래스처럼 참조 형식에서는 서로 다른 개체가 같은 값을 갖고 있을 때 차이가 발생합니다.

#참조 비교 연산자
a=10 #값 형식
b=10
c=20
print("a:{0}, b:{1}, c:{2}".format(a,b,c))

print("a == b :",a == b)
print("a is b :",a is b)

print("a == c :",a == c)
print("a is c :",a is c)

d=3+2j #참조 형식
e=3+2j
f=4+2j
print("d == e :",d == e)
print("d is e :",d is e)

print("d == f :",d == f)
print("d is f :",d is f)
[그림 7] 참조 비교 연산자
[그림 7] 참조 비교 연산자

 참조 비교 연산자 실행 결과가  [그림 7]과 같나요?

 만약 print(“d is e :”,d is e) 결과가 True로 나온신다면 여러분이 가지고 있는 Python에서 복소수는 값 형식으로 표현하고 있을 거예요. 

 이 때는 다음과 같은 코드로 확인하면 참조 형식에서의 is 연산의 의미를 알 수 있을 거예요.