문자형 자료(인덱싱, 슬라이싱, 포매팅)
· 문자형 자료
문자형 자료는 대체로 "" 또는 '' 등으로 둘러싸여 있는 것들을 말한다.
예를 들어 "안녕하세요" 혹은 '반가워요' 등이 모두 문자열이다. 파이썬에서 주석처리를 할 때 사용하는 """ 연속 따음표도 문자열로써 인식을 한다. 이는 여러 줄의 데이터를 입력할 때 굉장히 유용하다.
다만 영문자의 경우에는 '를 사용하기 때문에 항상 이 점을 인지하고 데이터를 입력해야 한다.
아래의 예시와 같이 항상 " "을 이용해서 '를 감싸주어야 한다. 밖깥부분을 ' '을 이용해서 감싸는 경우 문자열이 끊기게 된다.
<예시>
print("I'm a bit dry.")
<잘못된 예시>
가운데 문자들은 전부 문자형 데이터로써 인식하지 못하고 있다.
print('I'm a bit dry.')
· 문자열의 연산
문자열도 숫자에서 사용하는 연산 기호로 여러가지 표현이 가능하다.
(1) 문자열의 합
문자열에서의 합은 수학에서 생각하는 덧셈이라기 보다는 서로 붙이는 느낌이다.
<예시>
a = "It's very"
b = " hot today."
print(a + b)
<결과>
It's very hot today. |
(2) 문자열의 곱
문자열의 곱은 수학에서 사용하는 곱보다는 문자열의 반복 출력을 의미한다.
<예시>
print("It's very hot today." * 3)
<결과>
It's very hot today.It's very hot today.It's very hot today. |
(3) 문자열의 길이
파이썬의 기본적으로 제공하는 len함수는 length의 줄임말로 문자열의 길이를 숫자로 알려준다.
<예제>
a = 'How is the weather today?'
print(len(a))
<결과>
25
· 문자열 인덱싱과 슬라이싱
a = 'How is the weather today?'
컴퓨터에서 문자열을 인식할 때 자리수는 1부터가 아니라 0부터 시작한다.
· 인덱싱
H | o | w | i | s | t | h | e | w | e | a | t | h | e | r | t | o | d | a | y | ? | ||||
0 | 1 | 2 | ||||||||||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 |
2행은 십의 자리의 숫자를 말하고 3행은 일의 자리의 숫자를 말한다. 이제 특정 위치의 문자를 출력해보면 다음과 같다. (여기서 특정 문자를 출력하는 것이 바로 인덱싱이다. = 무엇인가를 (특정) 가르킨다.)
<예시>
print(a[4])
<결과>
i
4번째 자리의 글자인 'i'가 출력되었다.
여기서 '-'를 이용해서 출력할 수도 있다. 바로 역순의 자릿수인데 -0은 0과 같기 때문에 -0으로 해도 역순 출력은 하지 않는다.
<예시>
print(a[4], a[-1])
<예시>
i ?
역순의 첫 번째는 '?'이기 때문에 물음표가 출력되었다.
· 슬라이싱
문자열의 슬라이싱이란 한 문자만 뽑는 것이 아니라 단어를 범위로 뽑아내는 방법으로 다음과 같다.
<예시>
print(a[11:18])
<결과>
weather
여기서 약간 의아한 점을 볼 수 있다.
'r'의 자릿수는 17인데 왜 범위를 지정하는 [11:18]에서는 17이 아니라 18이 들어갔을까? 이것은 컴퓨터가 처음 시작하는 숫자는 '<=' 으로 시작하지만 마지막 자리는 '<' 이기 때문에 범위 지정의 마지막 자릿수는 +1를 해주어야 한다. 즉 수식으로 표현하면 출력해야되는 문자열은 11<=로 시작해서 <18인 것이다.
또 다른 방법으로는
<예시>
print(a[:11]); print(a[11:]) # 한 줄에 연속으로 명령문을 쓸 때는 ';'을 사용한다.
# 첫 문장부터 10번째까지 출력, 11번째부터 문장의 끝까지 출력
print(a[0::2]) # 0번째부터 문장 끝까지 출력, 2번씩 건너 띄며 출력
만약 a[:] 으로 출력한다면 그냥 모든 문자열이 다 출력된다.
<결과>
How is the
weather today?
Hwi h ete oa?
· 특정 자릿수의 문자를 바꾸는 방법?
보통 문자열의 글자를 바꿀 때 아래와 같은 예시대로 하는 경우가 있다. 하지만 이는 옳바른 방법이 아닌다.
str 즉, 문자열은 immutable(불변)한 자료형이기 때문이다.
<예시>
a[19] = 'm'
print(a)
<결과>
a[19] = 'm'
TypeError: 'str' object does not support item assignment
변수를 새롭게 다시 지정해주거나, 특정 문자열을 추출하여 다른 문자열과 결합하는 형태로 새로운 문장을 만들어주어야 한다. 아니면 특정 자리의 값만 자주 바뀐다면 바로 앞 글에서 소개한 문자열 포매팅을 이용하면 된다.
· 문자열 포매팅
(1) .format
이 format기능에는 {}을 이용해서 특정 공간에 내용을 추가해줄 수 있다.
매번 출력값이 바뀌는 문장에 사용하면 좋다.
<예시>
a = '{0:<10}'.format('special') # 왼쪽 정렬, 문자열을 총 10으로 맞춘다.
print(a)
a = '{0:>10}'.format('special') # 오른쪽 정렬, 문자열을 총 10으로 맞춘다.
print(a)
a = '{0:^10}'.format('special') # 가운데 정렬, 문자열을 총 10으로 맞춘다.
print(a)
<결과>
special
special
special
특정 공백을 채울 수도 있다.
<예시>
a = '{0:!^10}'.format('special') # 가운데 정렬하고 10자리 확보하고 공백을 !로 채운다.
print(a)
a = '{0:!<10}'.format('special') # 왼쪽 정렬, 10자리확보, 공백을 !로 확보
print(a)
<결과>
!special!!
special!!!
포매팅의 내용을 좀 더 추가해서 다음과 같은 표현도 가능하다.
<예시>
a = 3.424242
print('{0:10.3f}'.format(a)) # 0에 a변수가 들어가고, 10자리 출력과 소수점은 3자리까지 출력한다.
<결과>
3.424
포매팅에 사용하는 { } 를 출력하기 위해서는 다음과 같이 한다.
<예시>
print('{{ print!! }}'.format())
print("앞으로 {}일 남았습니다. {}고객님".format(30, "이승민"))
.format()에 들어있는 값들은 순서대로 0부터 시작한다.(자릿수)
그러므로 추가해줄 문장의 {}안에 자릿수를 입력하여 {0} 이런 형태로 입력하면, 순서대로 대입되는게 아니라 사용자가 임의로 데이터를 넣을 수 있다.
<결과>
{ print!! }
앞으로 30일 남았습니다. 이승민고객님
format함수의 괄호가 공백이기 때문에 중괄호 내의 내용이 그대로 출력되었다.
파이썬 3.6 버전 이상부터는 앞에 f 접두사를 이용해서 편리하게 사용할 수도 있다.
<예시>
area = '서울'
print(f'나는 {area}에 살고 있습니다.')
<결과>
나는 서울에 살고 있습니다.
(2) 문자열 포맷 코드 이용
문자열에는 포맷 코드라는 것이 존재하는데 이를 이용하면 위에서 사용한 .format처럼 자료를 입력할 수 있다.
<예시>
print("I live %s to its fullest." %"life")
print("I wish you all the best in %d."%2022)
<결과>
I live life to its fullest. I wish you all the best in 2022. |
%에는 변수를 넣어줄 수 도 있다. 만약 98% 등의 숫자를 입력하고 싶다면, %d%%에 %98를 넣어주어야 한다.
복수의 값을 넣고 싶다면 처음에 나왔던 .format을 이용하면 된다.