본문 바로가기
C.W.K.
Stream
Lesson 06 of 07 · published

문자열은 글자와 바이트 사이의 경계야

~25 min · str, f-string, format, slicing, unicode, encoding, raw-string, escape

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

Python의 문자열은 Unicode 글자열이야

str은 사람이 읽는 글자를 담고, bytes는 저장·전송되는 바이트를 담아. 둘 사이를 오갈 때는 인코딩과 디코딩을 명시해야 해. 글자 수와 UTF-8 바이트 수가 다를 수 있다는 감각이 파일과 네트워크에서 중요해져.

문자열을 만드는 여러 방법

작은따옴표와 큰따옴표는 같은 역할을 하고, 세 따옴표는 여러 줄을 담아. 역슬래시는 줄바꿈 같은 이스케이프를 만들며, 정규식이나 Windows 경로처럼 역슬래시가 많은 곳에서는 원시 문자열이 읽기 편해.

f-string과 서식 지정

f-string은 문자열 안에 표현식을 넣는 기본 방법이야. 서식 지정 언어로 폭, 정렬, 채움, 소수 자릿수, 천 단위 구분, 백분율, 진법을 표현할 수 있어. 값과 표시 형식을 한 자리에서 읽을 수 있다는 게 장점이야.

메서드와 슬라이스

strip, split, join, replace, 대소문자 메서드는 새 문자열을 돌려줘. 문자열은 불변이므로 원본을 제자리에서 고치지 않아. s[start:stop:step] 슬라이스로 일부를 고르거나 뒤집을 수 있어.

원칙: 내부에서는 Unicode 문자열로 생각하고, 파일·소켓 같은 경계에서만 인코딩을 결정해.

Code

값을 문장에 넣는 f-string·python
>>> name = "피파"
>>> age = 1
>>> f"{name} 가 {age} 살"
'피파 가 1 살'

>>> # 중괄호 안 expression 동작:
>>> f"{2 + 2 = }"                       # = 가 expression 도 보여줌 (3.8+)
'2 + 2 = 4'

>>> # f-string 안 메서드 호출:
>>> f"{name.upper()}"
'피파'

>>> # 여러 줄 f-string:
>>> f'''
... 이름: {name}
... 나이: {age}
... '''
'\n이름: 피파\n나이: 1\n'
폭·정렬·정밀도를 정하는 서식 지정·python
>>> # float 고정 소수점:
>>> f"{3.14159:.2f}"
'3.14'

>>> # 너비 + 정렬 (>, <, ^):
>>> f"{'hi':>10}"      # 10 자리 우측 정렬
'        hi'
>>> f"{'hi':<10}"      # 좌측 정렬
'hi        '
>>> f"{'hi':^10}"      # 중앙 정렬
'    hi    '

>>> # 천 단위 구분자:
>>> f"{1234567:,}"
'1,234,567'

>>> # 백분율:
>>> f"{0.1234:.1%}"
'12.3%'

>>> # 2진/16진/8진 + padding:
>>> f"{42:08b}"        # 2진, 8자리, 0 padding
'00101010'
>>> f"{255:04x}"        # 16진, 4자리, 0 padding
'00ff'
자주 쓰는 문자열 메서드·python
>>> "  hello  ".strip()
'hello'

>>> "a,b,c,d".split(",")
['a', 'b', 'c', 'd']

>>> ", ".join(["a", "b", "c"])
'a, b, c'

>>> "hello.py".endswith(".py")
True

>>> "Hello World".replace("World", "Python")
'Hello Python'

>>> # 대소문자 무시 비교는 lower 보다 casefold:
>>> "Straße".lower() == "strasse".lower()
False
>>> "Straße".casefold() == "strasse".casefold()
True
슬라이스로 문자열 일부 고르기·python
>>> s = "hello world"
>>> s[0]                # 첫 문자
'h'
>>> s[-1]               # 마지막 문자
'd'
>>> s[0:5]              # 'hello' — stop 은 exclusive
'hello'
>>> s[6:]               # index 6 부터 끝까지
'world'
>>> s[:5]               # 시작부터 index 5 까지
'hello'
>>> s[::-1]             # 뒤집기
'dlrow olleh'
>>> s[::2]              # 한 칸 건너 한 문자
'hlowrd'
역슬래시가 많을 때 쓰는 원시 문자열·python
>>> # raw 문자열 없으면 백슬래시마다 escape 필요:
>>> path = "C:\\Users\\Pippa\\Documents"   # 못생김
>>> regex = "\\d+\\.\\d+"                    # 역시 못생김

>>> # raw 문자열 — 백슬래시가 자기 자신 의미:
>>> path = r"C:\Users\Pippa\Documents"
>>> regex = r"\d+\.\d+"

>>> # 주의: raw 문자열은 단일 백슬래시로 끝나면 안 돼.
>>> # r"abc\" 는 syntax error (닫는 따옴표가 escape 됨).
>>> # 끝에 백슬래시 필요하면 일반 문자열 + escape.
글자 수와 UTF-8 바이트 수 비교하기·python
>>> s = "안녕"
>>> len(s)                # Unicode 코드 포인트 수
2
>>> len(s.encode("utf-8"))   # UTF-8 바이트 수
6

>>> # slicing 할 때 — 코드 포인트 단위이지 바이트 단위가 아님:
>>> s[0]
'안'
>>> s[1]
'녕'

>>> # encoding 경계 — 파일 I/O, 네트워크, 데이터베이스:
>>> with open("hello.txt", "w", encoding="utf-8") as f:
...     f.write("안녕")
>>> # 디스크 파일은 6 바이트, Python str 은 2 문자.

External links

Exercise

item = 'USB cable', qty = 3, price = 12.5로 송장 한 줄을 만들어봐. 물품명은 20칸 왼쪽 정렬, 수량은 4칸 오른쪽 정렬, 합계는 소수 둘째 자리까지 표시해. 이어서 ' HELLO, world! '에 strip, lower, replace를 이어 붙여 'hello world!'를 만들어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.