연산자와 식

여러분이 앞으로 작성하게 될 모든 명령문 (논리적 명령행)은 을 포함하게 될 것입니다. 아주 간단한 식의 한 예는 2 + 3 입니다. 식은 연산자와 피연산자로 나눌 수 있습니다.

연산자란 무언가를 계산할 때 쓰이는 한 기능을 뜻하며, +와 같이 기호로 나타내어지거나 또는 특별한 키워드로 나타내어집니다. 또 연산자는 계산에 사용될 데이터를 필요로 하는데, 이들을 피연산자라고 부릅니다. 이 경우, 피연산자는 23이 됩니다.

연산자

이제 연산자의 사용법에 대해 알아보도록 하겠습니다.

파이썬 인터프리터 프롬프트 상에서도 식을 계산할 수 있습니다. 다음과 같이 파이썬 인터프리터 프롬프트 상에서 2 + 3이라는 식을 입력해 봅시다.

>>> 2 + 3
5
>>> 3 * 5
15
>>>

이제 파이썬에서 사용 가능한 연산자들의 종류에 대해 간단히 알아봅시다.

  • + (덧셈 연산자)

    • 두 객체를 더합니다.

    • 3 + 58을 반환합니다. 'a' + 'b''ab'를 반환합니다.

  • - (뺄셈 연산자)

    • 한 숫자에서 다른 숫자를 뺍니다. 첫 번째 피연산자가 주어지지 않으면, 0으로 간주됩니다.

    • -5.2는 음수를 표현합니다. 50 - 2426을 반환합니다.

  • * (곱셈 연산자)

    • 두 숫자의 곱 혹은 지정된 숫자만큼 반복된 문자열을 반환합니다.

    • 2 * 36을 반환합니다. 'la' * 3'lalala'를 반환합니다.

  • ** (거듭제곱 연산자)

    • x 의 y제곱을 반환합니다.

    • 3 ** 481을 반환합니다 (이 값은 3 * 3 * 3 * 3과 같습니다).

  • / (나눗셈 연산자)

    • x를 y로 나눈 몫을 반환합니다.

    • 13 / 34.333333333333333를 반환합니다.

  • // (정수 나눗셈 연산자)

    • x를 y로 나눈 몫의 소숫점을 내림해서 가장 가까운 정수를 반환합니다. 계산식에 실수가 하나 이상 포함되면 실수로 반환됩니다.

    • 13 // 34를 반환합니다.

    • -13 // 3-5를 반환합니다.

    • 9//1.814.0를 반환합니다.

  • % (나머지 연산자)

    • x를 y로 나눈 나머지를 반환합니다.

    • 13 % 31을 반환합니다. -25.5 % 2.251.5를 반환합니다.

  • << (왼쪽 시프트 연산자)

    • 지정된 숫자에 대해 지정된 비트 수 만큼 오른쪽 시프트 연산합니다.(각각의 수는 메모리에서 비트나 0과 1과 같은 이진수에 해당됩니다.)

    • 2 << 28을 반환합니다. 2는 이진수 10으로 표현됩니다.

    • 이것을 왼쪽으로 2비트 시프트 연산하면 이진수 1000이 되고, 이것을 정수로 표현하면 8이 됩니다.

  • >> (오른쪽 시프트 연산자)

    • 지정된 숫자에 대해 지정된 비트 수 만큼 오른쪽 시프트 연산합니다.

    • 11 >> 15를 반환합니다.

    • 11은 이진수 1011로 표현됩니다. 이것으로 오른쪽으로 1비트 시프트 연산하면 이진수 101이 되고, 이것을 정수로 표현하면 5가 됩니다.

  • & (비트 AND 연산자)

    • 비트 AND 연산값을 반환합니다.

    • 5 & 31을 반환합니다.

  • | (비트 OR 연산자)

    • 비트 OR 연산값을 반환합니다.

    • 5 | 37을 반환합니다.

  • ^ (비트 XOR 연산자)

    • 비트 XOR 연산값을 반환합니다.

    • 5 ^ 36을 반환합니다.

  • ~ (비트 반전 연산자)

    • 숫자 x의 비트 반전 연산값 -(x+1)을 반환합니다.

    • ~5-6을 반환합니다. 자세한 사항은 http://stackoverflow.com/a/11810203 을 읽어 보시기 바랍니다.

  • < (작음)

    • x가 y보다 작은지 여부를 반환합니다. 모든 비교 연산자는 True또는 False을 반환합니다. 각 반환값의 첫글자는 대문자라는 점에 유의하세요.

    • 5 < 3False를 반환합니다. 3 < 5True를 반환합니다.

    • 다음과 같이 여러 숫자에 대해 한꺼번에 비교 연산을 수행할 수 있습니다. 3 < 5 < 7True를 반환합니다.

  • > (큼)

    • x가 y보다 큰지 여부를 반환합니다.

    • 5 > 3True를 반환합니다. 만약 두 피연산자가 모두 숫자라면, 같은 숫자형으로 변환된 후 크기를 비교합니다. 피연산자가 숫자형이 아닐 경우, 항상 False를 반환합니다.

  • <= (작거나 같음)

    • x가 y보다 작거나 같은지 여부를 반환합니다.

    • x = 3; y = 6; x <= yTrue를 반환합니다.

  • >= (크거나 같음)

    • x가 y보다 크거나 같은지 여부를 반환합니다.

    • x = 4; y = 3; x >= 3True를 반환합니다.

  • == (같음)

    • 두 객체가 같은지 여부를 반환합니다.

    • x = 2; y = 2; x == yTrue를 반환합니다.

    • x = 'str'; y = 'stR'; x == yFalse를 반환합니다.

    • x = 'str'; y = 'str'; x == yTrue를 반환합니다.

  • != (같지 않음)

    • 두 객체가 같지 않은지 여부를 반환합니다.

    • x = 2; y = 3; x != yTrue를 반환합니다.

  • not (불리언 NOT 연산자)

    • x가 True라면, False를 반환합니다. x가 False라면, True를 반환합니다.

    • x = True; not xFalse를 반환합니다.

  • and (불리언 AND 연산자)

    • x가 'False'일 때 x and yFalse를 반환하고 아니면 y와의 and 연산 결과를 반환합니다.

    • x가 False이기 때문에 x = False; y = True; x and yFalse를 반환합니다. and 연산에서 왼쪽의 값이 False면 전체 식이 False가 되기 때문에 파이썬은 y의 값을 처리하지 않습니다. 이것을 단축 계산(short-circuit evalulation)이라고 부릅니다.

  • or (불리언 OR 연산자)

    • x가 True이면 True가 반환되며, False이면 y와의 or 연산값을 반환합니다.

    • x = True; y = False; x or yTrue를 반환합니다. 여기서도 단축 계산이 적용됩니다.

