[정글 파이썬 #4] 실전 도구 완전 정복 — Arrays, Iterators, Modules, Dates, Math (Ch.21~25)

들어가며
시리즈 1~3을 거치며 파이썬 문법의 뼈대는 완성됐다. 이제부터는 "실전에서 정말 쓰는 것들"이다. Ch.21~25는 특별한 이름이 없어 보이지만, 뜯어보면 알짜배기만 모여있다.
- Ch.21 Arrays — 파이썬에서 배열이란? (List와 뭐가 다른가)
- Ch.22 Iterators —
for문이 내부에서 어떻게 돌아가는지 - Ch.23 Modules — 코드를 파일로 쪼개는 방법
- Ch.24 Dates — 날짜·시간 다루기 (
datetime) - Ch.25 Math — 수학 함수 총정리
C로 따지면 #include로 가져오는 헤더파일 개념, 표준 라이브러리 함수들에 해당한다. 파이썬이 얼마나 "배터리 포함(batteries included)" 철학을 갖고 있는지 이번 챕터에서 확실히 느낄 수 있다.
__iter__/__next__), import 시스템, datetime 포맷, math 모듈1. Arrays — 파이썬에서 배열은 List다 Ch.21
C를 배운 사람이라면 "배열(Array)"이라는 단어에 익숙하다. int arr[5] = {{0,1,2,3,4}}; 같은 형태. 그런데 파이썬에는 내장 배열 타입이 없다. 놀랍게도 W3Schools의 Ch.21 "Arrays"는 사실상 List를 배열처럼 쓰는 법이다.
array 내장 모듈이나 NumPy를 써야 한다. W3Schools Ch.21은 그냥 리스트 복습에 가깝다.1.1 배열 생성 및 기본 접근
C에서는 타입과 크기를 명시해야 했다. 파이썬에서는 대괄호만 있으면 끝이다:
# C: char* cars[] = {"Ford", "Volvo", "BMW"};
# Python:
cars = ["Ford", "Volvo", "BMW"]
print(cars[0]) # Ford — 0-index는 동일
cars[0] = "Toyota" # 수정도 간단
print(len(cars)) # 3
1.2 배열(리스트) 순회, 추가, 제거
cars = ["Toyota", "Volvo", "BMW"]
# 순회
for car in cars:
print(car)
# 추가
cars.append("Honda") # 끝에 추가
print(cars) # ['Toyota', 'Volvo', 'BMW', 'Honda']
# 제거
cars.pop(1) # 인덱스로 제거 → 'Volvo' 삭제
cars.remove("Honda") # 값으로 제거
print(cars) # ['Toyota', 'BMW']
| 항목 | C 배열 | Python List (배열 역할) |
|---|---|---|
| 선언 | int arr[5]; |
arr = [1,2,3,4,5] |
| 크기 | 고정 (컴파일 시 결정) | 동적 (언제든 변경 가능) |
| 타입 | 단일 타입만 | 혼합 타입 가능 |
| 길이 조회 | sizeof(arr)/sizeof(arr[0]) |
len(arr) |
| 요소 추가 | 불가 (realloc 필요) | arr.append(x) |
| 요소 삭제 | 직접 구현 필요 | arr.pop(i) / remove(v) |
2. Iterators — for문의 비밀이 여기 있다 Ch.22

