이 노트북은 제이크 반더플라스(Jake VanderPlas)의 A Whirlwind Tour of Python(OReilly Media, 2016)를 기반으로 만들어졌습니다. 이 내용은 CC0 라이센스를 따릅니다. 전체 노트북의 목록은 https://github.com/rickiepark/WhirlwindTourOfPython 에서 볼 수 있습니다.

< 변수와 객체 | 목차 | 간단한 기본 데이터 타입 >

파이썬 연산자

이전 섹션에서 파이썬 변수와 객체의 의미를 살펴 보았습니다. 여기서는 파이썬에 있는 여러가지 연산에 대해 알아보겠습니다. 이 섹션을 마치면 파이썬에서 데이터를 비교하고 조작하는 기본적인 방법을 알게 될 것입니다.

산술 연산

파이썬에는 7개의 이항 산술 연산자와 두 개의 단항 연산자가 있습니다. 다음 테이블에 이를 정리했습니다:

연산자 이름 설명
a + b 덧셈 ab를 더합니다.
a - b 뺄셈 ab를 뺍니다.
a * b 곱셈 ab를 곱합니다.
a / b 나눗셈 ab로 나눕니다.
a // b ab로 나누고 소수 부분을 제거합니다.
a % b 나머지 ab로 나눈 나머지를 계산합니다.
a ** b 거듭제곱 ab만큼 거듭제곱합니다.
-a 음수 a의 음수
+a 양수 a와 동일 (거의 사용되지 않음)

이 연산들은 일반적인 방식대로 괄호를 사용하여 묶어서 사용할 수 있습니다. 예를 들어:

몫 나눗셈은 소수 부분을 버립니다:

몫 연산자는 파이썬 3에 추가되었습니다. 파이썬 2를 사용하는 경우에는 기본 나숫셈 연산자(/)가 정수일 때는 몫 연산자처럼 부동소수일 때는 나눗셈처럼 작동합니다.

마지막으로 파이썬 3.5에 추가된 여덟 번째 연산자가 있습니다. a @ b 연산자는 여러 선형 대수 패키지에서 ab행렬 곱셈으로 사용됩니다.

비트 연산자

기본 수치 연산 외에 파이썬은 정수의 비트에 대해 논리 연산을 수행하는 연산자를 가지고 있습니다. 기본 산술 연산보다는 덜 사용되지만 알고 있으면 유용합니다. 여섯 개의 비트 연산자를 다음 표에 정리했습니다:

연산자 이름 설명
a & b 비트 AND ab에 모두 정의된 비트
a | b 비트 OR a 또는 b 또는 양쪽에 모두 정의된 비트
a ^ b 비트 XOR a 또는 b에만 정의된 비트
a << b 왼쪽으로 비트 이동 b만큼 왼쪽으로 이동한 a의 비트
a >> b 오른쪽으로 비트 이동 b만큼 오른쪽으로 이동한 a의 비트
~a 비트 NOT a의 반대 비트

이런 비트 연산은 이진수 표현에서 의미가 있습니다. 이진수 표현은 내장 함수 bin을 사용합니다:

결괏값은 이진 표현을 나타내는 '0b'로 시작합니다. 나머지 숫자는 $1 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0$와 같이 숫자 10을 표현한 것입니다. 다음도 비슷합니다:

비트 OR을 사용해 4와 10의 비트가 모두 들어 있는 숫자를 계산할 수 있습니다:

이런 비트 연산자들은 기본 산술 연산자만큼 당장은 필요하지 않지만 적어도 어떤 종류의 연산을 하는 것인지 이해하고 있는 것이 도움이 됩니다. 특히 다른 언어를 사용했던 사용자들은 가끔 거듭제곱(즉, a ** b)을 할 때 XOR(즉, a ^ b) 연산자를 사용하는 실수를 합니다.

할당 연산

변수는 "=" 연산자로 할당되고 저장된 값은 나중에 사용할 수 있습니다. 예를 들어:

앞서 보았던 모든 연산자들을 이런 변수에 사용할 수 있습니다. 예를 들어, a에 2를 더하려면 다음과 같이 씁니다:

변수 a를 새로운 값으로 업데이트하려면 덧셈과 할당 연산자를 연결하여 a = a + 2와 같이 씁니다. 이렇게 연산과 할당을 연결하는 일이 흔하기 때문에 파이썬에서는 기본으로 모든 산술 연산을 위한 업데이트 연산자를 가지고 있습니다:

앞서 언급한 모든 이항 연산자에 대응되는 확장된 할당 연산자가 있습니다. 요약하면 다음과 같습니다:

a += b a -= b a *= b a /= b
a //= b a %= b a **= b a &= b
a |= b a ^= b a <<= b a >>= b

