Python의 str은 유니코드 코드 포인트의 불변 시퀀스예요.
여기에는 문자, 발음 구별 기호, 위치 지정 문자, 숫자, 통화 기호, 이모지, 문장 부호, 공백과 줄 바꿈 문자 등이 포함될 수 있어요.
문자열이 어떤 정보를 담고 있는지(즉, "컴퓨터는 어떻게 0과 1을 문자로 옮길 줄 아는 걸까요?") 자세히 알아보려면, 이 블로그 글이 오랫동안 많은 도움이 되어 왔어요.
Python 문서에는 str, bytes, re 모듈에서의 유니코드 명세 지원, 로케일에 대한 고려 사항, 인코딩과 변환에 관한 몇 가지 흔한 문제를 다루는 아주 자세한 유니코드 HOWTO도 있어요.
문자열은 모든 공통 시퀀스 연산을 지원하며, for item in <str> 또는 for index, item in enumerate(<str>) 문법으로 순회할 수 있어요.
개별 코드 포인트(길이가 1인 문자열)는 왼쪽에서 0-based index 번호로, 또는 오른쪽에서 -1-based index 번호로 참조할 수 있어요.
문자열은 <str> + <other str> 또는 <str>.join(<iterable>)로 이어 붙일 수 있고, <str>.split(<separator>)로 나눌 수 있어요.
그 밖에도 다양한 서식 지정, 조립, 템플릿화 옵션을 제공해요.
str 리터럴은 작은따옴표 ' 또는 큰따옴표 "로 선언할 수 있어요. 필요할 때 이스케이프 문자 \를 사용할 수 있어요.
>>> single_quoted = 'These allow "double quoting" without "escape" characters.'
>>> double_quoted = "These allow embedded 'single quoting', so you don't have to use an 'escape' character."
여러 줄 문자열은 ''' 또는 """로 선언해요.
>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
Line break characters, tabs and other whitespace is fully supported. Remember - The escape "\" character is also available if needed (as can be seen below).
You\'ll most often encounter multi-line strings as "doc strings" or "doc tests" written just below the first line of a function or class definition.
They\'re often used with auto documentation ✍ tools.
'''
str(<object>) 생성자를 사용하면 다른 객체로부터 문자열을 만들거나 변환할 수 있어요.
>>> my_number = 42
>>> str(my_number)
...
"42"
str(<object>) 생성자로 문자열을 변환할 수는 있지만, 객체를 순회하지 않고 풀어내지도 않아요.
이는 list(), set(), dict(), tuple() 같은 다른 데이터 타입의 생성자 동작과 다르며, 예상치 못한 결과를 낳을 수 있어요.
>>> numbers = [1,3,5,7]
>>> str(numbers)
...
'[1,3,5,7]'
str 안의 코드 포인트는 왼쪽에서 0-based index 번호로 참조할 수 있어요.
creative = '창의적인'
>>> creative[0]
'창'
>>> creative[2]
'적'
>>> creative[3]
'인'
인덱싱은 오른쪽에서도 되는데, -1-based index부터 시작해요.
creative = '창의적인'
>>> creative[-4]
'창'
>>> creative[-2]
'적'
>>> creative[-1]
'인'
Python에는 별도의 "문자"나 "룬" 타입이 없어요. 그래서 문자열을 인덱싱하면 길이가 1인 새로운 str이 나와요.
>>> website = "exercism"
>>> type(website[0])
<class 'str'>
>>> len(website[0])
1
>>> website[0] == website[0:1] == 'e'
True
부분 문자열은 _슬라이스 표기법_으로 선택할 수 있는데, <str>[<start>:<stop>:<step>]을 사용해 새로운 문자열을 만들어요.
결과에는 stop 인덱스가 포함되지 않아요.
start를 주지 않으면 시작 인덱스는 0이 돼요.
stop을 주지 않으면 stop 인덱스는 문자열의 끝이 돼요.
moon_and_stars = '🌟🌟🌙🌟🌟⭐'
>>> moon_and_stars[1:4]
'🌟🌙🌟'
>>> moon_and_stars[:3]
'🌟🌟🌙'
>>> moon_and_stars[3:]
'🌟🌟⭐'
>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'
>>> moon_and_stars[:-3]
'🌟🌟🌙'
문자열은 <str>.split(<separator>)로 더 작은 문자열로 나눌 수도 있는데, 부분 문자열의 list를 반환해요.
<str>.split()을 인자 없이 사용하면 공백을 기준으로 문자열을 나눠요.
>>> cat_ipsum = "Destroy house in 5 seconds command the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'command', 'the', 'hooman.']
>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(',')
...
['feline', ' four-footed', ' ferocious', ' furry']
>>> colors = """red,
orange,
green,
purple,
yellow"""
>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']
문자열은 + 연산자로 이어 붙일 수 있어요.
이 방법은 성능이 좋지 않고 유지 관리도 쉽지 않으니 아껴 쓰는 게 좋아요.
language = "Ukrainian"
number = "nine"
word = "дев'ять"
sentence = word + " " + "means" + " " + number + " in " + language + "."
>>> print(sentence)
...
"дев'ять means nine in Ukrainian."
list, tuple, set 또는 개별 문자열들의 다른 컬렉션을 하나의 str로 합쳐야 한다면, <str>.join(<iterable>)이 더 나은 선택이에요.
# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"] # Lists are iterable.
>>> ' '.join(chickens)
'hen egg rooster'
# Any string can be used as the joining element.
>>> ' :: '.join(chickens)
'hen :: egg :: rooster'
>>> ' 🌿 '.join(chickens)
'hen 🌿 egg 🌿 rooster'
# Any iterable can be used as input.
>>> flowers = ("rose", "daisy", "carnation") # Tuples are iterable.
>>> '*-*'.join(flowers)
'rose*-*daisy*-*carnation'
>>> flowers = {"rose", "daisy", "carnation"} # Sets are iterable, but output order is not guaranteed.
>>> '*-*'.join(flowers)
'rose*-*carnation*-*daisy'
>>> phrase = "This is my string" # Strings are iterable, but be careful!
>>> '..'.join(phrase)
'T..h..i..s.. ..i..s.. ..m..y.. ..s..t..r..i..n..g'
# Separators are inserted **between** elements, but can be any string (including spaces).
# This can be exploited for interesting effects.
>>> under_words = ['under', 'current', 'sea', 'pin', 'dog', 'lay']
>>> separator = ' ⤴️ under' # Note the leading space, but no trailing space.
>>> separator.join(under_words)
'under ⤴️ undercurrent ⤴️ undersea ⤴️ underpin ⤴️ underdog ⤴️ underlay'
# The separator can be composed different ways, as long as the result is a string.
>>> upper_words = ['upper', 'crust', 'case', 'classmen', 'most', 'cut']
>>> separator = ' 🌟 ' + upper_words[0] # This becomes one string, similar to ' ⤴️ under'.
>>> separator.join(upper_words)
'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'
문자열은 모든 공통 시퀀스 연산을 지원해요.
개별 코드 포인트는 for item in <str>로 루프를 돌며 순회할 수 있어요.
항목과 함께 인덱스도 for index, item in enumerate(<str>)로 루프를 돌며 순회할 수 있어요.
>>> exercise = 'လေ့ကျင့်'
# Note that there are more code points than perceived glyphs or characters.
# Care should be used when iterating over languages that use
# combining characters, or when dealing with emoji.
>>> for code_point in exercise:
... print(code_point)
...
လ
ေ
့
က
ျ
င
်
့
# Using enumerate will give both the value and index position of each element.
>>> for index, code_point in enumerate(exercise):
... print(index, ": ", code_point)
...
0 : လ
1 : ေ
2 : ့
3 : က
4 : ျ
5 : င
6 : ်
7 : ့
Python은 검색, 정리, 분할, 변환, 번역 등 여러 작업을 도와주는 풍부한 문자열 메서드를 제공해요. 이 중 일부 메서드는 다른 연습 문제에서 다뤄요.
Python은 문자열 서식 지정과 템플릿화를 위한 풍부한 도구뿐만 아니라, re (정규 표현식), difflib (시퀀스 비교), textwrap 모듈을 통한 더 정교한 텍스트 처리 기능도 제공해요. Python에서의 문자열 서식 지정에 관한 훌륭한 입문 자료는 Real Python의 이 글을 참고해요. 문자열 메서드 입문은 같은 사이트의 Strings and Character Data in Python을 참고해요.
str(텍스트 시퀀스) 외에도, Python에는 이진 데이터 서비스에 요약되어 있는 이진 시퀀스 타입이 있어요. 즉, bytes(이진 시퀀스), bytearray, 그리고 이진 데이터를 효율적으로 저장하고 다루기 위한 memoryview예요.
또한 Streams를 사용하면 콜백 없이 네트워크 연결을 통해 이진 데이터를 주고받을 수 있어요.