각종 연산자


 파이썬에서 연산자는 산술 연산자, 관계 연산자, 논리 연산자가 있습니다.


- 산술 연산자

 

 산술 연산자는 사칙 연산자(+,-,*,/)와 나머지(%)연산자, 몫(//) 연산자가 있습니다. 우선순위는 괄호가 가장 높고, 단항 연산자(부호 +,-), 지수 연산자(**), 곱·나누기·나머지·몫 연산자, 덧셈·뺄셈(+,-) 연산자 순입니다. 지수 연산자를 제외한 연산자들은 왼쪽에서 오른쪽으로 연산을 수행합니다. 각 연산자의 사용은 다음과 같습니다.

----------------------------------------------------------------------------------------

a=+5 # 단항 연산자

b=2**3**2 # 지수 연산자

c=3*2+4 # 곱셈 연산자와 덧셈 뺄셈 연산자

d=7%3 # 나머지 연산자

e=7//3 # 몫 연산자


print 'a=+5 :',a

print 'b=2**3**2 :',b

print 'c=3*2+4 : ',c

print 'd=7%3 :',d

print 'e=7//3 :',e

----------------------------------------------------------------------------------------

(실행 결과)

a=+5 : 5

b=2**3**2 : 512 # 오른쪽부터 연산하기때문에 3의 2승인 9가 먼저 계산되고 2의 9승인 512가 출력됩니다.

c=3*2+4 :  10 # 곱셈연산을 먼저 수행한 후 덧셈을 수행합니다.

d=7%3 : 1 # 7나누기3의 나머지인 1을 출력합니다.

e=7//3 : 2 # 7나누기3의 몫인 2가 출력됩니다.

----------------------------------------------------------------------------------------

 이번에는 특별한 경우를 살펴보겠습니다. 아래 코드의 내용은 같아보이지만 실제로는 다른 값이 나옵니다. 그이유를 살펴보겠습니다.
----------------------------------------------------------------------------------------
print -7/3   # 1번
print -(7/3) # 2번
----------------------------------------------------------------------------------------

(실행 결과)

-3
-2
----------------------------------------------------------------------------------------
 위에서 괄호가 가장 우선순위가 된다고 했었습니다. 1번의 경우는 -2.3333의 수가 나오는데 나눗셈 연산은 값보다 작은 정수 중에서 가장 큰수를 반환하기때문에 2.3333보다 작은정수인 -3이 출력되고, 2번의 경우는 7/3은 2.3333이되서 값보다 작은 정수중에서 가장 큰수인 2가 반환되서 -2가 출력되게됩니다.

 또한, 정수/정수는 정수 실수/실수는 실수가 출력됩니다. C언어에서 형넓히기 처럼, 정수/실수 또는 실수/정수는 float타입을 가지게됩니다.
----------------------------------------------------------------------------------------
a2=5/2
b2=5/2.0
c2=5.0/2
print "a2 :",a2
print "b2 :",b2
print "c2 :",c2
print type(a2); print type(b2); print type(c2);
----------------------------------------------------------------------------------------

(실행 결과)

a2 : 2   # 5/2의 값은 2.5지만 정수형이므로 2가 출력됩니다.
b2 : 2.5
c2 : 2.5
<type 'int'>
<type 'float'>
<type 'float'>
----------------------------------------------------------------------------------------

 산술연산자는 우선 순위에 따라서 연산이 수행되지만, 코드의 가독성을 위해 괄호를 사용하는게 좋다고합니다.


- 관계 연산자


 관계 연산자는 객체가 지닌 값의 크기를 비교하여, True 혹은 False를 반환합니다. 연산자의 종류는 값이 같은 지 확인하는 ==, 값이 다른지 확인하는 !=, 대소 연산자(>,<,>=,<=)가 있습니다. 사용형태는 다음과 같습니다.

----------------------------------------------------------------------------------------

a=5

b=10


print 'a==b :',a==b

print 'a!=b :',a!=b

print 'a>b  :',a>b

print 'a<=b :',a<=b

----------------------------------------------------------------------------------------

(실행 결과)

a==b : False

a!=b : True

a>b  : False

a<=b : True

----------------------------------------------------------------------------------------

 한 가지 특이한 점은 파이썬 에서는 관계연산자를 동시에 사용할 수 있습니다. 뒤에나오는 논리연산자인 and 연산자를 사용하지 않고, 동시에 사용이 가능합니다.

----------------------------------------------------------------------------------------

print "0<a and a<b :",0<a and a<b

print "0<a<b :",0<a<b

----------------------------------------------------------------------------------------

(실행 결과)

0<a and a<b : True
0<a<b : True

----------------------------------------------------------------------------------------


 상수 자료형 말고 문자나 리스트, 튜플, 사전 같은 자료형의 비교는 어떤 기준으로 할까요? == 연산자는 동일한 값을 가져야 True가 반환되고, 대소관계 에서는 "사전순서"로 연산을 수행합니다. "사전순서"는 흔히 알고있는 사전을 생각하시면 편합니다.

----------------------------------------------------------------------------------------

s="abcd"

s2="abd"


# 리스트와 튜플은 앞에서부터 값 비교


l=[1,2,3,5]

l2=[1,2,3,6]


t=(1,5,7)

t2=(2,3,5)


d={'f':'F','g':'G'}

d2={'a':'A','d':'D'}


print "s2>s :",s2>s

print "l2>l :",l2>l

print "t2>t :",t2>t

print "d2>d :",d2>d

----------------------------------------------------------------------------------------

(실행 결과)

s2>s : True # 사전에 abcd보다 abd가 뒤에나오기때문에 s2가 더큼

l2>l : True # 사전에 1,2,3,5보다 1,2,3,6이 뒤에 오기때문에 l2가 더큼

t2>t : True # 1보다 2가 크기때문에 t2가 더 큼

d2>d : False # f보다 a가 앞에나오기때문에 False

----------------------------------------------------------------------------------------

 자료형이 다른 두 값을 비교할때는 어떨까요? 숫자<사전<리스트<문자열<튜플의 관계를 가집니다. 관계에 따라서 True/False가 결정됩니다.

----------------------------------------------------------------------------------------

print 'a>b :',a>b
print 'd>c :',d>c

----------------------------------------------------------------------------------------

(실행 결과)
a>b : False
d>c : True

----------------------------------------------------------------------------------------

 추가적으로 sort함수에대해서 간단하게 살펴보겠습니다. sort함수는 정렬을 해주는 함수인데, 위의 관계와 사전순서에 따라서 정렬을 해줍니다. 다음과 같이 리스트 l2가 여러 자료형을 인덱스로 가지고있습니다. sort함수를 사용하면 정렬을 해줍니다.

----------------------------------------------------------------------------------------

l2=['abc',3,(1,2,3),[4,5,6],'zzzz',{1:2}]

print 'before :',l2

l2.sort()

print 'after  :',l2

----------------------------------------------------------------------------------------

(실행 결과)

before : ['abc', 3, (1, 2, 3), [4, 5, 6], 'zzzz', {1: 2}]

after    : [3, {1: 2}, [4, 5, 6], 'abc', 'zzzz', (1, 2, 3)]

----------------------------------------------------------------------------------------


- 논리 연산자


 논리 연산자는 부울 연산자라고도 하며, 관계 연산자 처럼 True, False를 피 연산자 값으로 가지며, 논리 연산자 자체가 값을 반환 하지는 않습니다. 논리 연산으로 최종적으로 평가 되어진 값이 반환됩니다. 논리 연산자의 종류는 and, or, not 세가지가 있습니다. and는 둘다 참일경우 True, or는 둘중 하나라도 참일 경우 True, not은 True와 False를 반전시켜 줍니다. 사용 형태는 다음과 같습니다.

----------------------------------------------------------------------------------------

a=11
b=10
c=15

print a<b and a<c # 
print a<b or a<c
print a<b; print not a<b
----------------------------------------------------------------------------------------
(실행 결과)
False
True
False
True
----------------------------------------------------------------------------------------
 추가적으로, and 연산의 경우 앞의 연산이 거짓이면 뒤의 연산을 수행하지 않으며, or연산은 앞의 연산이 True일경우, 뒤의 연산을 수행하지 않습니다.

 True와 False는 사칙연산자와 만날경우 True는 1 False는 0의 값을 가집니다.
----------------------------------------------------------------------------------------
a=11
b=10
c=15

print (a<c)+5
print (a<b)+3
----------------------------------------------------------------------------------------
(실행 결과)
6
3
----------------------------------------------------------------------------------------

 마지막으로 bool() 내장 함수에 대해 알아보겠습니다. bool()함수는 수치값을 진리값으로 변환해줍니다. 정수 0, 실수0.0, 비어있는 문자열 '',""과 None 객체는 False가 됩니다.
----------------------------------------------------------------------------------------
print bool(0)
print bool(0.0)
print bool('')
print bool(None)
# 리스트, 튜플, 사전 역시 비어있는 자료형은 거짓이 됩니다.
print bool([])
print bool(())
print bool({})
----------------------------------------------------------------------------------------
(실행 결과)
False
False
False
False
False
False
False
----------------------------------------------------------------------------------------

 마지막으로, 논리 연산자를 이용해 연산을 해보겠습니다.
----------------------------------------------------------------------------------------
print [] or 1
print () and 1
print 1 and []
print ([]) or 1 # [[]] : 공리스트를 가지는 리스트는 참

----------------------------------------------------------------------------------------

(실행 결과)
1 # 앞은 거짓이지만 뒤의 정수가 참이므로 1 출력
() # 앞이 공튜플(거짓)이므로 뒤를 연산하지않고 거짓인 공튜플 출력
[] # 앞의 정수가 참이고, 뒤의 리스트가 공리스트(거짓)이므로, 거짓인 [] 출력
1 # 앞의 리스트가 참이고, 뒤의 1도 참이므로 1출력

----------------------------------------------------------------------------------------


출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍




+ Recent posts