연산 및 할당 연산자

아래 예제와 같이, 변수의 값에 어떤 연산을 한 뒤 다시 그 변수에 연산값을 할당하는 경우가 자주 발생합니다.

a = 2
a = a * 3

이런 경우, 아래와 같이 연산과 할당을 한번에 줄여 쓸 수 있습니다.

a = 2
a *= 3

(변수) = (변수) (연산자) (식)(변수) (연산자) = (식)의 형태가 됩니다.

연산 순서

2 + 3 * 4와 같은 식을 계산한다고 합시다. 덧셈이 먼저일까요, 곱셈이 먼저일까요? 초등학교 시절에 이미 배우셨겠지만, 곱셈을 먼저 계산해야 합니다. 이것은 곱셈 연산이 덧셈 연산보다 연산 순서에서 우위에 있기 때문입니다.

아래 표는 파이썬에서의 연산 순서를 나타내고 있습니다. 맨 위부터 가장 늦게 계산되는 순서대로 나열한 것입니다. 이것은 특정한 식이 주어졌을 때, 파이썬은 이 표의 가장 아래에 위치한 연산부터 차례대로 계산하게 된다는 것을 의미합니다.

아래 표는 파이썬 레퍼런스 매뉴얼에서 가져온 것입니다. 연산 순서를 적절히 조절하기 위해서는 괄호를 적당한 위치에 사용하는 것이 좋습니다. 또, 적절한 괄호의 사용은 프로그램을 좀 더 읽기 쉽게 해 줍니다. 아래의 연산 순서 변경 항목을 통해 이에 대해 좀 더 자세히 알아보시기 바랍니다.

  • lambda : 람다 식

  • if - else : 조건 식

  • or : 불리언 OR

  • and : 불리언 AND

  • not x : 불리언 NOT

  • in, not in, is, is not, <, <=, >, >=, !=, == : 비교 연산, 요소 연산, 관계 연산

  • | : 비트 OR

  • ^ : 비트 XOR

  • & : 비트 AND

  • <<, >> : 시프트 연산

  • +, - : 덧셈 및 뺄셈

  • *, /, //, % : 곱셈, 나눗셈, 나눗셈 후 내림 연산, 나머지 연산

  • +x, -x, ~x : 양수 표현, 음수 표현, 비트 NOT 연산

  • ** : 거듭제곱

  • x[index], x[index:index], x(arguments...), x.attribute : 원소 접근, 슬라이스, 함수 호출, 속성 참조

  • (expressions...), [expressions...], {key: value...}, {expressions...} : 괄호 또는 튜플, 리스트, 사전, 집합

