1. 문자열 사용
2. 문자열 연산
3. format 메서드 사용
4. 문자열 인덱싱과 슬라이싱
1. 문자열 사용
1) 문자열의 나열
문자열을 콤마(,) 없이 나란히 나열하면 합쳐진 결과를 얻으며, 문자열을 콤마(,)로 구분하여 나열하면 튜플(Tuple)이 된다.
# 콤마 없이 나열
s = 'hello' 'world'
# 확인
print(s) # 공백이 의미가 없어진다. # helloworld
# 콤마로 구분해 나열
s = 'hello', 'world' # s = ('hello', 'world')와 동일하다
# 확인
print(s) # ('hello', 'world')
2) 여러 줄 문자열 표현
\n을 사용하거나 문자열 앞뒤에 따옴표 세 개를 나열하여 여러 줄 표현이 가능하다. print() 함수를 사용해야 의도한 내용이 제대로 표시됨을 기억하자!
# 여러 줄 문자열 표시
s1 = "여러 줄의 문자열을 표시할 때는 \n을 사용하세요"
print(s1)
# 결과
# 여러 줄의 문자열을 표시할 때는
# 을 사용하세요
s2 = """또 다른 방법은
큰 따옴표나 작은 따옴표를 세 개 사용하는 것입니다."""
print(s2)
# 또 다른 방법은
# 큰 따옴표나 작은 따옴표를 세 개 사용하는 것입니다.
3) 문자열에 따옴표 넣기
큰 따옴표 안에 작은 따옴표, 또는 작은 따옴표 안에 큰 따옴표를 사용하거나, \' 또는 \"를 사용해도 된다. print() 함수를 사용해야 의도한 내용이 제대로 표시됨을 기억하자!
# 문자열에 따옴표 넣기
s3 = "문자열 안에 따옴표, 예를 들어 '를 넣고 싶을 때는 이렇게 하세요."
print(s3)
# 문자열 안에 따옴표, 예를 들어 '를 넣고 싶을 때는 이렇게 하세요.
s4 = "아니면 \' 또는 \"를 사용해도 됩니다."
print(s4)
# 아니면 ' 또는 "를 사용해도 됩니다.
my_str = 'Let\'s learn Python.'
print(my_str) # Let's learn Python.
4) 문자열에 \ 넣기
이때는, \'가 하나의 도구가 된다.
# 문자열에 \ 넣기
s5 = "아니면 \\' 또는 \\\"를 사용해도 됩니다."
print(s5)
# 아니면 \' 또는 \"를 사용해도 됩니다. # \'가 하나의 도구임
2. 문자열 연산
1) 문자열 + 문자열 = 문자열 결합
# 문자열 변수
s1 = 'hello'
s2 = 'world'
# 문자열 더하기
hw = s1 + s2
# 확인
print(hw)
# helloworld
# 문자열 변수
s1 = 'hello'
s2 = 'world'
# 문자열 더하기
hw = s1 + ' ' + s2 # 공백도 더할 수 있다.
# 확인
print(hw)
# hello world
2) 문자열 * 정수 = 문자열 반복
print('**', 'hello', 'world', '**')
# ** hello world **
# 문자열에 0을 곱하면 문자열이 제거됨
s = 'hello'
print(s * 1)
# print(s * 1.5) # 에러가 난다.
print(s * 0) # 출력 안됨
print(s * 2)
print(s * -2) # 곱할 순 있지만(에러는 안나지만) 0과 같은 결과이다.
# hello
# hellohello
3. format 메서드 사용
문자열에서 이름만 변경하여 사용해야 할 때가 있다. 이때, 문자열 일부분만 바꾸면서 해당 문자열을 재사용하게 되는데, 이를 '문자열 포맷팅'이라고 하며 문자열.format() 형태로 사용한다.
1) 기본 사용법
단순 문자열에서 {}는 아무 의미가 없다. 하지만 format() 메서드를 만나게 되면 의미를 가지게 된다. format 뒤 괄호에 들어가는 순서대로 앞의 {}에 할당된다고 이해해보자. 한편, format() 메서드는 대부분 print() 함수 안에서 사용함을 기억하자.
# 변수 선언
name = '홍길동'
year = 2019
perf = 2345.6789
# 출력
print('이름:{}, 연도:{}, 실적:{}'.format(name, year, perf))
# 이름:홍길동, 연도:2019, 실적:2345.6789
2) 표시 위치 지정
{ } 안에 변수의 위치 값을 지정해야 하지만, 순서대로 사용될 것 같으면 자주 생략되기도 한다. 한편, 출력되는 값 순서 외에도 출력되는 형태(ex. 자리수) 등을 제어할 수도 있다.
# 변수 선언
name = '홍길동'
year = 2019
perf = 2345.6789
# 출력
print('이름:{0}, 연도:{1}, 실적:{2}'.format(name, year, perf)) # 이름:홍길동, 연도:2019, 실적:2345.6789
print('이름:{0}, 연도:{1}, 실적:{2:.2f}'.format(name, year, perf)) # 이름:홍길동, 연도:2019, 실적:2345.68
print('이름:{}, 연도:{}, 실적:{:,.2f}'.format(name, year, perf)) # 이름:홍길동, 연도:2019, 실적:2,345.68
print('나이 {:.1f}'.format(sum(age) / len(age)))
# 나이 23.8
3) 자릿수와 정렬 방식 지정
좀 더 세밀하게 출력 형태를 지정할 수도 있다.
# 기본 정렬
print('[{0:10}] [{1:6}]'.format('홍길동', 1200)) # 10자리를 확보하는데 6자리 남음
# 문자는 왼쪽 정렬, 숫자는 오른쪽 정렬
# [홍길동 ] [ 1200]
- 0과 1은 format() 메서드에 전달된 값들의 인덱스를 나타내며, :10과 :6은 각각의 값이 차지할 자리 수를 의미한다. 따라서 홍길동은 최소 10자리를, 1200은 최소 6자리를 차지하게 된다.
- 숫자와 문자는 정렬 방향이 여기서 다른데, 실생활에서 쓰이는 것처럼 문자는 왼쪽 정렬(가독성을 위해), 숫자는 오른쪽 정렬된다.
# 오른쪽, 왼쪽 정렬
print('[{0:>10}] [{1:<6}]'.format('홍길동', 1200)) # 화살표쪽으로 채우세요
# [ 홍길동] [1200 ]
- > : 오른쪽 정렬(값을 오른쪽 끝에 맞추고, 나머지 공간은 왼쪽에 공백을 채우자)
- < : 왼쪽 정렬(값을 왼쪽 끝에 맞추고, 나머지 공간은 오른쪽에 공백을 채우자)
# 가운데 정렬
print('[{0:^10}] [{1:^6}]'.format('홍길동', 1200))
# [ 홍길동 ] [ 1200 ]
- : 뒤의 ^는 가운데 정렬을 의미한다. 값을 가운데 정렬하고, 남는 자리는 양쪽에 공백으로 채우자!
# 공백을 다른 문자로 채우기
print('[{0:-^10}] [{1:_^6}]'.format('홍길동', 1200))
# [---홍길동----] [_1200_]
- 빈 공간을 채울 문자를 다음과 같이 지정할 수도 있다.
[참고] f-string
우리가 출력할 때 편안하게 그 위치를 잡아주려고 할 때 사용한다. 반면 format()은 다른 데에서 가져오는 값을 입력할 때 필요한 것이니 둘을 잘 구분해보자.
print(f'{age}살의 {name}의 점수는 {score:,.2f}입니다.')
# 25살의 홍길동의 점수는 2,345.68입니다.
print(f'이름: {name}')
print(f'연령대: {age_group}대')
print(f'점수: {score1}, {score2}, {score3}, {score4}, {score5}')
print(f'합계: {tot_score:,} / 평균: {avg_score:.2f}')
'''
이름: 홍길동
연령대: 20대
점수: 153, 204, 259, 221, 267
합계: 1,104 / 평균: 220.80
'''
4. 문자열 인덱싱과 슬라이싱
문자열은 문자 요소가 모여서 만들어진 자료형이다. 문자열의 인덱싱과 슬라이싱은 리스트(list)와 비슷한 특성을 지닌다. 인덱스의 값은 0부터 시작함을 잊지 말자!
- 인덱싱(Indexing): 정수형 위치 인덱스를 사용해 원하는 요소를 조회하는 것
# 문자열 변수
s = '나의살던고향은꽃피는산골'
# 0 1 2 3 4 5 6 7 8 9 10 11
# 문자열 인덱싱
print(s[2]) # 살
print(s[-2]) # 산
print(s[0]) # 나
- 슬라이싱(Slicing): 범위를 지정해 일정 범위의 요소를 조회하는 것
# 문자열 변수
s = '나의살던고향은꽃피는산골'
# 문자열 슬라이싱
print(s[0:4]) # 나의살던 # 뒤의 것 앞에 것까지만 가져온다
print(s[:4]) # 나의살던
print(s[-5:]) # 꽃피는산골
print(s[7:]) # 꽃피는산골
print(s[7:12]) # 꽃피는산골
[참고] 인덱싱으로 문자열 변경 불가
인덱싱, 슬라이싱을 사용해 문자를 변경할 수는 없다. 문자열은 변경 불가능한 데이터 형식(=자료형)이기에 인덱싱, 슬라이싱으로도 변경이 불가능하다.
# 대문자로 변환
s = 'I have a Dream.'
print(s.upper()) # I HAVE A DREAM.
# s는 바뀌지 않았다. s는 문자열로, 변경될 수 없는 값이다.
# 대문자로 바꾼 값을 반환하고 출력만하고 끝난다. 스스로가 바뀌지는 않는다.
print(s) # I have a Dream.
- upper()는 대문자로 바꾼 값을 반환하기만 할 뿐, 그것을 받아 print()는 출력만 하고 끝난다. 스스로가 바뀌지는 않는다.
# 대문자로 변환
s = 'I have a Dream.'
print(s.upper()) # I HAVE A DREAM.
# 변수에 반영
s = s.upper()
print(s) # I HAVE A DREAM.
- 변환 결과를 변수에 반영하려면 메서드가 반환하는 값을 변수에 대입해야 한다. 그러나, 이 경우에도 이전의 s와 이후의 s에 대해 id를 비교하면 주민번호는 바뀌어 있다.
1) 대/소문자 변환
- capitalize() 메서드: 문자열 첫 문자만 대문자, 나머지 모두 소문자로 변환합니다.
- title() 메서드: 단어 첫 문자만 대문자, 나머지는 모두 소문자로 변환합니다.
- upper() 메서드: 모든 문자를 대문자로 변환합니다.
- lower() 메서드: 모든 문자를 소문자로 변환합니다.
# 대/소문자 변환
s = 'I have a Dream.'
print(s.upper())
print(s.lower())
print(s.capitalize()) # 문장의 첫 글자를 대문자로 바꾼다 + 나머지를 모두 소문자로 바꾼다. # 반드시 둘다 적용되어야 함
print(s.title()) # 단어의 첫 글자 대문자로 바꾸기 + 나머지 모두 소문자로 바꾼다. # 반드시 둘다 적용되어야 함
# I HAVE A DREAM.
# i have a dream.
# I have a dream.
# I Have A Dream.
2) 자릿수 지정과 정렬
- rjust(x) 메서드: 지정한 x 만큼의 자릿수를 확보한 후 오른쪽 정렬합니다.
- ljust(x) 메서드: 지정한 x 만큼의 자릿수를 확보한 후 왼쪽 정렬합니다.
- center(x) 메서드: 지정한 x 만큼의 자릿수를 확보한 후 가운데 정렬합니다.
# 지정한 길이의 문자열이 되도록 공백을 추가하고 정렬
s = 'Dream'
print('[' + s.rjust(7) + ']') # 7자리를 확보하는데 오른쪽으로 붙이세요 [ Dream]
print('[' + s.ljust(7) + ']') # 7자리를 확보하는데 왼쪽으로 붙이세요 [Dream ]
print('[' + s.center(7) + ']') # 7자리를 확보하는데 가운데로 정렬하세요 [ Dream ]
3) 일부 변경 및 제거
- replace(x, y) 메서드: 문자열에 포함된 일부 문자열 x를 문자열 y로 변경합니다.
- strip(x) 메서드: 문자열에서 양쪽의 공백 또는 특수 문자를 제거합니다.
# 문자열 변경('now' --> 'now ')
s = 'nowhere'
s.replace('now', 'now ') # 'now here'
# 문자열 변수
num = '123,456'
# 콤마 제거 후 정수로 변환
num = int(num.replace(',', ''))
# 연산
print(num * 2) # 246912
# 앞 뒤 빈 문자열, 특수 문자 제거
print(' world '.strip()) # world
print('#world#$$#'.strip()) # #world#$$#
print('#world#$$#'.strip('$#')) # world
- 가운데 있는 것은 strip()으로 지울 수 없다. strip()은 양 끝에 있는 것만 지울 수 있다.
4) 분리와 연결
- split(x) 메서드: x 문자를 구분자로 하여 문자열을 분리하여 리스트로 변환한다. (공백이 기본 구분자?--> x! 공백을 포함한 white space(/n, /t 등)
- x.join(s) 메서드: x를 구분자로 하여 요소들을 연결한 문자열로 변환한다. split()의 반대라고 이해하자. 주의할 것은, string.join('/') 여야 할 것 같지만, 그게 아니다. '/'를 가지고 join하는 것이다. 그래서 string = '/'.join(list1)의 형태로 활용한다. list1에 있는 요소들을 /로 연결(join)해서 string을 만든다.
# 문자열 변수
s = 'I have a Drea\nm!'
# 문자열 분리
s.split() # 공백을 포함한 white space(/n, /t 등)가 기본 구분자 역할을 한다.
# ['I', 'have', 'a', 'Drea', 'm!'] # split의 반환 결과는 list가 된다.
# 문자열 변수
z = '2020-09-14'
# 문자열 분리
z.split('-')[0] # 여기서 인덱싱으로 개별 값 변수 대입 등 활용을 할 수 있다.
# '2020'
# # '2020-09-14'z.split('-')[0] --> 이렇게 변수를 앞에 바로 넣어도 상관없다.
# 문자열 변수
s = '2020-09-14'
# 문자열 분리
year = s.split('-')[0]
month = s.split('-')[1]
day = s.split('-')[2]
# 확인
print('오늘은', year, '년', month, '월', day, '일 입니다.')
# 오늘은 2020 년 09 월 14 일 입니다.
# 요소를 연결해서 문자열로
a = ['홍길동', '한사랑', '강우동', '박여인']
s = '/'.join(a)
# 확인
s
# '홍길동/한사랑/강우동/박여인'
# Q. 주어진 리스트의 요소를 모두 대문자로 바꿔보자!
# 리스트 만들기
a = ['h', 'a', 'p', 'p', 'y']
# 대문자로 변경
a = ','.join(a).upper().split(',') # 'h,a,p,p,y' -> 'H,A,P,P,Y' -> ['H', 'A', 'P', 'P', 'Y']
# 공백을 써도 되고, ,를 써도 되고, /를 써도 된다. 그냥 split의 근거가 필요
# 확인
a # ['H', 'A', 'P', 'P', 'Y']
'데이터 분석 > 파이썬 기초' 카테고리의 다른 글
변하는 것과 변하지 않는 것 (0) | 2024.09.15 |
---|---|
리스트, 튜플, 집합, 딕셔너리에 대해서 알아보자. (3) | 2024.09.15 |
값이 같다? 존재가 같다? (0) | 2024.09.10 |
연산자와 기본 자료형에 대해 알아보자. (0) | 2024.09.09 |
[2일차] 07. 제어문 (0) | 2024.09.05 |