Github blog a production story
Shortcut
파이썬(Python) 04 : 자료형 - 문자열 자료형
문자열 자료형
문자열(string)이란 연속된 문자들의 나열이다.
큰 따옴표(“)로 둘러쌓여 있는 것은 문자열이라고 보면 된다.
“ABCD” “g” “123”
"Hello World"
'Python is fun'
"""Life is too short, You need python"""
'''Life is too short, You need python'''
>>> food = "Python's favorite food is perl"
>>> food
"Python's favorite food is perl"
>>> food = 'Python's favorite food is perl'
File "<stdin>", line 1
food = 'Python's favorite food is perl'
^
SyntaxError: invalid syntax
>>> say = '"Python is very easy." he says.'
>>> say
'"Python is very easy." he says.'
>>> food = 'Python\'s favorite food is perl'
>>> food
"Python's favorite food is perl"
>>> say = "\"Python is very easy.\" he says."
>>> say
'"Python is very easy." he says.'
>>> multiline = "Life is too short\nYou need python"
>>> print(multiline)
Life is too short
You need python
>>> multiline = '''
... Life is too short
... You need python
... '''
>>> print(multiline)
Life is too short
You need python
이스케이프 코드 이스케이프(escape) 코드란 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 ‘문자 조합’을 말한다. 주로 출력물을 보기 좋게 정렬하는 용도로 사용한다. 몇 가지 이스케이프 코드를 정리하면 다음과 같다.
코드 | 설명 |
---|---|
\n |
문자열 안에서 줄을 바꿀 때 사용 |
\t |
문자열 사이에 탭 간격을 줄 때 사용 |
\\ |
\ 를 그대로 표현할 때 사용 |
\' |
작은따옴표(‘)를 그대로 표현할 때 사용 |
\" |
큰따옴표(“)를 그대로 표현할 때 사용 |
\r |
캐리지 리턴(줄 바꿈 문자, 커서를 현재 줄의 가장 앞으로 이동) |
\f |
폼 피드(줄 바꿈 문자, 커서를 현재 줄의 다음 줄로 이동) |
\a |
벨 소리(출력할 때 PC 스피커에서 ‘삑’ 소리가 난다) |
\b |
백 스페이스 |
\000 |
널 문자 |
이 중에서 활용 빈도가 높은 것은 \n
, \t
, \\
, \'
, \"
이다. 나머지는 프로그램에서 잘 사용하지 않는다.
1. 문자열 연산
>>> head = "Python"
>>> tail = " is fun!"
>>> head + tail
'Python is fun!'
>>> a = "python"
>>> a * 2
'pythonpython'
print("=" * 50)
print("My Program")
print("=" * 50)
==================================================
My Program
==================================================
>>> a = "Life is too short"
>>> len(a)
17
>>> a = "Life is too short, You need Python"
>>> a[3]
'e'
L | i | f | e | i | s | t | o | o | s | h | o | r | t | , | Y | o | u | n | e | e | d | P | y | t | h | o | n | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
2. 문자열 인덱싱
>>> a = "Life is too short, You need Python"
>>> a[0]
'L'
>>> a[-0]
'L'
>>> a[12]
's'
>>> a[-1]
'n'
>>> a[-2]
'o'
3. 문자열 슬라이싱
>>> a = "Life is too short, You need Python"
>>> >>> a[0] + a[1] + a[2] + a[3]
'Life'
>>> a[0:3]
'Lif'
>>> a[0:4]
'Life'
a[0:3]
0 <= a < 3
a[시작번호:끝번호]
>>> a[:17]
'Life is too short'
>>> a[:]
'Life is too short, You need Python'
>>> a = "20230331Rainy"
>>> date = a[:8]
>>> weather = a[8:]
>>> date
'20230331'
>>> weather
'Rainy'
>>> a = "20230331Rainy"
>>> year = a[:4]
>>> day = a[4:8]
>>> weather = a[8:]
>>> year
'2023'
>>> day
'0331'
>>> weather
'Rainy'
>>> year + ' ' + day + ' ' + weather
'2023 0331 Rainy'
>>> a = "Pithon"
>>> a[1]
'i'
>>> a[1]='y'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> a[:1] + 'y' + a[2:]
'Python'
a변수에 “Pithon” 문자열을 대입하고 a[1]의 값이 i이므로 a[1]을 y로 바꾸어 준다는 생각이다. 하지만 결과는 어떻게 나올까? 당연히 오류가 발생한다. 문자열의 요솟값은 바꿀 수 있는 값이 아니기 때문이다(그래서 문자열을 ‘변경 불가능한(immutable) 자료형’이라고도 부른다). 슬라이싱을 사용하면 “Pithon” 문자열을 ‘P’ 부분과 ‘thon’ 부분으로 나눌 수 있고, 그 사이에 ‘y’ 문자를 추가하면 ‘Python’이라는 새로운 문자열을 만들 수 있다.
4. 문자열 포매팅
문자열에서 또 하나 알아야 할 것으로는 ‘문자열 포매팅(string formatting)’이 있다. 문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법이다.
>>> "I eat %d apples." % 3
'I eat 3 apples.'
>>> print("i eat %d apples." % 3)
i eat 3 apples.
문자열 안의 숫자를 넣고 싶은 자리에 %d
문자를 넣어 주고 삽입할 숫자 3은 가장 뒤에 있는 %
문자 다음에 써 넣었다. 여기에서 %d
는 ‘문자열 포맷 코드’라고 부른다.
>>> "I eat %s apples." % "five"
'I eat five apples.'
>>> print("I eat %s apples." % "five")
I eat five apples.
문자열 안에 또 다른 문자열을 삽입하기 위해 앞에서 사용한 문자열 포맷 코드 %d
가 아닌 %s
를 썼다.
>>> num = 3
>>> "i eat %d apples." % num
'i eat 3 apples.'
>>> print("i eat %d apples." % num)
i eat 3 apples.
>>> num = 10
>>> day = "three"
>>> "I ate %d apples. So i was sick for %s days." % (num, day)
'I ate 10 apples. So i was sick for three days.'
>>> print("I ate %d apples. So i was sick for %s days." % (num, day))
I ate 10 apples. So i was sick for three days.
2개 이상의 값을 넣으려면 마지막 %
다음 괄호 안에 쉼표(,)로 구분하여 각각의 값을 넣어 주면 된다.
5. 문자열 포맷 코드
| 코드 | 설명 |
| :-: | :——————-: |
| %s | 문자열(String) |
| %c | 문자 1개(character) |
| %d | 정수(Integer) |
| %f | 부동소수(floating-point) |
| %o | 8진수 |
| %x | 16진수 |
| %% | Literal % (문자 %
자체) |
>>> "Error is %d%%." % 98
'Error is 98%.'
문자열 포맷 코드인 %d
와 %
가 같은 문자열 안에 존재하는 경우, %
를 나타내려면 반드시 %%
를 써야 한다, 하지만 문자열 안에 %d
와 같은 포매팅 연산자가 없으면 %
는 홀로 쓰여도 상관없다.
6. 포맷 코드와 숫자 함께 사용하기
6-1. 정렬과 공백
>>> "%10s" % "hi"
' hi'
%10s
는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지는 공백으로 남겨 두라는 의미이다.
반대쪽인 왼쪽 정렬은 %-10s
가 될 것이다.
>>> "%-10sjane." % 'hi'
'hi jane.'
hi를 왼쪽으로 정렬하고 나머지는 공백으로 채웠다는 것을 알 수 있다.
6-2. 소수점 표현하기
>>> "%0.4f" % 3.42134234
'3.4213'
>>> "%0.4f" % (124/23)
'5.3913'
%0.4f
에서 ‘.’는 소수점 포인트, 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수를 말한다. 소수점 포인트 앞의 숫자는 문자열의 전체 길이를 의미하는데, %0.4f
에서 사용한 숫자 0은 길이에 상관하지 않겠다는 의미이다. %0.4f
는 0을 생략하여 %.4f
처럼 사용하기도 한다.
>>> "%10.4f" % 1.23456789
' 1.2346'
위는 숫자 1.23456789를 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬하는 예를 보여 준다.
7. format 함수를 사용한 포매팅
문자열의 format 함수를 사용하면 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있다.
>>> "I eat {0} apples".format(3)
'I eat 3 apples'
>>> "I eat {0} apples".format("five")
'I eat five apples'
>>> number = 10
>>> day = "three"
>>> "I ate {0} apples. so I was sick for {1} days.".format(number, day)
'I ate 10 apples. so I was sick for three days.'
2개 이상의 값을 넣을 경우, 문자열의 {0}
, {1}
과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀐다. 위 예에서 {0}
은 format 함수의 첫 번째 입력값인 number, {1}
은 format 함수의 두 번째 입력값인 day로 바뀐다.
>>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
'I ate 10 apples. so I was sick for 3 days.'
{0}
, {1}
과 같은 인덱스 항목 대신 더 편리한 {name}
형태를 사용하는 방법도 있다. {name}
형태를 사용할 경우, format 함수에는 반드시 name=value
와 같은 형태의 입력값이 있어야 한다. 위 예는 문자열의 {number}
, {day}
가 format 함수의 입력값인 number=10, day=3
값으로 각각 바뀌는 것을 보여 주고 있다.
>>> "I ate {0} apples. so I was sick for {day} days.".format(10, day=3)
'I ate 10 apples. so I was sick for 3 days.'
>>> print("I ate {0} apples. so I was sick for {1} days.".format(number, day))
I ate 10 apples. so I was sick for three days.
>>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
'I ate 10 apples. so I was sick for 3 days.'
>>> print("I ate {0} apples. so I was sick for {day} days.".format(10, day=3))
I ate 10 apples. so I was sick for 3 days.
:<10
표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있다.
오른쪽 정렬은 :<
대신 :>
을 사용하면 된다.
:^
를 사용하면 가운데 정렬도 가능하다.
>>> "{0:<10}".format("hi")
'hi '
>>> "{0:>10}".format("hi")
' hi'
>>> "{0:^10}".format("hi")
' hi '
정렬할 때 공백 문자 대신 지정한 문자 값으로 채워 넣을 수도 있다. 채워 넣을 문자 값은 정렬 문자 <
, >
, ^
바로 앞에 넣어야 한다. 위 예에서 첫 번째 예제는 가운데(^
)로 정렬하고 빈 공간을 (=)로 채웠고, 두 번째 예제는 왼쪽(<
)으로 정렬하고 빈 공간을 !
로 채웠다.
>>> "{0:=^10}".format("hi")
'====hi===='
>>> "{0:!<10}".format("hi")
'hi!!!!!!!!'
>>> "{0:a^10}".format("hi")
'aaaahiaaaa'
format 함수를 사용해 소수점을 4자리까지만 표현하는 방법을 보여 준다. 앞에서 살펴보았던 표현식 0.4f를 그대로 사용한 것을 알 수 있다.
>>> "{0:0.4f}".format(a)
'1.2346'
>>> "{0:10.4f}".format(a)
' 1.2346'
위와 같이 자릿수를 10으로 맞출 수도 있다. 이 또한 앞에서 살펴본 10.4f의 표현식을 그대로 사용한 것을 알 수 있다.
>>> "".format()
'{ and }'
format 함수를 사용해 문자열을 포매팅할 경우, {}
와 같은 중괄호 문자를 포매팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는 위 예의 ``처럼 2개를 연속해서 사용하면 된다.
8. f 문자열 포매팅
파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 수 있다. 파이썬 3.6 미만 버전에서는 사용할 수 없는 기능이므로 주의해야 한다. 문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능을 사용할 수 있다.
>>> name = '홍길동'
>>> age = 30
>>> f'나의 이름은 {name}입니다. 나이는 {age}입니다.'
'나의 이름은 홍길동입니다. 나이는 30입니다.'
f 문자열 포매팅은 표현식을 지원하기 때문에 다음과 같은 것도 가능하다.
표현식이란 중괄호 안의 변수를 계산식과 함께 사용하는 것을 말한다.
>>> age = 30
>>> f'나는 내년이면 {age + 1}살이 된다.'
'나는 내년이면 31살이 된다.'
딕셔너리는 f 문자열 포매팅에서 다음과 같이 사용할 수 있다.
>>> d = {'name':'홍길동', 'age':30}
>>> f'나의 이름은 {d["name"]}입니다. 나이는 {d["age"]}입니다.'
'나의 이름은 홍길동입니다. 나이는 30입니다.'
딕셔너리는 Key와 Value라는 것을 한 쌍으로 가지는 자료형이다.
>>> f'{"hi":<10}' # 왼쪽 정렬
'hi '
>>> f'{"hi":>10}' # 오른쪽 정렬
' hi'
>>> f'{"hi":^10}' # 가운데 정렬
' hi '
>>> f'{"hi":=^10}' # 가운데 정렬하고 '=' 문자로 공백 채우기
'====hi===='
>>> f'{"hi":!<10}' # 왼쪽 정렬하고 '!' 문자로 공백 채우기
'hi!!!!!!!!'
>>> a = 1.23456789
>>> f'{a:0.4f}' # 소수점 4자리까지만 표현
'1.2346'
>>> f'{a:10.4f}' # 소수점 4자리까지 표현하고 총 자리수를 10으로 맞춤
' 1.2346'
>>> f''
'{ and }'
9. 문자열 관련 함수들
9-1. count
>>> a = "happy"
>>> a.count('p')
2
9-2. find
>>> a = "Python is the best choice"
>>> a.find('b')
14
>>> a.find('t')
2
>>> a.find('k')
-1
9-3. index
>>> a = "Life is too short"
>>> a.index('t')
8
>>> a.index('k')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
9-4. join
>>> ",".join('abcd')
'a,b,c,d'
>>> ",".join(['a', 'b', 'c', 'd'])
'a,b,c,d'
>>> ",".join("abcd efg")
'a,b,c,d, ,e,f,g'
9-5. upper
>>> a = "abcdefg"
>>> a.upper()
'ABCDEFG'
9-6. lower
>>> a = "ABCDEFG"
>>> a.lower()
'abcdefg'
9-7. lstrip
>>> a = " abcdefg "
>>> a.lstrip()
'abcdefg '
9-8. rstrip
>>> a = " abcdefg "
>>> a.rstrip()
' abcdefg'
9-9. strip
>>> a = " abcdefg "
>>> a.strip()
'abcdefg'
9-10. replace
>>> a = "Life is too short"
>>> a.replace("Life", "Your leg")
'Your leg is too short'
9-11. split
>>> a = "Life is too short"
>>> a.replace("Life", "Your leg")
'Your leg is too short'
>>> a = "Life is too short"
>>> a.split()
['Life', 'is', 'too', 'short']
>>> b = "a:b:c:d"
>>> b.split(':')
['a', 'b', 'c', 'd']
댓글남기기