아직 이 연산자들에 대해 모두 다루지 않았지만, 곧 다루게 될 것입니다.

같은 연산 순서를 갖는 연산자들은 위 표에서 같은 행에 위치하고 있습니다. 예를 들어, + 연산자와 - 연산자는 같은 연산 순서를 가지고 있습니다.

연산 순서 변경

괄호를 사용하여 식을 좀 더 읽기 쉽게 할 수 있습니다. 예를 들어, 2 + (3 * 4)라고 쓰면 2 + 3 * 4로 쓰는 것에 비해 연산자 순서를 잘 모르는 사람도 쉽게 읽을 수 있을 것입니다. 그렇지만, 괄호를 적당히 사용하는 것도 중요합니다. (2 + (3 * 4))와 같이 괄호를 너무 많이 사용하는 것은 피하세요.

또 괄호를 사용하면 연산의 순서를 바꿀 수 있습니다. 예를 들어 위 식에서 덧셈을 곱셈보다 먼저 계산하고 싶을 경우 (2 + 3) * 4라고 적을 수 있습니다.

같은 연산 순서를 가질 경우

기본적으로 연산자는 왼쪽에서 오른쪽으로 차례대로 계산됩니다. 즉, 같은 연산 순서를 가진 연산자들의 경우 왼쪽에서 오른쪽으로 순서대로 계산됨을 의미합니다. 예를 들어, 2 + 3 + 4(2 + 3) + 4와 같이 계산됩니다.

식 예제

예제 (expression.py로 저장하세요):

length = 5
breadth = 2

area = length * breadth
print('Area is', area)
print('Perimeter is', 2 * (length + breadth))

출력 결과:

$ python expression.py
Area is 10
Perimeter is 14

동작 원리

먼저 직사각형의 높이와 너비가 각각 length와 breadth라는 변수에 저장됩니다. 이제 앞서 배운 식을 이용하여, 두 변수를 이용해 직사각형의 면적과 둘레를 계산합니다. 첫번째로 area 라는 변수에 length * breadth라는 식의 결과가 저장되며, 이 값은 print 명령에 의해 화면에 출력됩니다. 두번째로는 print 명령에 곧바로 2 * (length + breadth)라는 을 직접 입력하고, 그 결과를 화면에 출력합니다.

파이썬이 얼마나 예쁘게 결과를 보여주는지 확인하세요. 우리가 'Area is'라는 문자열이나 area라는 변수에 공백을 지정하지 않았음에도, 파이썬이 그 둘 사이에 자동으로 공백을 넣어 줌으로 결과물이 깔끔하고 멋지게 출력될 수 있도록 해 주기 때문에 프로그램을 좀 더 읽기 쉽게 작성할 수 있습니다. 이것은 파이썬이 프로그래머의 삶을 좀 더 쉽게 만들어주는 하나의 좋은 예라고도 할 수 있겠습니다.

요약

지금까지 연산자, 피연산자, 식에 대해 알아보았습니다. 이들은 여러분이 앞으로 작성할 프로그램의 기본적인 뼈대가 되어 줄 것입니다. 다음으로는, 여러분의 프로그램에서 명령문을 이용하여 지금까지 배운 것들을 응용하는 방법에 대해 알아보겠습니다.

Last updated