Python은 다양한 숫자 타입과 풍부한 수학 함수를 제공합니다. 이 글에서는 숫자 타입의 특징과 math, random 모듈의 활용법을 상세히 알아봅니다.

숫자 타입

정수 (int)

Python 3에서는 정수의 크기 제한이 없습니다.

# 정수 리터럴
x = 10
y = -5
z = 0

# 매우 큰 정수도 처리 가능
big_num = 12345678901234567890123456789

# 다양한 진법 표현
binary = 0b1010      # 2진수: 10
octal = 0o12         # 8진수: 10
hexadecimal = 0xFF   # 16진수: 255

# 가독성을 위한 언더스코어
million = 1_000_000

부동소수점 (float)

# 부동소수점 리터럴
f = 3.14
g = -0.5
h = 2.0

# 지수 표기법
scientific = 1.5e10   # 1.5 * 10^10
small = 2.5e-4        # 0.00025

# 특수 값
import math
inf = float('inf')    # 무한대
neg_inf = float('-inf')
nan = float('nan')    # Not a Number

# 확인
math.isinf(inf)       # True
math.isnan(nan)       # True

복소수 (complex)

# 복소수 리터럴 (j 사용)
c1 = 3 + 4j
c2 = 2 - 1j

# 복소수 생성
c3 = complex(3, 4)    # 3 + 4j

# 실수부와 허수부
print(c1.real)        # 3.0
print(c1.imag)        # 4.0

# 켤레 복소수
print(c1.conjugate()) # 3 - 4j

# 연산
print(c1 + c2)        # (5+3j)
print(c1 * c2)        # (10+5j)
print(abs(c1))        # 5.0 (크기)

기본 수학 연산

산술 연산자

a, b = 10, 3

