2.3. 수학 연산¶
Python은 기본 상태로 계산기처럼 동작합니다. 이 페이지에서는 가장 자주 사용하게 될 연산자들을 다룹니다: 숫자에 대한 산술 연산, 불리언을 만들어 내는 비교 연산, 조건을 결합하는 논리 연산자, 그리고 하드웨어 수준 작업을 위한 비트 연산자입니다.
2.3.1. 산술 연산¶
+– 덧셈-– 뺄셈(접두사로 쓰면 부호 반전:-x)*– 곱셈/– 나눗셈. 두 피연산자가 모두 정수일 때도 항상float를 반환합니다.//– 바닥 나눗셈. 음의 무한대 쪽으로 반올림된 정수 몫을 반환합니다.%– 나머지(모듈로).**– 거듭제곱(2 ** 10은 1024입니다).
>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536
혼합형 산술 연산은 정수를 자동으로 부동소수점으로 승격합니다:
>>> 3 + 0.5
3.5
복합 대입은 연산자를 =와 결합하여 간결한 제자리 갱신을 제공합니다:
counter = 0
counter += 1 # equivalent to counter = counter + 1
counter *= 2 # works for *= /= //= %= **= too
연산자 우선순위는 일반적인 순서를 따릅니다: **가 먼저, 그다음 단항 -, 그다음 *, /, //, %, 마지막으로 +와 -. 확신이 서지 않으면 괄호를 사용하세요 – 실행 시점에 비용이 들지 않습니다.
2.3.2. 비교 연산¶
비교 연산자는 bool(True 또는 False)을 반환합니다:
==와!=– 같음 / 다름.<,<=,>,>=– 대소 비교.
>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True
마지막 예제는 연쇄 비교이며 3 < 5 and 5 <= 5와 정확히 동등합니다.
경고
=는 대입하고, ==는 비교합니다. if x = 5: 표현식은 문법 오류인데, 이는 Python이 이 둘을 조용히 혼동하기를 거부하기 때문입니다.
2.3.3. 불리언 논리¶
불리언을 결합하는 세 가지 연산자:
and– 양쪽이 모두 참일 때만True.or– 어느 한쪽이라도 참이면True.not– 단일 불리언을 반전.
and와 or는 단축 평가를 합니다: 결과가 확정되는 즉시 평가를 멈춥니다. False and slow_check()는 절대 slow_check를 호출하지 않습니다.
and와 or는 또한 리터럴 True나 False가 아니라 피연산자 중 하나를 반환하므로, 기본값을 간결하게 작성할 수 있습니다:
name = user_name or "anonymous" # "" / 0 / None are falsy
2.3.4. 비트 연산자¶
하드웨어 작업 – 레지스터 필드 패킹, 비트 마스킹, 프로토콜 헤더 파싱 – 에는 비트 연산자를 사용하게 됩니다. 이들은 int의 이진 표현에 대해 동작합니다:
&– 비트 AND|– 비트 OR^– 비트 XOR~– 비트 NOT(1의 보수)<<– 왼쪽 시프트>>– 오른쪽 시프트
이를 읽고 쓸 때는 16진수와 2진수 리터럴 형식이 편리합니다:
>>> 0b1100 & 0b1010
8 # 0b1000
>>> 0b1100 | 0b1010
14 # 0b1110
>>> 0xFF ^ 0x0F
240 # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171 # extract the high byte
각각에 대해 복합 형태도 있습니다: |=, &=, ^=, <<=, >>=.
참고
and / or는 불리언(또는 참 여부)에 대해 동작하고, & / |는 비트에 대해 동작합니다. 둘을 혼동하지 마세요. 0b1100 and 0b1010은 두 피연산자가 모두 참이기 때문에 0b1010으로 평가되는데, 이는 비트를 조작할 때 보통 원하는 결과가 아닙니다.
2.3.5. 유용한 숫자 내장 함수¶
연산자만으로는 다루지 못하는 흔한 수치 연산을 위한 몇 가지 내장 함수가 있습니다:
round()– 가장 가까운 정수, 또는 두 번째 인자가 주어지면 가장 가까운ndigits소수 자릿수.round(x)는int를,round(x, n)은float를 반환합니다. 동점(0.5,1.5, …)은 항상 올림이 아니라 가장 가까운 짝수로 반올림됩니다.divmod()– 한 번의 호출로(quotient, remainder)를 반환합니다. 한 양을 단위로 나눌 때(초를 분과 초로, 바이트를 페이지와 오프셋으로) 편리합니다.pow()– 두 인자 형태에서는**와 동일합니다. 세 인자 형태pow(base, exp, mod)는 거대한 중간 값을 한 번도 만들지 않고(base ** exp) % mod를 계산하는데, 이는 큰 지수에 대한 모듈러 거듭제곱을 수행하는 유일하게 실용적인 방법입니다.
>>> round(3.7)
4
>>> round(3.14159, 2)
3.14
>>> round(0.5) # ties go to even, not always up
0
>>> round(1.5)
2
>>> divmod(125, 60) # 125 seconds = 2 min, 5 sec
(2, 5)
>>> minutes, seconds = divmod(125, 60)
>>> pow(3, 4) # same as 3 ** 4
81
>>> pow(3, 100, 7) # (3 ** 100) mod 7, efficient
4
정수-문자열 진법 변환(bin, oct, hex)은 문자열 메서드와 서식 지정에서 다룹니다.
2.3.6. math 모듈¶
일반적인 수학 함수는 math 모듈에 들어 있습니다. 한 번 임포트한 뒤 점으로 연결된 이름을 통해 함수를 호출하세요:
import math
print(math.sqrt(2)) # 1.4142135
print(math.sin(math.pi / 2)) # 1.0
print(math.floor(3.7)) # 3
print(math.log(100, 10)) # 2.0
MicroPython math 모듈은 흔히 쓰이는 함수들(sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, …)을 다룹니다. 난수는 random 모듈을 참고하세요. 고정소수점 비트 조작에는 위의 연산자들로 보통 충분합니다.
2.3.7. 복소수¶
허수부가 필요한 수치 작업을 위해 Python에는 j 접미사 리터럴(1 + 2j)을 사용하는 complex 타입이 있습니다. cmath 모듈은 복소수 입력에 대해 math를 그대로 본뜬 것입니다. 둘 다 대부분의 MicroPython 빌드에 존재하지만 카메라 작업에는 거의 필요하지 않습니다. 이를 사용하는 코드를 포팅할 때 놀라지 않도록 주로 언급해 둡니다.