각각은 할당 뒤에 연산자가 뒤따르는 것과 동일합니다. 즉 어떤 연산자 ""에 대해서 식 a ■= ba = a ■ b와 동일합니다. 다만 예외가 있는데 리스트, 배열이나 데이터프레임(DataFrame)같이 변경 가능한 객체는 연산과 할당을 나누어 쓸때와 달리 확장된 할당 연산에서 다르게 동작합니다. 연산의 결과를 저장하기 위해 새로운 객체를 만드는 것이 아니고 원본 객체의 내용을 변경시킵니다.

비교 연산

아주 유용한 또 다른 종류의 연산은 다른 두 값을 비교하는 연산입니다. 파이썬에는 TrueFalse를 반환하는 기본적인 비교 연산자가 있습니다. 다음 테이블에 비교 연산을 정리합니다:

연산 설명 연산 설명
a == b ab가 같음 a != b ab가 같지 않음
a < b ab보다 작음 a > b ab보다 큼
a <= b ab보다 작거나 같음 a >= b ab보다 크거나 같음

이런 비교 연산자는 산술 연산자나 비트 연산자와 연결하여 다양한 수치 테스트를 표현할 수 있습니다. 예를 들어, 2로 나누어 나머지가 1인지 확인하여 홀수인지를 확인할 수 있습니다:

여러개의 비교를 연결하여 더 복잡한 관계를 확인할 수 있습니다:

머리가 좀 아프겠지만 이런 비교를 확인해 보세요:

~는 비트를 바꾸는 연산자입니다. 0의 비트를 모두 바꾸면 -1이 됩니다. 왜 이렇게 되는지 이유가 궁금하면 파이썬이 부호있는 정수를 인코딩하는 방식인 2의 보수 인코딩 체계를 확인해 보세요. 모든 비트를 거꾸로 했을 때 어떻게 되는지 생각하면 됩니다(정수 -1의 2의 보수로 표현하면 정수 1의 비트를 모두 역전시킨 후 1을 더합니다. 이 값은 0의 비트를 모두 역전시킨 것과 동일합니다).

불리언 연산

불리언 값을 위해 파이썬은 "and", "or" 그리고 "not"의 개념을 적용할 수 있는 연산자를 제공합니다. 예상할 수 있듯이 이 연산자는 and, or 그리고 not입니다:

불리언 연산자를 좋아한다면 XOR 연산자가 없다는 것을 눈치챘을지 모르겠습니다. 물론 다른 연산자들을 조합하여 만들 수 있는 방법이 여러 가지 있습니다. 불리언 값에 대한 XOR 연산은 다음과 같이 만들 수 있습니다:

이런 불리언 연산들은 조건문이나 반복문 같은 제어문과 함께 쓰일 때 아주 유용합니다.

이따금 파이썬에서 불리언 연산자(and, or, not)를 사용할 때와 비트 연산자(&, |, ~)를 사용할 때가 혼돈이 됩니다. 답은 연산자 이름에 있습니다. 불리언 연산은 전체 문장의 불리언 값(즉, 참이나 거짓)을 계산할 때 사용해야 합니다. 비트 연산은 의심스러운 객체의 콤포넌트나 개개의 비트를 조작할 때 사용해야 합니다.

항등 연산자와 소속 연산자

and, or 그리고 not처럼 파이썬에는 동일한지와 소속되어 있는지를 확인하는 문장 같은 연산자를 가지고 있습니다. 이 연산자들은 다음과 같습니다:

연산자 설명
a is b ab가 동일한 객체이면 True
a is not b ab가 동일한 객체가 아니면 True
a in b ab에 소속되어 있으면 True
a not in b ab에 소속되어 있지 않으면 True

항등 연산자: "is"와 "is not"

항당 연산자 "is"와 "is not"는 오브젝트의 동일성을 확인합니다. 오브젝트의 동일성은 값이 같다는 것과는 다릅니다. 다음 코드를 확인해 보세요:

동일한 객체는 어떤 것일까요? 다음이 한 예입니다:

이 두 경우의 차이는 첫 번째 ab다른 객체를 가리킨 반면 두 번째는 같은 객체를 가리킨 것입니다. 이전 섹션에서 보았듯이 파이썬 변수는 포인터입니다. "is" 연산자는 콘테이너에 담긴 값이 아니라 두 변수가 같은 콘테이너(객체)를 가리키는지를 확인합니다. 대부분의 경우 초보자들은 ==을 사용해야 하는 곳에 "is"를 사용하는 경향이 있습니다.

소속 연산자

소속 연산자는 복합 객체 안에 멤버쉽(membership)을 확인합니다. 예를 들어, 다음과 같이 쓸 수 있습니다:

이런 소속 연산자는 C 같은 저수준 언어에 비해 얼마나 사용하기 쉬운지 보여주는 한가지 사례입니다. C에서는 반복 루프를 사용해 수동으로 리스트의 값중에 같은 것이 있는지를 체크해야 합니다. 파이썬에서는 영어 문장을 쓰는 것처럼 필요한 것을 적기만 하면 됩니다.

< 변수와 객체 | 목차 | 간단한 기본 데이터 타입 >