본문 바로가기

산술연산

1. 산술연산자

파이썬의 산술연산자는 숫자뿐만 아니라 문자열, 리스트, 튜플 등에서도 사용됩니다. 각 자료형마다 연산자의 동작이 다르므로 주의가 필요합니다.

1.1 덧셈

덧셈 연산자는 Python의 가장 기본적인 연산자 중 하나입니다. 주로 숫자를 더하는 데 사용되지만, 문자열, 리스트, 튜플 등 다양한 자료형에서도 사용됩니다.

1.1.1 숫자 덧셈

정수와 정수의 덧셈은 정수를 반환합니다. 정수와 실수의 덧셈은 실수를 반환합니다.

print(5 + 3) # 결과: 8
print(3 + 2.5) # 결과: 5.5

1.1.2 문자열 덧셈

문자열에서 덧셈 연산자는 두 문자열을 연결하는 역할을 합니다.

s1 = "Hello"
s2 = "World"
result = s1 + " " + s2
print(result)  # Hello World

1.1.3 리스트와 튜플의 덧셈

리스트와 튜플에서 덧셈 연산자는 두 객체를 연결합니다.

list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list)  # [1, 2, 3, 4, 5, 6]

tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
combined_tuple = tuple1 + tuple2
print(combined_tuple)  # (1, 2, 3, 4, 5, 6)

1.1.4 나아가기

서로 다른 자료형 간의 덧셈은 지원되지 않습니다. 예를 들어, 문자열과 숫자를 직접 더할 수 없습니다.

result = "Hello" + 5

또한 덧셈이 지원되지 않는 자료형도 있습니다. 딕셔너리와 셋이 그러합니다.

{'one':1} + {'two':2} # error
{5} + {6} # error

딕셔너리와 셋은 +대신 |를 사용하여 결합할 수 있습니다. 다만 딕셔너리의 | 연산은 파이썬 3.9부터 사용할 수 있습니다.

print({'one':1} | {'two':2}) # 결과: {'one': 1, 'two': 2}
print({5} | {6}) # 결과: {5, 6}

1.2 뺄셈

1.2.1 숫자 뺄셈

정수와 정수의 뺄셈은 정수를, 정수와 실수의 뺄셈은 실수를 반환합니다. -기호는 음수를 표현하는 데도 사용됩니다.

print(7 - 4) # 결과: 3
print(10 - 3.5) # 결과: 6.5
print(5 - (-3)) # 결과: 8

1.2.2 셋의 뺄셈

셋은 +기호는 지원하지 않지만 -기호로 차집합을 지원합니다.

{3, 4, 5} - {4} # 결과: {3, 5}

이는 아래 메서드와 동일한 결과를 가집니다.

{3, 4, 5}.difference({4}) # 결과: {3, 5}

1.2.3 나아가기

서로 다른 자료형 간의 뺄셈은 지원되지 않습니다. 예를 들어, 문자열에서 숫자를 뺄 수 없습니다.

result = "Hello" - 3 # error

파이썬에서 문자열, 리스트, 튜플 등에서 뺄셈 연산자를 사용하는 것은 지원되지 않습니다. 이러한 데이터 유형에서 항목을 제거하려면 메서드나 슬라이싱 등 다른 방법을 사용해야 합니다.

뺄셈 기호인 대쉬(-)는 음의 정수를 표현하는 것에도 사용하니 표현에 유의해주세요. 예를 들어 아래와 같은 표현은 유효한 표현입니다.

print(7 - 4) # 결과: 3
print(7 -- 4) # 결과: 11
print(7 --- 4) # 결과: 3

1.3 곱셈

곱셈 연산자는 주로 숫자에서 사용되지만, 문자열이나 리스트, 튜플에서는 값을 연결시킬 수 있도록 합니다. 딕셔너리나 셋은 지원하지 않습니다. 그 특성을 살펴보면 이해할 수 있습니다. 딕셔너리는 키의 중복이 안되고, 셋은 값에 중복이 안되기 때문에 곱셈 연산을 하는 것이 의미가 없습니다.

1.3.1 숫자의 곱셈

정수와 정수의 곱셈은 정수를, 정수와 실수의 곱셈은 실수를 반환합니다.

print(3 * 4) # 결과: 12
print(5 * 2.5) # 결과: 12.5

1.3.2 문자열과 곱셈

문자열과 정수를 곱하면 해당 문자열이 정수만큼 반복됩니다. 다만 문자열과 실수를 곱하는 것은 지원되지 않습니다.

print("Ha" * 3) # 출력: "HaHaHa"
# print("Ha" * 3.1) # Error

1.3.3 리스트와 곱셈

리스트와 정수를 곱하면 리스트 내의 요소들이 정수만큼 반복됩니다. 다만 리스트와 실수를 곱하는 것, 리스트와 리스트를 곱하는 것은 지원되지 않습니다.

print([1, 2, 3] * 2) # 출력: [1, 2, 3, 1, 2, 3]

리스트를 행렬로 취급하여 서로 곱하게 하고 싶다면 numpy와 같은 모듈을 사용할 수 있습니다.

1.4 나눗셈