Python의 for문이 어떻게 돌아가는지 궁금했던 적 없나? 리스트든, 문자열이든, 심지어 직접 만든 클래스든 — for x in something:이 작동하는 건 이터레이터 프로토콜 덕분이다.
2.1 Iterable vs Iterator
먼저 두 개념을 구분해야 한다:
| 개념 | 설명 | 예시 |
|---|---|---|
| Iterable | 순회 가능한 객체.iter()를 호출할 수 있음 |
list, tuple, dict, set, str |
| Iterator | next()로 값을 하나씩 꺼낼 수 있는 객체.__iter__와 __next__ 구현 |
iter(my_list)의 결과물 |
# 튜플 → iter() 호출 → 이터레이터 획득
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit)) # apple
print(next(myit)) # banana
print(next(myit)) # cherry
# print(next(myit)) → StopIteration 예외 발생!
# 문자열도 iterable
mystr = "hello"
myit2 = iter(mystr)
print(next(myit2)) # h
print(next(myit2)) # e
for x in my_list:를 실행하면 Python은 내부적으로 iter(my_list)를 호출해서 이터레이터를 만들고, StopIteration이 발생할 때까지 계속 next()를 호출한다.2.2 커스텀 이터레이터 만들기
__iter__와 __next__를 구현하면 어떤 클래스도 이터레이터가 된다:
class CountUp:
# 1부터 시작해서 1씩 올라가는 이터레이터
def __iter__(self):
self.current = 1
return self # self를 반환하는 게 포인트!
def __next__(self):
if self.current <= 5:
val = self.current
self.current += 1
return val
else:
raise StopIteration # 종료 신호
counter = CountUp()
for n in counter:
print(n, end=" ") # 1 2 3 4 5
2.3 StopIteration — 왜 예외로 종료하나?
class MyRange:
# range()와 비슷한 커스텀 이터레이터
def __init__(self, start, stop):
self.current = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current >= self.stop:
raise StopIteration # 여기서 for문이 조용히 종료됨
val = self.current
self.current += 1
return val
for x in MyRange(0, 4):
print(x) # 0 1 2 3
// C: 명시적 인덱스 제어
for (int i = 0; i < n; i++) { arr[i]; }
# Python 내부 동작 (for문이 자동으로 하는 일):
it = iter(arr)
while True:
try: x = next(it)
except StopIteration: break
Python의 for문은 사실 이 while 루프를 자동화한 것이다. Generator와 연결하면 지연 평가(lazy evaluation)도 가능해진다.3. Modules — 코드를 파일로 쪼개는 기술 Ch.23

