산술연산
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