나눗셈 연산자(/, //)는 두 수를 나누는 연산자입니다. /는 나누어떨어지더라도 항상 float를 반환합니다. //는 소수점 아래를 정리해 몫만 남기는데, 반환 타입은 피연산자를 따라갑니다. 둘 다 정수면 int, 하나라도 실수면 float입니다.

연산자이름반환 타입설명
/나눗셈항상 float소수점까지 계산
//몫(내림 나눗셈)피연산자를 따름결과보다 크지 않은 가장 가까운 정수
print(10 // 3, type(10 // 3))       # 3, int
print(10.0 // 3, type(10.0 // 3))   # 3.0, float

//는 '버림'이 아니라 '내림'이라는 점이 중요합니다. 즉 0 방향으로 자르는 것이 아니라 더 작은 쪽으로 내립니다. 양수에서는 두 방식의 결과가 같아 차이가 드러나지 않지만, 음수에서는 달라집니다. 아래 예제를 통해 확인해주세요.

1.4.1 기본 사용법

a = 10
b = 2
print(a / b) # 결과 5.0
print(a // b) # 결과 5

정수로 떨어지는 값이라 하더라도 첫번째 연산의 경우 float형으로 반환된 것을 확인할 수 있습니다. 이번에는 음수를 확인해보도록 하겠습니다.

a = -5
b = 2
print(a / b) # 결과: -2.5
print(a // b) # 결과: -3

음수의 경우 두번째 값이 -2로 나올 것이라 예상하셨겠지만 -3이 나온 것을 확인할 수 있습니다. 이는 // 연산이 내림이기 때문에 그렇습니다.

1.4.2 나아가기

나누기의 경우 0으로 나누면 아래와 같은 에러가 발생합니다. 이는 수학적으로 0으로 나누는 것이 정의되지 않았기 때문입니다.

z = 0
x / z # ZeroDivisionError 발생

또한 float 형으로 반환되는 경우 아래처럼 소수점 2번째 자리까지 출력하는 구문을 많이 사용하니 기억해두세요.

a = 10
b = 3
divide = a / b
print(f'{a} ÷ {b} = {divide:.2f}')  # 결과: 10 ÷ 3 = 3.33

1.5 나머지 연산자

나머지 연산자(%)는 한 숫자를 다른 숫자로 나누었을 때의 나머지를 반환하는 연산자입니다. 이 연산자는 특히 비교 연산자와 함께 사용하여 값이 나누어 떨어지는지 확인할 때 많이 사용합니다.

1.5.1 기본 사용법

10 % 3 # 결과: 1

10을 3으로 나누면 몫이 3이고 나머지가 1입니다. 따라서 1을 출력합니다.

1.5.2 활용 예시

10 % 2 == 0 # 짝수인지 판별
365 % 10    # 1의 자리 반환, 결과: 5

위와 같이 나머지 연산은 홀수와 짝수를 판별하거나 특정 자리 수를 반환하거나, 특정 주기마다 코드를 실행시킬 경우 등에 주로 사용합니다.

1.6 거듭제곱 연산자

거듭제곱 연산자(**)는 특정 숫자를 다른 숫자의 승수만큼 곱하는 연산자입니다.

1.6.1 기본 사용법

10 ** 3 # 결과: 1000

위 연산 결과는 10 * 10 * 10과 같습니다.

4 ** 0.5 # 결과: 2.0

위 연산 결과는 4의 1/2승과 같습니다. 제곱근을 구하는 것이고, 루트를 씌운 결과와 같습니다. 지수가 실수이므로 결과도 정수 2가 아닌 실수 2.0으로 나온다는 점을 확인해주세요.

1.6.2 나아가기

-2 ** 2

위와 같은 연산은 당연히 4가 될 것 같지만 -4가 정답입니다. -부호가 나중에 붙기 때문입니다. 이를 해결하기 위해 아래와 같이 음수는 괄호로 묶어야 합니다.

(-2) ** 2

음수에 정수가 아닌 지수를 사용하면 결과가 복소수가 될 수 있습니다. 예를 들어 음수의 제곱근이 그렇습니다.

print((-2) ** 2)    # 4, 지수가 정수라면 실수 결과
print((-2) ** 0.5)  # 복소수가 반환됩니다.

2. 전/후위 연산자

다른 프로그래밍 언어에서 일반적으로 지원하는 전/후위 연산자가 파이썬에는 존재하지 않습니다. 전/후위 연산자는 아래와 같이 연산되는 것입니다. a에 1이 추가됩니다.

a = 10
++a
a++

이처럼 다른 언어에 일반적으로 있는 연산자가 파이썬에서는 없는 경우가 있습니다. 이러한 용법이 없으므로 보다 간결한 문법을 지향할 수 있으며 혼란을 줄일 수 있습니다.

예를 들어 이런 전/후위 연산자가 있는 JavaScript의 경우 일부 대기업의 코딩 가이드라인에서는 혼란을 피하기 위해 사용을 권장하지 않는 경우가 있습니다. 코드의 명확성과 정확성을 위해서입니다.

airbnb/javascript: JavaScript Style Guide