print(a + b)    # 덧셈: 13
print(a - b)    # 뺄셈: 7
print(a * b)    # 곱셈: 30
print(a / b)    # 나눗셈: 3.333...
print(a // b)   # 정수 나눗셈: 3
print(a % b)    # 나머지: 1
print(a ** b)   # 거듭제곱: 1000

# 음수 나눗셈 주의
print(-11 // 3)   # -4 (내림)
print(-11 % 3)    # 1

내장 함수

# 절대값
abs(-5)           # 5
abs(-3.14)        # 3.14
abs(3 + 4j)       # 5.0 (복소수 크기)

# 거듭제곱
pow(2, 3)         # 8
pow(2, 3, 5)      # 3 (2**3 % 5)

# 반올림
round(3.14159)    # 3
round(3.14159, 2) # 3.14
round(2.5)        # 2 (은행가 반올림)
round(3.5)        # 4

# divmod (몫과 나머지)
divmod(10, 3)     # (3, 1)

# 최대/최소
max(1, 5, 3)      # 5
min(1, 5, 3)      # 1
max([1, 2, 3])    # 3 (리스트)

# 합계
sum([1, 2, 3, 4]) # 10
sum([1, 2, 3], 10) # 16 (초기값 10)

math 모듈

import math

기본 수학 함수

import math

# 올림, 내림
math.ceil(3.2)      # 4
math.floor(3.8)     # 3
math.trunc(3.8)     # 3 (0 방향으로 절삭)
math.trunc(-3.8)    # -3

# 절대값
math.fabs(-3.14)    # 3.14 (항상 float 반환)

# 제곱근
math.sqrt(16)       # 4.0
math.isqrt(17)      # 4 (정수 제곱근)

# 거듭제곱
math.pow(2, 3)      # 8.0

# 팩토리얼
math.factorial(5)   # 120

# 최대공약수, 최소공배수
math.gcd(12, 18)    # 6
math.lcm(12, 18)    # 36 (Python 3.9+)

# 부호 복사
math.copysign(5, -1)  # -5.0

로그 함수

import math

# 자연로그 (밑 e)
math.log(math.e)      # 1.0
math.log(10)          # 2.302...

# 밑이 있는 로그
math.log(100, 10)     # 2.0
math.log(8, 2)        # 3.0

# 편의 함수
math.log10(100)       # 2.0 (상용로그)
math.log2(8)          # 3.0

# log(1+x) - 작은 x에 대해 정확
math.log1p(0.0001)    # 0.00009999...

# 지수 함수
math.exp(1)           # 2.718... (e^1)
math.exp(2)           # 7.389... (e^2)
math.expm1(0.0001)    # exp(x) - 1, 작은 x에 정확

삼각함수

import math

# 기본 삼각함수 (라디안)
math.sin(math.pi / 2)   # 1.0
math.cos(0)             # 1.0
math.tan(math.pi / 4)   # 1.0 (근사값)

# 역삼각함수
math.asin(1)            # 1.5707... (pi/2)
math.acos(0)            # 1.5707... (pi/2)
math.atan(1)            # 0.7853... (pi/4)

# atan2 - 4사분면 고려
math.atan2(1, 1)        # 0.7853... (pi/4)
math.atan2(-1, -1)      # -2.356... (-3pi/4)

# 쌍곡선 함수
math.sinh(1)
math.cosh(1)
math.tanh(1)

# 빗변 계산
math.hypot(3, 4)        # 5.0
math.hypot(3, 4, 5)     # 7.07... (Python 3.8+)

각도 변환

import math

# 라디안 -> 도
math.degrees(math.pi)      # 180.0
math.degrees(math.pi / 2)  # 90.0

# 도 -> 라디안
math.radians(180)          # 3.14159...
math.radians(90)           # 1.5707...

수학 상수

import math

math.pi      # 3.141592653589793
math.e       # 2.718281828459045
math.tau     # 6.283185307179586 (2 * pi)
math.inf     # 무한대
math.nan     # Not a Number

특수 함수

import math

# 감마 함수
math.gamma(5)           # 24.0 (4!)
math.lgamma(5)          # log(gamma(5))

# 오차 함수
math.erf(1)             # 0.842...
math.erfc(1)            # 0.157... (1 - erf(x))

# 정수/유한 확인
math.isfinite(100)      # True
math.isfinite(float('inf'))  # False
math.isinf(float('inf'))     # True
math.isnan(float('nan'))     # True

# 가까운 값 확인
math.isclose(0.1 + 0.2, 0.3)  # True

random 모듈

import random

난수 생성

import random

# 0 이상 1 미만 실수
random.random()           # 예: 0.7234...

# 범위 내 실수
random.uniform(1.5, 5.5)  # 예: 3.245...

# 범위 내 정수 (양 끝 포함)
random.randint(1, 10)     # 예: 7

# 범위 내 정수 (끝 미포함)
random.randrange(0, 10)   # 0-9
random.randrange(0, 10, 2) # 0, 2, 4, 6, 8 중 하나

시퀀스에서 선택

import random

items = ['a', 'b', 'c', 'd', 'e']

# 하나 선택
random.choice(items)      # 예: 'c'

# 여러 개 선택 (중복 없음)
random.sample(items, 3)   # 예: ['b', 'e', 'a']

# 여러 개 선택 (중복 허용, Python 3.6+)
random.choices(items, k=3)  # 예: ['a', 'a', 'c']

# 가중치 적용
weights = [1, 2, 3, 4, 5]  # 뒤로 갈수록 확률 높음
random.choices(items, weights=weights, k=3)

셔플

import random

deck = list(range(1, 53))

# 리스트 섞기 (원본 수정)
random.shuffle(deck)
print(deck)

# 원본 유지하며 섞기
shuffled = random.sample(deck, len(deck))

시드 설정

import random

# 재현 가능한 난수
random.seed(42)
print(random.random())    # 항상 같은 값

# 시스템 시간 기반 (기본값)
random.seed()

분포 함수

import random

# 정규 분포 (가우시안)
random.gauss(0, 1)        # 평균 0, 표준편차 1
random.normalvariate(0, 1)

# 균등 분포
random.uniform(0, 10)

# 삼각 분포
random.triangular(0, 10, 5)  # 최소, 최대, 최빈값

# 지수 분포
random.expovariate(1/5)   # 람다 = 1/5

# 베타 분포
random.betavariate(2, 5)

실전 예제

주사위 시뮬레이션

import random

def roll_dice(num_dice=1, sides=6):
    """주사위 굴리기"""
    return [random.randint(1, sides) for _ in range(num_dice)]

# 주사위 2개 굴리기
result = roll_dice(2)
print(f"주사위: {result}, 합계: {sum(result)}")

간단한 통계 계산

import math

def statistics(numbers):
    """기본 통계 계산"""
    n = len(numbers)
    mean = sum(numbers) / n

    # 분산
    variance = sum((x - mean) ** 2 for x in numbers) / n

    # 표준편차
    std_dev = math.sqrt(variance)

    return {
        'count': n,
        'sum': sum(numbers),
        'mean': mean,
        'min': min(numbers),
        'max': max(numbers),
        'variance': variance,
        'std_dev': std_dev
    }

data = [10, 20, 30, 40, 50]
stats = statistics(data)
for key, value in stats.items():
    print(f"{key}: {value}")

피보나치 수열

def fibonacci(n):
    """n번째 피보나치 수 계산"""
    if n <= 1:
        return n
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b

# 처음 10개
for i in range(10):
    print(fibonacci(i), end=' ')
# 출력: 0 1 1 2 3 5 8 13 21 34

소수 판별

import math

def is_prime(n):
    """소수 판별"""
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

# 1-100 사이의 소수
primes = [n for n in range(1, 101) if is_prime(n)]
print(primes)

비밀번호 생성기

import random
import string

def generate_password(length=12):
    """안전한 비밀번호 생성"""
    characters = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(random.choices(characters, k=length))
    return password

print(generate_password())
# 예: Kj#9mP&x2Lq!

타입 변환

# 정수로 변환
int(3.14)         # 3
int("42")         # 42
int("1010", 2)    # 10 (2진수)
int("ff", 16)     # 255 (16진수)

# 실수로 변환
float(3)          # 3.0
float("3.14")     # 3.14

# 복소수로 변환
complex(3)        # (3+0j)
complex(3, 4)     # (3+4j)
complex("3+4j")   # (3+4j)

# 진법 변환
bin(10)           # '0b1010'
oct(10)           # '0o12'
hex(255)          # '0xff'

참고 자료