HOWTO · Python
Python에서 동등한 문자열 작성기
이 튜토리얼은 Python의 StringBuilder 클래스에 해당하는 것을 보여줍니다.
이 페이지의 내용
Python에는 다른 언어의 StringBuilder 클래스와 같은 내장 클래스가 없습니다. 대신 문자열 조각이 어디서 오는지에 따라 구성 방법을 선택하세요. 문자열 반복 가능 객체에는 str.join(), 개수가 정해진 소수의 조각에는 +, 조각을 하나씩 쓸 때는 io.StringIO를 사용하면 됩니다. f-string은 값을 문자열에 형식화하는 방법이며, 임의의 시퀀스를 담는 범용 버퍼는 아닙니다.
Python 문자열은 불변입니다. 내용을 바꾸는 연산은 원래 문자열을 제자리에서 수정하지 않고 새로운 문자열 값을 만듭니다. 따라서 결과 문자열을 반복해서 누적하는 방식은 일반적으로 적절하지 않을 수 있지만, 그렇다고 +를 사용할 때마다 느린 것은 아닙니다. 개수가 적고 정해진 조각을 연결할 때는 명확하고 실용적인 방법입니다.
Python에서 StringBuilder와 동등한 기능
프로그램에서 여러 조각을 모아 텍스트를 만들어야 할 때는 StringBuilder 스타일의 API가 유용합니다. Python에는 같은 목적에 쓸 수 있는 표준 도구가 있지만, 모든 경우에 대신 사용할 단일 클래스는 없습니다. 입력의 형태와 텍스트를 만드는 방식에 따라 코드를 가장 읽기 쉽게 해 주는 도구가 달라집니다.
str.join()로 조각을 모아 문자열 만들기
문자열 반복 가능 객체가 이미 있다면 구분자 문자열에서 join()을 호출하세요. 구분자는 이웃한 항목 사이에 들어가며, 맨 앞이나 맨 뒤에는 붙지 않습니다. 예를 들어 " / ".join(parts)는 값 사이에 양쪽 공백이 있는 슬래시를 넣어 연결합니다. 모든 항목은 문자열이어야 합니다. 문자열이 아닌 값은 연결하기 전에 변환하거나, 더 큰 메시지 안에 값을 표시하려면 형식화를 사용하세요.
다음 예제를 실행하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
parts = ["docs", "python", "strings"]
path = " / ".join(parts)
print(path)
docs / python / strings
이미 알고 있는 문자열 모음을 결합할 때 join()은 유용한 기본 선택입니다. 구분자를 명시하고 결과 변수를 반복해서 늘리는 루프를 작성하지 않아도 됩니다. 항상 더 빠르다는 보장은 없으므로 입력과 작업 의도에 맞는 방법으로 선택하세요.
+ 연결을 사용하기 좋은 경우
인사말에 이름을 붙이거나 레이블에 문장 부호를 더하는 것처럼 조각의 수가 적고 정해져 있을 때는 +를 사용하세요. 각 조각이 표현식에 직접 드러나므로, 연결을 위해 모음을 만드는 것보다 간단한 경우가 많습니다.
여러 번 반복되는 루프에서 result = result + piece를 계속 실행하면 문자열 값이 차례로 만들어져 불필요한 작업이 생길 수 있습니다. 문자열 조각을 모아 한 번에 연결하거나, 조각이 만들어지는 즉시 쓸 수 있다면 StringIO를 사용하세요. 실제 성능은 프로그램과 Python 구현에 따라 달라지므로, 근거 없는 보편적인 속도 순위에 따라 방법을 선택하지 마세요.
단계별로 쓰려면 io.StringIO 사용하기
텍스트를 여러 단계에 걸쳐 생성할 때 io.StringIO는 write() 메서드가 있는 메모리 내 텍스트 스트림을 제공합니다. io에서 가져와 각 문자열 조각을 쓴 다음 getvalue()를 호출하면 누적된 문자열을 얻을 수 있습니다. 서로 다른 분기나 단계에서 조각이 만들어지는 출력 중심 코드에서는 이 방식으로 코드를 더 명확하게 작성할 수 있습니다. write()에 전달하는 각 인수는 문자열이어야 합니다. 스트림의 수명을 분명히 하는 데 도움이 된다면 컨텍스트 관리자를 사용하세요. 완성된 값이 필요하면 해당 범위를 벗어나기 전에 getvalue()를 호출해야 합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
from io import StringIO
with StringIO() as output:
output.write("Hello")
output.write(", ")
output.write("Python")
message = output.getvalue()
print(message)
Hello, Python
대개 사용자 정의 래퍼는 필요하지 않습니다. 애플리케이션에 래퍼가 필요하다면 빌더마다 상태를 공유하지 않도록 버퍼를 각 인스턴스에 두세요.
f-string으로 값 형식화하기
값을 문자열로 형식화하려면 f-string을 사용하세요. 중괄호 안의 표현식은 평가된 뒤 표시용 값으로 변환되므로, 짧은 메시지를 읽기 쉽게 작성할 수 있습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
name = "Ada"
count = 3
message = f"{name} has {count} tasks."
print(message)
f-string은 값을 문자열에 삽입하는 방법이지, 임의의 조각 모음을 단계별로 덧붙이는 방법은 아닙니다. 값이 모음에 들어 있다면 문자열 항목을 준비해 join()을 사용하고, 텍스트를 여러 단계에 걸쳐 쓴다면 StringIO를 고려하세요. 이렇게 하면 형식화와 누적을 구분할 수 있습니다.
상황에 맞는 문자열 구성 방법 선택하기
- 문자열 반복 가능 객체가 있고 항목 사이에 구분자를 넣으려면
str.join()을 선택하세요. - 개수가 적고 각 조각이 명확하게 드러날 때는
+를 선택하세요. - 스트림과 비슷한 인터페이스로 텍스트를 단계별로 쓸 때는
io.StringIO를 선택하세요. - 메시지나 다른 형식화된 문자열에 몇 가지 값을 넣으려면 f-string을 선택하세요.
모든 상황에 통하는 Python의 StringBuilder 대체품은 없습니다. 조각이 제공되는 방식에 맞춰 방법을 고르고, 선택한 연산에 문자열 입력이 필요하면 값을 문자열로 변환하세요. 어떤 방법이 항상 가장 빠르다는 단정에 기대지 않고도 이 방법들을 활용해 실용적으로 텍스트를 구성할 수 있습니다.