문자열은 immutable Unicode 시퀀스
Python 의 str 은 *Unicode 코드 포인트의 시퀀스* — bytes 아님, ASCII 문자 아님. len("안녕") 이 2, 6 아님 (6 은 UTF-8 바이트 길이). 이게 어디서나 중요해 — slicing, 비교, encoding 경계에서.
문자열은 또 *immutable* (lesson 4). in-place 변경 불가; 변경처럼 보이는 모든 연산 (concatenation, replacement, case 변경) 이 *새 문자열* 생성. 일회성 연산엔 보이지 않아. 큰 문자열을 *문자 단위로 쌓는 tight loop* 에선 — 중요하고, idiom 은 "".join(parts), 반복 += 아님.
f-string — 문자열 만드는 현대적 방법
Python 3.6 부터 f-string (formatted string literal) 이 문자열 보간의 default. 문자열 앞에 f 붙이고 {expression} 사용 — expression 평가되고 embed.
f-string 은 *어떤 expression* 이든 담을 수 있어, 변수 이름만이 아니야. f"{2 + 2}" 가 "4". f"{user.name.upper()}" 동작. f"{items[0]}" 동작. expression 은 *f-string 생성 시점* 에 평가.
Python 3.12+ 에서 f-string 문법 제약 대부분 제거 — 같은 따옴표 문자 안에 nesting 가능, multi-line expression, 주석 embed. 이전 버전은 이런 거에 workaround 필요했어.
format spec 미니 언어
f-string 의 중괄호 안, 콜론 뒤에 — Python 의 *format 명세 미니 언어*. 대부분 사람들이 f-string 학습 멈추는 지점, 그리고 그건 아쉬워 — format spec 이 *너비, 정렬, padding, 정밀도, 숫자 포맷* 에 정밀 제어 줘.
흔한 패턴 — {x:.2f} float 을 소수점 2자리. {x:>10} 너비 10 우측 정렬. {x:,} 천 단위 구분자. {x:%} 백분율. {x:08b} 0 채운 8자리 2진. 여기 full DSL — 공식 명세 가 한 페이지, 한 번 읽을 가치 있어.
logger.info(f"[{request_id}] brain={brain} took {elapsed:.2f}s"). elapsed 의 :.2f 가 0.48 원할 때 절대 0.4837192847 안 찍혀. format spec 이 *지저분한 로그* 와 *깨끗한 로그* 의 차이.
문자열 메서드 — 많지만 자주 쓰는 건 몇 개
실제 코드에서 자주 보는 메서드, 빈도순:
.strip(),.lstrip(),.rstrip()— 양 끝에서 공백 (또는 명시 문자) 제거.split(sep),.rsplit(sep, maxsplit)— list 로 분리. default 는 *공백* 으로 분리..join(iterable)— split 의 역.", ".join(["a", "b"])가"a, b"..startswith(prefix),.endswith(suffix)— prefix/suffix 체크는 slicing 보다 이게 나아..replace(old, new)— 부분 문자열 대체 (regex X; 그건re모듈)..lower(),.upper(),.title(),.casefold()— 대소문자 조작. 대소문자 무시 비교는casefold가 옳은 선택 (독일어 ß 같은 edge case 처리)..find(sub),.index(sub)— 부분 문자열 위치.find는 없으면 -1,index는 raise..count(sub)— 겹치지 않는 발생 카운트..isdigit(),.isalpha(),.isalnum(),.isspace()— 문자 클래스 체크.
Slicing — 메서드 호출 없이 부분 문자열
문자열은 list 와 마찬가지로 [start:stop:step] slicing 지원. s[0] 이 첫 문자. s[-1] 이 마지막. s[1:5] 가 1 부터 4 까지 (stop 은 exclusive). s[::-1] 이 문자열 뒤집기.
여기가 Python 의 표현력이 드러나는 영역 중 하나. 문자열 뒤집기 — s[::-1]. 마지막 5 문자 — s[-5:]. 첫 2 떼기 — s[2:]. 마지막 3 떼기 — s[:-3]. 한 칸 건너 한 문자 — s[::2].
Escape 시퀀스와 raw 문자열
흔한 escape — \n 줄바꿈, \t 탭, \\ 리터럴 백슬래시, \" 큰따옴표 안 큰따옴표. Unicode escape — \u00e9 가 é, \N{GREEK SMALL LETTER ALPHA} 가 α.
백슬래시 많은 문자열 (regex 패턴, Windows 경로) 엔 raw 문자열 — 앞에 r. r"\n" 이 *문자 두 개* (백슬래시, n), 한 개 (줄바꿈) 아님. regex 패턴과 Windows 경로는 거의 항상 raw 문자열 원해.
여러 줄 문자열은 triple quote
"""...""" 또는 '''...''' 가 여러 줄 걸치고 *리터럴 줄바꿈 보존*. 함수 맨 위의 triple-quote 문자열이 *docstring* — help(func) 와 func.__doc__ 로 접근. Python 이 코드 문서화하는 방식 — quest 나머지에서 docstring 계속 써.
요약
f-string 이 현대 보간. format spec 미니 언어가 학습 가치 있어. slicing 이 메서드 호출 많이 대체. raw 문자열은 백슬래시 많은 context 용. 문자열은 *Unicode 코드 포인트 시퀀스*, bytes 아님 — 이 구분이 encoding 경계 (파일 I/O, 네트워크, 데이터베이스) 넘을 때 중요.
str.format 동작하지만 더 옛날. % 스타일은 더 옛날. f-string 은 위에서 아래로 읽혀 (변수 값이 둘러싼 텍스트와 인라인), 빠르게 실행, format spec 과 통합. 다른 스타일들은 *기존 코드 읽기* 와 매우 specific niche 용; 새 코드엔 f-string 이 답.