프로그램이 커질수록 하나의 파일에 모든 코드를 넣는 건 불가능하다. C에서는 .h 헤더파일과 .c 소스파일로 나눴다. 파이썬에서는 모듈(Module)이 그 역할을 한다 — 그냥 .py 파일 하나가 모듈이다.
3.1 모듈 만들고 사용하기
# --- mymodule.py ---
def greeting(name):
print(f"안녕하세요, {name}님!")
person1 = {
"name": "홍길동",
"age": 30,
"country": "Korea"
}
# --- main.py ---
import mymodule
mymodule.greeting("정글러") # 안녕하세요, 정글러님!
print(mymodule.person1["age"]) # 30
3.2 별칭(alias) — as 키워드
모듈 이름이 길 때는 as로 줄임말을 쓸 수 있다. numpy as np, pandas as pd가 대표적이다:
import mymodule as mx # 별칭 설정
print(mx.person1["name"]) # 홍길동
# 실제로 많이 쓰는 패턴:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
3.3 내장 모듈 사용
import platform
print(platform.system()) # Windows / Linux / Darwin
print(platform.python_version()) # 3.x.x
# dir()로 모듈의 모든 속성/함수 목록 확인
print(dir(platform))
3.4 from ... import — 필요한 것만 가져오기
# 모듈 전체가 아닌 특정 이름만 import
from mymodule import person1
print(person1["name"]) # 모듈명 없이 직접 사용!
# 여러 개 동시에
from math import sqrt, pi, ceil
print(sqrt(16)) # 4.0
print(pi) # 3.14159...
| import 방식 | 사용 방법 | 주의사항 |
|---|---|---|
import mod |
mod.func() |
이름 충돌 없음, 명시적 |
import mod as m |
m.func() |
긴 이름 줄이기에 유용 |
from mod import func |
func() |
이름 충돌 주의 |
from mod import * |
func() |
⚠️ 권장하지 않음 — 어떤 이름이 들어오는지 불명확 |
os, sys, json, re, collections, itertools… C에서 직접 구현해야 했던 많은 것들이 이미 다 들어있다.4. Dates — datetime으로 시간 다루기 Ch.24
파이썬에는 날짜/시간 전용 내장 타입이 없다 — 대신 datetime 모듈이 있다. 실무에서 로그 타임스탬프, 날짜 계산, 포맷 변환에 필수적으로 쓰인다.
4.1 현재 날짜·시간 가져오기
import datetime
now = datetime.datetime.now()
print(now) # 2026-03-07 15:42:31.123456
print(now.year) # 2026
print(now.month) # 3
print(now.day) # 7
print(now.hour) # 15
print(now.strftime("%A")) # Friday (요일 이름)
4.2 날짜 객체 직접 생성
import datetime
# datetime(년, 월, 일, 시=0, 분=0, 초=0)
d = datetime.datetime(2026, 3, 7)
print(d) # 2026-03-07 00:00:00
# 날짜만 필요할 때
today = datetime.date.today()
print(today) # 2026-03-07
4.3 strftime() — 날짜를 문자열로
"string format time"의 줄임말. 날짜 객체를 원하는 형식의 문자열로 변환한다:
import datetime
d = datetime.datetime(2026, 3, 7, 15, 30, 0)
print(d.strftime("%Y-%m-%d")) # 2026-03-07
print(d.strftime("%Y년 %m월 %d일")) # 2026년 03월 07일
print(d.strftime("%A, %B %d, %Y")) # Friday, March 07, 2026
print(d.strftime("%H:%M:%S")) # 15:30:00
print(d.strftime("%I:%M %p")) # 03:30 PM (12시간제)
| 포맷 코드 | 의미 | 예시 출력 |
|---|---|---|
%Y |
4자리 연도 | 2026 |
%m |
2자리 월 | 03 |
%d |
2자리 일 | 07 |
%H |
24시간 시 | 15 |
%M |
분 | 30 |
%S |
초 | 00 |
%A |
요일 전체 | Friday |
%B |
월 이름 전체 | March |
%j |
연중 몇 번째 날 | 066 |
4.4 날짜 계산 — timedelta
import datetime
today = datetime.date.today()
delta = datetime.timedelta(days=30)
future = today + delta
print(future) # 30일 후 날짜
# 날짜 차이 계산
start = datetime.date(2026, 1, 1)
end = datetime.date(2026, 3, 7)
diff = end - start
print(diff.days) # 65 (일수 차이)
datetime.datetime.now().strftime("%Y%m%d_%H%M%S") → 20260307_153000 형식으로 파일명 충돌 없이 사용 가능하다.5. Math — 수학 함수 총정리 Ch.25
파이썬에는 수학 함수가 두 단계로 나뉜다: 내장 함수(별도 import 불필요)와 math 모듈(import 필요). 알고리즘 문제를 풀 때 둘 다 자주 쓰인다.
5.1 내장 수학 함수 (import 없이 바로 사용)
# min / max
print(min(5, 10, 25)) # 5
print(max(5, 10, 25)) # 25
print(min([3, 1, 4, 1, 5])) # 1 — 리스트도 가능
# abs — 절대값
print(abs(-7.25)) # 7.25
# pow — 거듭제곱
print(pow(4, 3)) # 64 (4^3)
print(pow(2, 10)) # 1024 (2^10)
# round — 반올림
print(round(3.14159, 2)) # 3.14
# sum — 합계
print(sum([1, 2, 3, 4, 5])) # 15
5.2 math 모듈의 핵심 함수들
import math
# 제곱근
print(math.sqrt(64)) # 8.0
# 올림 / 내림 / 버림
print(math.ceil(1.4)) # 2
print(math.floor(1.9)) # 1
print(math.trunc(3.9)) # 3 (0 방향으로)
# 상수
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
print(math.inf) # inf (무한대)
# 로그
print(math.log(100, 10)) # 2.0 (log₁₀ 100)
print(math.log2(8)) # 3.0 (log₂ 8)
# 팩토리얼 / 조합 / 최대공약수
print(math.factorial(5)) # 120
print(math.gcd(48, 18)) # 6
print(math.comb(5, 2)) # 10 (5C2) — Python 3.8+
print(math.perm(5, 2)) # 20 (5P2) — Python 3.8+
5.3 알고리즘 문제에서 자주 쓰는 패턴
import math
# 소수 판별 — sqrt로 범위 축소
def is_prime(n):
if n < 2:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
print(is_prime(17)) # True
print(is_prime(18)) # False
# 최대공약수 → 최소공배수
a, b = 12, 18
gcd = math.gcd(a, b) # 6
lcm = a * b // gcd # 36
print(f"GCD: {gcd}, LCM: {lcm}")
# 무한대 초기값 (최솟값 탐색에 유용)
min_val = math.inf
for x in [5, 3, 8, 1, 9]:
if x < min_val:
min_val = x
print(min_val) # 1
| 함수 | 모듈 | 설명 |
|---|---|---|
min() / max() |
내장 | 최솟값 / 최댓값 |
abs() |
내장 | 절대값 |
pow(x, y) |
내장 | x^y |
round() |
내장 | 반올림 |
sum() |
내장 | 합계 |
math.sqrt() |
math | 제곱근 (float 반환) |
math.ceil/floor/trunc() |
math | 올림/내림/버림 |
math.pi / math.e |
math | 원주율 / 자연로그 밑 |
math.gcd() |
math | 최대공약수 |
math.factorial() |
math | 팩토리얼 |
math.log(x, base) |
math | 로그 |
math.comb(n, k) |
math | 조합 nCk (3.8+) |
math.inf |
math | 무한대 |
C vs Python — Ch.21~25 한눈에 비교
| 개념 | C 방식 | Python 방식 |
|---|---|---|
| 배열 | int arr[N]; 고정 크기 |
List — 동적, 혼합 타입 |
| 배열 순회 | for(i=0; i<n; i++) |
for x in arr: |
| 순회 내부 구조 | 인덱스 직접 제어 | 이터레이터 프로토콜 자동화 |
| 파일 분리 | #include "header.h" |
import module |
| 날짜/시간 | <time.h> + 복잡한 구조체 |
datetime.datetime.now() |
| 제곱근 | #include <math.h> + sqrt() |
math.sqrt() 또는 x**0.5 |
| 최대공약수 | 직접 구현 (유클리드) | math.gcd(a, b) |
| 무한대 | INT_MAX / INFINITY |
math.inf / float('inf') |
마무리
Ch.21~25를 지나며 가장 인상 깊었던 건 두 가지다.
하나, 이터레이터 프로토콜. for문 뒤에 이런 정교한 설계가 있다는 걸 몰랐다. __iter__와 __next__만 구현하면 어떤 객체든 for문에 꽂을 수 있다는 게 파이썬 다형성의 핵심이라는 걸 느꼈다.
둘, 표준 라이브러리의 풍요로움. C에서 날짜 계산이나 수학 함수를 쓰려면 헤더 찾고, 링크 설정하고, 플랫폼별 차이도 신경 써야 했다. 파이썬에서는 그냥 import datetime, import math로 끝난다. "배터리 포함" 철학이 이런 거구나.
다음 편(#5)에서는 OOP — 클래스와 상속이다. 파이썬의 객체지향이 C의 구조체와 얼마나 다른지, 진짜 차이를 파헤쳐볼 예정이다.
읽어주셔서 감사합니다 🌿 틀린 내용이나 보완할 점 댓글로 알려주시면 바로 수정하겠습니다!
Krafton Jungle 2주차 파이썬 튜토리얼 시리즈 | GitHub Repository
'개발 > 공부 기록' 카테고리의 다른 글
| CSAPP 11장 공부 기록 1편 : 네트워크 바깥세상: 장비, 주소, 캡슐화 (1) | 2026.04.23 |
|---|---|
| 컴퓨터 시스템 9장 핵심 정리 (1) | 2026.04.16 |
| [파이썬 기초 문법 총정리 #3] 제어문과 함수 완전 정복 — if, while, for, def, lambda (Ch.16~20) (1) | 2026.03.08 |
| [파이썬 기초 문법 총정리 #2] 자료구조 4총사 완전 정복 — List, Tuple, Set, Dict (Ch.12~15) (0) | 2026.03.08 |
| [파이썬 기초 문법 총정리#1] — C 출신이 처음 파이썬 보면 낯선 것들 (W3Schools Ch.01~11) (0) | 2026.03.08 |