기초

파이썬 연산자: 산술, // 와 %, 비교, and/or/not, 파이썬 round 함수

업데이트: · Skillaria.Top

파이썬에서 / 연산자는 항상 float을 반환하고, // 는 내림한 몫, % 는 나머지, ** 는 거듭제곱입니다. round(x, n)은 n자리로 반올림하는데 짝수로 반올림하는 방식이라 round(2.5)는 2, round(3.5)는 4입니다. 올림과 내림은 math.ceil과 math.floor, 절댓값은 abs로 구합니다.

파이썬 연산자는 값을 새로운 값으로 바꾸는 기호입니다. +는 더하고, //는 나눗셈의 몫을 구하고, and는 조건을 결합합니다. 아래에서는 전체 연산자 목록을 예제와 함께 정리하고, /와 //의 차이, and, or, not의 논리, 그리고 파이썬 round와 math.ceil, math.floor, abs 같은 반올림 관련 함수를 살펴봅니다. 모든 예제는 REPL에 그대로 붙여 넣어 확인할 수 있습니다.

파이썬 연산자 목록

연산자는 용도별로 묶을 수 있습니다. 표 전체를 외울 필요는 없습니다. 실제 코드에서는 산술, 비교, 논리 연산자가 가장 자주 나옵니다.

분류연산자예제
산술+ - * / // % **7 // 2 → 3
비교== != < > <= >=3 < 5 → True
논리and or notnot True → False
동일성is, is notx is None
소속in, not in"커" in "커피" → True
대입= += -= *= /= //= %= **=total += 250
왈러스:=if (n := len(s)) > 10:
비트 단위& | ^ ~ << >>5 & 3 → 1

산술 연산자

덧셈, 뺄셈, 곱셈은 수학 시간에 배운 대로 동작합니다. 식에 float이 하나라도 들어 있으면 결과도 float이 됩니다. 예를 들어 2 + 1.0은 3.0입니다. 파이썬의 정수는 넘치지 않습니다. 2 ** 100도 자릿수와 상관없이 정확히 계산됩니다.

>>> 250 + 120
370
>>> 12.5 * 3
37.5
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951

거듭제곱 연산자 **

거듭제곱은 ^가 아니라 별표 두 개(**)로 씁니다. 파이썬에서 ^는 비트 단위 XOR이므로, 2 ^ 3의 결과는 8이 아니라 1입니다. 지수를 소수로 쓰면 제곱근이 됩니다. 9 ** 0.5는 3.0입니다. 함수 pow(x, y)도 같은 일을 하며, 세 번째 인자를 주면 나머지를 구합니다. pow(2, 10, 1000)은 24를 반환합니다.

우선순위에 주의하세요. **는 단항 마이너스보다 먼저 계산됩니다. 그래서 -2 ** 2는 -4입니다. 음수의 제곱을 구하려면 괄호를 쓰세요. (-2) ** 2.

나눗셈: /, // 와 %

파이썬에는 나눗셈이 두 종류 있으며, 초보자가 가장 많이 헷갈리는 부분입니다. 일반 나눗셈 /는 나누어떨어져도 항상 float을 반환합니다. 정수 나눗셈 //는 소수 부분을 버리고, %는 나머지를 반환합니다.

>>> 7 / 2
3.5
>>> 8 / 2
4.0
>>> 7 // 2
3
>>> 7 % 2
1

정수 나눗셈 // 와 나머지 %: 실전 예제

//와 %의 조합은 '정수로 몇 개이고 몇 개가 남았나'를 구하는 문제를 해결합니다. 강의의 지출 관리 프로그램은 정확도를 잃지 않으려고 금액을 원 단위 정수로 저장하고, 이를 원과 나머지 원으로 나눕니다.

won = 125050              # 금액을 원 단위 정수로 저장
thousand = won // 1000    # 125 — 천 원 단위 개수
rest = won % 1000         # 50 — 나머지
print(thousand, rest)     # 125 50

print(40 // 7, "주와", 40 % 7, "일")   # 5 주와 5 일

두 연산을 한 번에 해 주는 내장 함수 divmod도 있습니다. divmod(125050, 1000)은 (125, 50) 튜플을 반환합니다. 나머지는 짝수 판별에도 쓰입니다. n % 2 == 0은 짝수에 대해 참입니다.

음수: // 는 아래로 내림

//는 단순히 소수를 버리는 것이 아니라 음의 무한대 방향으로 내림합니다. 양수에서는 차이가 없지만 음수에서는 차이가 납니다. 파이썬에서 나머지 %의 부호는 나누는 수의 부호를 따르므로, 항상 a == (a // b) * b + a % b가 성립합니다.

>>> -7 // 2
-4
>>> -7 % 2
1
>>> int(-7 / 2)     # 반올림이 아니라 소수 부분을 버림
-3

0으로 나누기: 어떤 오류가 나는가

세 연산자 중 어느 것이든 0으로 나누면 ZeroDivisionError 예외가 발생합니다. 정수든 실수든 마찬가지입니다. try/except로 잡거나, 나누기 전에 나누는 수를 미리 확인할 수 있습니다.

>>> 10 / 0
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
>>> count = 0
>>> avg = 15000 / count if count else 0
>>> avg
0

비교 연산자

비교 연산자는 True 또는 False를 반환합니다. 같은지 비교할 때는 ==를 두 번 쓰고, 한 번만 쓰는 =은 대입입니다. 문자열은 문자의 코드 값으로 한 글자씩 비교합니다. 그래서 "A" < "a"는 참입니다. 대문자의 코드 값이 소문자보다 작기 때문입니다.

>>> 250 == 250.0
True
>>> 3 != 4
True
>>> 1 < 5 <= 10     # 체이닝: 1 < 5 and 5 <= 10
True
>>> 0.1 + 0.2 == 0.3
False

파이썬에는 0 <= x < 100처럼 비교를 이어 쓰는 체이닝이 있어서 and를 따로 쓸 필요가 없습니다. 마지막 줄은 실수의 오차를 보여 줍니다. 0.1 + 0.2는 0.30000000000000004가 됩니다. 실수는 math.isclose(a, b)로 비교하고, 돈은 원 단위 정수나 Decimal로 저장하세요.

논리 연산자 and, or, not

파이썬의 논리 연산자는 &&나 || 같은 기호가 아니라 영어 단어로 씁니다. and는 양쪽이 모두 참일 때 참이고, or는 하나라도 참이면 참이며, not은 값을 뒤집습니다.

aba and ba or bnot a
TrueTrueTrueTrueFalse
TrueFalseFalseTrueFalse
FalseTrueFalseTrueTrue
FalseFalseFalseFalseTrue

우선순위는 not이 먼저, 그다음 and, 마지막이 or입니다. 따라서 True or False and False는 True입니다. and가 먼저 계산되기 때문입니다. 복잡한 조건에서는 괄호를 쓰세요. 나와 동료 모두 읽기 쉬워집니다.

and와 or가 실제로 반환하는 값

and와 or는 항상 True나 False를 반환하지 않고, 피연산자 중 하나를 반환합니다. or는 처음으로 나오는 참 값을(없으면 마지막 값을), and는 처음으로 나오는 거짓 값을(없으면 마지막 값을) 돌려줍니다. 거짓으로 취급되는 값은 0, 0.0, 빈 문자열, 빈 컬렉션, None, False입니다.

>>> name = ""
>>> name or "손님"
'손님'
>>> 5 and 0
0
>>> not ""
True

평가는 지연됩니다. 왼쪽만으로 결과가 정해지면 오른쪽은 계산하지 않습니다. 그래서 count and total / count는 count == 0일 때 0으로 나누는 오류를 내지 않습니다. 또한 not은 두 다른 연산자와 달리 항상 bool을 반환합니다.

연산자 is와 in

==는 값을 비교하고, is는 두 이름이 같은 객체를 가리키는지 확인합니다. 빈 장바구니 두 개는 값이 같지만 같은 객체는 아닙니다. is가 꼭 필요한 곳은 None 확인입니다. if x is None처럼 씁니다.

>>> a = [250, 120]
>>> b = [250, 120]
>>> a == b, a is b
(True, False)
>>> c = a
>>> c is a
True

숫자나 문자열을 is로 비교하지 마세요. 내부 캐싱 때문에 우연히 맞게 나올 수 있지만, 결과가 구현에 따라 달라집니다. 파이썬은 x is 5 같은 코드에 SyntaxWarning을 띄우기도 합니다.

연산자 in은 포함 여부를 확인합니다. 문자열 안의 부분 문자열, 리스트의 원소, 딕셔너리의 키를 검사할 수 있습니다. not in은 그 반대입니다.

>>> "커피" in "커피 한 잔"
True
>>> "식비" in {"식비": 450, "택시": 300}
True
>>> 5 not in [1, 2, 3]
True

대입 연산자와 왈러스 연산자 :=

+=, -=, *=, //= 같은 복합 대입 연산자는 줄여 쓴 표기입니다. total += 250은 total = total + 250과 같습니다. 파이썬에는 ++나 -- 연산자가 없습니다. x++를 쓰면 문법 오류가 납니다.

왈러스 연산자 :=는 생김새가 바다코끼리의 눈과 상아를 닮아서 그렇게 불립니다. 식 안에서 값을 대입하면서 동시에 사용할 수 있게 해 줍니다. 값을 검사하고 나서 계속 써야 할 때 유용합니다.

items = ["커피", "택시", "점심", "영화"]
if (n := len(items)) > 3:
    print(f"지출 항목이 너무 많습니다: {n}")

while (line := input("금액: ")) != "":
    print(int(line) * 2)

왈러스 연산자가 없다면 len을 두 번 호출하거나 대입을 별도 줄로 빼야 합니다. 그렇다고 남용할 필요는 없습니다. 식이 읽기 어려워진다면 일반 대입이 낫습니다.

반올림: round, ceil, floor

파이썬에서 반올림에는 내장 함수 round와 math 모듈의 함수들을 씁니다. 해결하는 문제가 서로 다르기 때문에 헷갈리기 쉽습니다.

함수동작2.5-2.52.7
round(x)가장 가까운 정수로, 정확히 가운데이면 짝수로2-23
math.floor(x)아래로, 음의 무한대 방향으로2-32
math.ceil(x)위로, 양의 무한대 방향으로3-23
math.trunc(x), int(x)소수 부분을 버리고 0 방향으로2-22

파이썬 round 함수와 은행원 반올림

round(x, n)은 소수점 아래 n자리로 반올림합니다. 두 번째 인자를 생략하면 int를 반환합니다. 가장 큰 함정은 파이썬 round가 '은행원 반올림'을 쓴다는 점입니다. 정확히 가운데에 있는 수는 가장 가까운 짝수로 갑니다. 그래서 round(2.5)는 2이고, round(3.5)는 4입니다. 큰 계산을 할 때 반올림 오차가 한쪽으로만 쌓이지 않게 하려는 방식입니다.

>>> round(2.5), round(3.5)
(2, 4)
>>> round(3.14159, 2)
3.14
>>> round(1250, -2)     # 백 단위로
1200
>>> round(2.675, 2)     # 2.68이 아님: 이진수로는 2.67499...
2.67

영수증처럼 익숙한 '반올림(5 이상 올림)'이 필요하다면 Decimal과 ROUND_HALF_UP 모드를 쓰세요. 실수 오차를 물려받지 않도록 숫자는 문자열로 넘깁니다.

>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal("2.5").quantize(Decimal("1"), ROUND_HALF_UP)
Decimal('3')
>>> Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
Decimal('2.68')

강의에서 말하는 또 하나의 원칙은 값은 출력할 때만 반올림하라는 것입니다. 보기 좋게 출력하는 데 round는 필요 없고, f-문자열이면 충분합니다. f"{amount:.2f}"는 소수점 둘째 자리까지 보여 주지만 값 자체는 정확하게 유지됩니다.

math.ceil과 math.floor: 위로, 아래로 반올림

math.ceil은 '모자라면 안 되는' 경우에 씁니다. 예를 들어 버스를 몇 대 예약해야 할지, 검색 결과가 몇 페이지인지 계산할 때입니다. math.floor는 완전한 단위만 셀 때 씁니다. 두 함수 모두 int를 반환합니다.

import math

guests = 47
seats = 20
print(math.ceil(guests / seats))   # 버스 3대
print(math.floor(9.99))            # 9
print(-(-guests // seats))         # 3 — math 없이 //로 하는 올림

math 모듈에는 이 밖에도 math.sqrt(제곱근), math.isclose(실수 비교), math.pi, math.gcd가 있습니다. 파이썬 3.15에는 정수 계산을 위한 하위 모듈 math.integer(PEP 791)가 추가되었습니다. 여기에는 comb, factorial, gcd, isqrt, lcm, perm이 있으며, 기존의 math.gcd 등도 그대로 동작합니다.

함수 abs: 절댓값

abs(x)는 절댓값, 즉 0으로부터의 거리를 부호 없이 반환합니다. 내장 함수이므로 import가 필요 없습니다. 정수, 실수, 복소수에서 모두 동작합니다. 예를 들어 3+4j에 적용하면 벡터의 길이인 5.0이 나옵니다.

>>> abs(-250)
250
>>> abs(-12.5)
12.5
>>> budget, spent = 5000, 5320
>>> abs(budget - spent)    # 얼마나 벗어났는지
320

전형적인 용도는 방향을 무시한 차이와 허용 오차 비교입니다. 예를 들어 abs(a - b) < 0.001처럼 씁니다. 실수는 크기를 고려하는 math.isclose가 더 정확합니다.

연산자 우선순위

한 식에 여러 연산자가 있으면 파이썬은 우선순위에 따라 계산합니다. 높은 순서부터 나열하면 다음과 같습니다.

  1. **
  2. 단항 -x, +x, ~x
  3. * / // %
  4. + -
  5. 비트 시프트와 비트 연산
  6. 비교, in, is
  7. not
  8. and
  9. or
  10. :=

그러므로 2 + 3 * 4는 14이고, (2 + 3) * 4는 20입니다. 확실하지 않다면 괄호를 쓰세요. 불필요한 괄호는 아무런 비용이 없지만, 우선순위 오류는 찾기가 오래 걸립니다.

연산자에서 자주 하는 실수

실수무슨 일이 생기나올바른 방법
if x = 5:SyntaxError: 대입으로 해석됨if x == 5:
거듭제곱 대신 2 ^ 3비트 XOR, 결과 12 ** 3
8 / 2에서 정수를 기대함결과가 4.08 // 2
x == 1 or 2항상 참: or 2 때문에x in (1, 2)
round(2.5)이 3일 것이라 기대함은행원 반올림으로 2ROUND_HALF_UP을 쓴 Decimal
"5" + 5TypeErrorint("5") + 5

정리

핵심은 다음과 같습니다. /는 항상 float을 반환하고, //는 아래로 내림하며, %는 나누는 수의 부호를 따르는 나머지를 반환하고, 거듭제곱은 **입니다. 논리 연산자 and, or, not은 영어 단어로 쓰고 지연 평가되며, is는 None 확인에 씁니다. 파이썬 round는 짝수 쪽으로 반올림하며, 올림과 내림에는 math.ceil과 math.floor를, 절댓값에는 abs를 씁니다. 강의에서는 이 연산자들을 지출 관리 프로그램에 적용해 보며, 금액을 원 단위 정수로 저장합니다.

자주 묻는 질문

파이썬에서 숫자를 소수점 둘째 자리까지 반올림하려면 어떻게 하나요?

round(x, 2)를 쓰세요. 값은 바꾸지 않고 보기 좋게만 출력하려면 f-문자열 f"{x:.2f}"를 쓰면 됩니다.

파이썬에서 round(0.5)가 0을 반환하는 이유는 무엇인가요?

round는 정확히 가운데에 있는 수를 가장 가까운 짝수로 반올림하고, 0은 짝수이기 때문입니다. 같은 이유로 round(1.5)와 round(2.5)는 모두 2를 반환합니다.

파이썬에서 나눗셈의 정수 몫은 어떻게 구하나요?

// 연산자를 쓰세요. 17 // 5는 3을 반환합니다. 음수에서는 아래로 내림하므로 -17 // 5는 -4입니다. 소수 부분을 0 방향으로 버리려면 int(-17 / 5)를 쓰세요.

파이썬에 삼항 연산자가 있나요?

있습니다. 조건부 식인 값1 if 조건 else 값2 형태입니다. 예를 들어 "짝수" if n % 2 == 0 else "홀수"처럼 씁니다.

파이썬의 &와 and는 무엇이 다른가요?

and는 지연 평가하는 논리 연산자이고, &는 숫자의 비트 AND이자 집합의 교집합입니다. if 조건문에서는 and를 쓰세요.

영상으로 이 주제 배우기

이 주제는 “Python 3.15: от новичка до профи” 강의에서 실습과 함께 자세히 다룹니다.

강의로 이동