03-3 문자열

윤혜민·박현규 · 14 / 30

문자열은 아마 여러분이 파이썬을 사용하면서 가장 많이 다루게 될 자료형일 겁니다. 문자열은 쉽게 말해 텍스트를 생각하면 됩니다. 요즘 여러분이 아마 가장 많이 사용하고 있을 챗GPT나 클로드와 같은 LLM 서비스의 텍스트, 네이버 증권 사이트에서 보는 텍스트, 지메일에서 보는 텍스트, 모든 것이 텍스트입니다. 그렇습니다. 우리는 문자열에 둘러싸여 살고 있습니다. 그렇기 때문에 문자열을 다룰줄 알면 많은 생활 속의 문제를 해결할 때 도움이 될 겁니다.

예를 들어 다음 문장에서 love는 총 몇 번 등장할까요?

Love is the most powerful emotion that makes us do incredible things for those we love, and when we truly love someone, we learn that love isn't just about receiving love but also about giving love unconditionally to create a beautiful bond that lasts forever.

눈으로 세어도 좋지만 파이썬 코드로 이 문제를 해결하려면 이렇게 하면 됩니다. sentense 변수에는 찾아야 할 대상 문장을 큰따옴표로 감싸 저장하고, sentence.lower( ).count('love')로 계산하면 love가 총 몇 번인지 계산해줍니다.

sentence = "Love is the most powerful emotion that makes us do incredible things for those we love, and when we truly love someone, we learn that love isn't just about receiving love but also about giving love unconditionally to create a beautiful bond that lasts forever."
count = sentence.lower().count('love')

print(count) # 6

sentence 변수의 긴 문장을 제외하면 단 2줄의 코드로 love가 몇 번 등장했는지 알 수 있는 겁니다. 여러분이 워드나 구글 문서에서 [Ctrl + F]를 눌러 단어를 찾거나 할 때 '몇 개 중 몇 번째'와 같은 표시 기능은 모두 내부에 이런 코드가 작성되어 있는 겁니다.

[Note] 곧 설명하겠지만 .lower( )는 점 앞에 있는 변수에 있는 글자를 모두 소문자로 바꾸는 함수이고, .count( )는 연이어서 그 결과(소문자로 바꾼 sentence의 문자열)에서 'love'가 몇 번 나왔는지 세어주는 함수입니다.

이처럼 우리 생활에 너무 밀접한 연관이 있는 문자열이므로 조금은 진지하게 다양한 문법과 함수를 소개하겠습니다. 문자열만 잘 다뤄도 파이썬을 배운 의미가 충분히 있습니다. 다양한 문자열 실습을 연습하면서 문자열을 다루는 방식에 익숙해져봅시다.

문자열 기초 연습하기

파이썬에서 문자열을 다루는 방법은 아주아주 많습니다. 이 책에서 모든 내용을 다루기는 한계가 있으므로 기초 연습부터 심화 연습까지 다양한 문자열 관련 기법을 익혀보겠습니다.

[연습 00] 문자열 만들기

복습 차원에서 문자열을 만드는 다양한 방법을 간단히 실습해보겠습니다. 파이썬에서 문자열은 작은따옴표(')나 큰따옴표(")로 감싸서 만들 수 있습니다. 두 방법 모두 동일하게 작동하므로 편한 것을 선택하면 됩니다.

name = '바로'
greeting = "안녕하세요, 파이썬 공부를 시작해볼까요?"
question = '바로는 "파이썬이 재미있어요"라고 말했어요'
answer = "It's a wonderful day!"
print(name)
print(greeting)
print(question)
print(answer)

[실행 결과]

바로

안녕하세요, 파이썬 공부를 시작해볼까요?

바로는 "파이썬이 재미있어요"라고 말했어요

It's a wonderful day!

여러 줄로 이루어진 긴 문자열을 만들 때는 삼중 따옴표 ''' 또는 """로 감싸면 됩니다.

바로_소개 = """안녕하세요, 저는 바로예요.

여러분과 함께 파이썬을 공부하고 있어요.

같이 즐겁게 배워봐요!"""

daily_note = '''오늘 바로가 배운 것:

1. 문자열 만들기

2. 따옴표 사용법'''

print(바로_소개)
print()
print(daily_note)

[실행 결과]

안녕하세요, 저는 바로예요.

여러분과 함께 파이썬을 공부하고 있어요.

같이 즐겁게 배워봐요!

오늘 바로가 배운 것:

1. 문자열 만들기

2. 따옴표 사용법

[연습 00] 문자열을 이어 붙이는 + 연산자

이미 여러번 등장한 방법입니다. 문자열은 + 연산자로 쉽게 이어 붙일 수 있습니다.

first_name = "요"
last_name = "즘이"
full_name = first_name + last_name

print(full_name) # 바로

# 여러 문자열 연결
greeting = "안녕하세요, " + "저는 " + full_name + "입니다."

print(greeting) # 안녕하세요, 저는 바로입니다.

그리고 몇 번 언급했던 것처럼 공백도 문자열에 포함됩니다. 그래서 중간에 공백을 추가하고 싶다면 다음과 같이 공백 자체를 큰따옴표로 감싸서 표현한 다음 +로 연결해도 됩니다.

# 문자열과 공백 연결
message = "Python" + " " + "Programming"

print(message) # Python Programming

[연습 00] 문자열을 복사해주는 * 연산자

+ 연산자를 사용해보면 '곱하기는 어떨까?'라는 생각이 들 수 있습니다. * 연산자를 숫자에 사용하면 당연히 곱한 결과가 나오지만 문자열에 사용하면 해당 문자열을 여러번 복사한 결과가 나옵니다. 예를 들어 "==============영수증=============="과 같이 입력한 내용은 다음과 같이 바꿔서 입력할 수 있습니다.

>>> print("=" * 14 + "영수증" + "=" * 14)

==============영수증==============

이렇게 하면 =를 몇 번 직접 입력해야 하는지 세거나 할 필요 없이 바로 * 연산자로 정할 수 있습니다. 직관적이면서도 확실한 방법입니다. 반복하여 복사할 문자열이 있다면 *를 요긴하게 사용할 수 있습니다.

[연습 00] 문자열 안에 있는지 없는지 검사해주는 in 연산자

in 연산자는 값이 있는지 없는지를 검사한 후 True나 False로 알려줍니다. 다음 코드를 입력해서 실행해보면 금방 무슨 말인지 알 수 있을 겁니다.

message = "파이썬은 재미있는 프로그래밍 언어입니다"
print(f"{"파이썬" in message}")

True

결과를 보면 True입니다. message 변수에 저장한 문자열 안에 "파이썬"이라는 문자열이 있으니까 True라고 나온 것입니다. 만약 없는 문자열을 찾으면 False로 나옵니다.

message = "파이썬은 재미있는 프로그래밍 언어입니다"
print(f"{"이썬이" in message}")

False

문자열에 "이썬이"가 없으므로 False를 출력합니다.

<1:1코칭> 숫자와 문자열을 더하면 어떻게 될까?

만약 숫자를 + 연산자로 문자열과 연결하면 어떻게 될까요? 그러면 TypeError라는 오류가 발생합니다.

>>> price = 1500000
>>> message = "가격: " + price + "원"

Traceback (most recent call last):

File "<python-input-0>", line 2, in <module>

message = "가격: " + price + "원"

TypeError: can only concatenate str (not "int") to str

해석하자면 '정수는 문자열과 연결할 수 없다'라는 뜻입니다. 상식적으로도 숫자와 문자열은 더해서 계산하거나 할 수 없으니 이해할 수 있는 오류입니다.

</1:1코칭>

문자열 응용 연습하기

이제 문자열을 다루는 것이 무엇인지 감이 잡혔을 겁니다. 기초 방법에서 벗어나 조금 더 유용한 방법도 알아봅시다. 대부분 문자열 함수를 사용하는 방법들입니다. 함수의 개념은 나중에 자세히 공부하겠습니다. 지금은 문자열을 다루는 방법에는 이런 것도 있구나하는 생각으로 공부하면 됩니다.

[연습 00] 문자열의 길이를 계산하는 len( ) 함수

len( ) 함수는 문자열의 길이를 계산해줍니다. 길이를 계산할 문자열이나 문자열을 담고 있는 변수를 (와 ) 사이에 입력하면 됩니다.

text = "파이썬 문자열 길이 측정 연습을 해봅시다!"
print(f"len(text)의 계산 결과는? {len(text)}")

len(text)의 계산 결과는? 23

"파이썬 문자열 길이 측정 연습을 해봅시다!"의 문자열 길이는 띄어쓰기와 느낌표를 포함한 결과인 23입니다. 정말로 그런지 실제로 세어보기 바랍니다.

[연습 00] 모든 문자를 대문자 또는 소문자로 바꿔주는 upper( ), lower( ) 함수

이번에는 문자열 내의 모든 문자를 대문자 또는 소문자로 바꿔주는 upper( ), lower( ) 함수를 알아보겠습니다. 이 함수들은 소괄호 안에 문자열을 넣는 방식이 아닌 text.upper( )와 같이 대상 문자열 다음에 .을 입력하고 사용하는 방식입니다. text 변수에 "study python"을 저장한 다음 이것을 모두 대문자로 바꿔 출력해봅시다.

[Note] 어떤 함수는 소괄호 안에 값을 넣어야 동작하고, 어떤 함수는 .을 입력해야 동작하는지는 나중에 함수나 클래스를 설명하며 자세히 이야기하겠습니다.

text = "study python"
print(f"upper() 함수의 결과는 {text.upper()}")

upper() 함수의 결과는 STUDY PYTHON

출력 결과를 보면 text.upper( )의 결과로 STUDY PYTHON이 나왔습니다. 이처럼 upper( ) 함수는 .으로 연결한 대상 문자열을 대문자로 바꿔줍니다.

lower( ) 함수는 반대로 대문자를 소문자로 바꿔주겠죠. 실습을 효율적으로 하기 위해 upper( ) 함수로 대문자로 바꾼 값을 새 변수에 저장한 다음 그 변수를 소문자로 바꿔보겠습니다.

text = "study python"
text_upper = text.upper( )
print(f"lower( ) 함수의 결과는 {text_upper.lower( )}")

lower() 함수의 결과는 study python

코드가 좀 혼란스러울 수 있지만 자세히 보면 처음의 text 변수에는 소문자가 들어 있습니다. 이를 upper( ) 함수로 모두 대문자로 변환한 다음 text_upper 변수에 새로 저장합니다. 그러면 text_upper 변수에는 "STUDY PYTHON"이 저장되어 있겠죠? 이것을 다시 lower( ) 함수로 소문자로 바꿔 출력해본 것입니다. 지금은 변수에 저장하는 것과 출력만 해보는 것을 구분하기 어려운 단계이므로 차분하게 코드를 살펴보기 바랍니다.

[연습 00] 문자열이 몇 번째에서 시작하는지 알려주는 find( ) 함수

find( ) 함수는 message.find("언어")와 같이 소괄호 속에 넣은 문자열 "언어"를 .으로 연결한 문자열 또는 문자열을 저장한 변수 message의 몇 번째 문자부터 시작하는지 알려주는 함수입니다. 설명만 보면 복잡하지만 쉽게 말해 내가 찾으려는 문자열이 원문 문자열 속의 몇 번째 글자부터 시작하는지를 알려주는 겁니다.

message = "파이썬은 재미있는 프로그래밍 언어입니다"
print(message.find("재미"))

5

결과를 보면 5라고 되어 있습니다. message 속에 "재미"는 5번째 위치부터 시작하기 때문에 5를 출력한 것입니다. 이때 '찾다'의 의미를 가진 find( ) 함수가 반환하는 값이 숫자인 건 좀 이상하게 느껴집니다. 왜 숫자를 반환할까요? 그 이유는 프로그래밍 세계에서 거짓(없음)을 대체하여 사용할 수 있는 수가 -1이라 그렇습니다. 실제로 find( ) 함수는 문자열을 찾지 못하면 -1을 반환합니다.

message = "파이썬은 재미있는 프로그래밍 언어입니다"
print(message.find("게임"))

-1

그래서 이왕 find( ) 함수를 개발하는 김에 찾았다면 찾은 위치의 맨 앞 번째 숫자를 내뱉도록 만든 것이죠. -1을 제외하면 '제대로 찾았다'라는 의미를 가지고 있니까요. "게임"을 "재미"로 바꿔서 실행해봅시다.

message = "파이썬은 재미있는 프로그래밍 언어입니다"
print(message.find("재미"))

5

그런데 잠깐만요. 5가 나왔습니다. 그런데 직접 글자를 세어보면 ‘재미’의 시작 위치는 띄어쓰기를 포함해서 6번째 같습니다. 이상합니다.

‘1, 2, 3, 4, 5, 6...’ 분명 6번째에 ‘재미’가 시작하는데 5라고 출력한 이유는 무엇일까요? 그것은 파이썬은 모든 순번을 0부터 시작하기 때문입니다. 여기서 인덱스의 개념이 등장합니다.

시퀀스 데이터에서 중요한 개념인 인덱스

문자열은 문자가 나열된 데이터입니다. 이렇게 무언가 나열되어 있는 형태의 데이터를 시퀀스 데이터라고 합니다. 어떤 값들이 연속하여 나열되어 모여 있으면 하나의 값을 콕 집어 말할 기준이 필요하겠죠. 그래서 인덱스라는 개념을 만든 것입니다. 파이썬은 이 인덱스를 1이 아니라 0부터 시작하는 것으로 규칙을 정했습니다. 그래서 앞에서 살펴본 "재미"의 시작 인덱스는 6이 아니라 5로 계산합니다. 앞으로 인덱스는 이렇게 설명이 필요한 시점에 적절히 이야기하겠습니다. 문자열을 다루면서 인덱스에 대한 이야기를 몇 번 더하겠습니다.

[연습 00] 시작과 끝을 검사하는 startswith( ), endswith( ) 함수

startswith( ), endwith( ) 함수는 문자열의 시작과 끝을 검사하여 True 또는 False를 반환하는 함수입니다. 예를 들어 전화번호 형식을 확인할 때 010으로 시작하는지, 02로 시작하는지 검사하고 싶다면 다음과 같이 코드를 작성하면 됩니다.

phone = "010-1234-5678"

print(phone.startswith('010')) # True

print(phone.startswith('02')) # False

결과를 보면 startswith('010')의 결과는 True이고 startswith('02')의 결과는 False입니다. 말 그대로 입력한 문자열로 시작하는지의 여부를 검사하여 True, False를 출력한 것입니다.

[연습 00] 효율적으로 문자열을 이어 붙이는 join( ) 함수

나중에 배울 내용이지만 파이썬에서 비슷한 자료형을 모아두는 리스트, 튜플과 같은 자료구조가 있습니다. 자료구조는 어렵게 생각할 것 없이 비슷한 형태의 데이터를 모아두는 방법이라고 생각하면 됩니다. 예를 들어 문자열 3개를 모아두고 싶다면 이렇게 리스트를 사용하면 됩니다.

# 리스트로 3개의 문자열 보관하기
words = ["Python", "is", "awesome"]

이렇게 리스트는 대괄호로 열고 닫는 방식으로 표현합니다. 3개의 문자열을 대괄호에 쉼표로 구분하여 저장하는 형태입니다. 그 다음에 이 문자열 3개를 한꺼번에 띄어쓰기로 구분하여 이어 붙이는 방법은 다음과 같습니다.

# 리스트의 문자열들 연결
words = ["Python", "is", "awesome"]
sentence = " ".join(words)

print(sentence) # Python is awesome

" ".join(words)와 같이 작성하여 띄어쓰기 문자열로 words의 문자열들을 연결한 다음 sentense 변수에 다시 저장하고 이를 출력한 결과를 볼 수 있습니다. 만약 띄어쓰기로 연결하지 않고 다른 문자로 연결하고 싶다면 " "를 다른 것으로 바꾸면 됩니다.

# 리스트의 문자열들 연결
words = ["Python", "is", "awesome"]
sentence = "-".join(words)

print(sentence) # Python-is-awesome

+ 연산자도 문자열을 연결하는 매우 편리한 방법이지만 join( ) 함수는 아주 많은 양의 문자열을 한꺼번에 연결할 수 있어 편리합니다. 앞으로 종종 이용할 일이 있을 겁니다.

[연습 00] 숫자를 문자열로 변환하는 str( ) 함수

만약 숫자와 문자열을 연결하고 싶거나 숫자를 문자열로 다루고 싶다면 어떻게 해야 할까요? 예를 들어서 쇼핑몰에서 구매자에게 영수증을 보여주려 한다면 다음과 같이 코드를 작성해볼 수 있습니다.

# 쇼핑몰 영수증 생성하기
product_name = "노트북"
quantity = 2
unit_price = 1500000
total_price = quantity * unit_price
# 영수증 문자열 생성
receipt = "========== 영수증 ==========\n"
receipt = receipt + "상품: " + product_name + "\n" # 상품: 노트북
receipt = receipt + "수량: " + str(quantity) + "개\n" # 수량: 2개
receipt = receipt + "단가: " + str(unit_price) + "원\n" # 단가: 1500000원
receipt = receipt + "총액: " + str(total_price) + "원\n" # 총액: 3000000원
receipt = receipt + "=========================="
print(receipt)

[실행 결과]

========== 영수증 ==========

상품: 노트북

수량: 2개

단가: 1500000원

총액: 3000000원

==========================

코드를 보면 숫자 계산을 하는 동안에는 quantity, unit_price, total_price는 숫자로 취급하여 자연스럽게 사칙연산을 하고 있습니다. 하지만 이를 영수증 형태로 보여주는 단계에서는 문자열로 취급하기 위해 str(quantity), str(unit_price), str(total_price)로 숫자 변수를 문자열로 변환하고 동시에 이를 + 연산자로 연결하여 출력하고 있습니다.

문자열 인덱싱 그리고 슬라이싱

이제 문자열 인덱싱에 대해 알아봅시다. 문자열 인덱싱은 말 그대로 문자열에서 문자열을 구성하는 문자의 순서를 지칭할 때 쓰는 개념입니다. 이미 앞에서 우리는 이런 그림을 통해 인덱싱이 어떤 개념인지 알아봤습니다.

"파이썬은 재미있는 프로그래밍 언어입니다"라는 문자열에서 공백까지 포함하여 0부터 셈하는 것이 파이썬에서의 문자열 인덱싱 규칙이었습니다.

슬라이싱 알아보기

그렇다면 슬라이싱은 무엇일까요? 슬라이싱은 이 인덱싱 규칙을 이용해서 문자열을 자르는 문법을 말합니다. 마치 빵을 원하는 두께로 자르는 것처럼 문자열을 원하는 만큼 잘라낼 수 있습니다. 슬라이싱은 대괄호 안에 시작 인덱스와 끝 인덱스를 콜론(:)으로 구분해서 사용합니다. [시작:끝] 형태로 작성하면 시작 위치부터 끝 위치 직전까지의 데이터를 가져옵니다. 시작 이상, 끝 미만으로 외우면 됩니다. 다음 코드를 입력해서 실행해보면 문자열에서 원하는 부분을 어떻게 추출하는지 알 수 있을 겁니다.

>>> sayhello = "안녕하세요 파이썬!"
>>> print(sayhello[0:3])

안녕하

[0:3]이라고 입력했으므로 0이상 3미만의 텍스트를 슬라이싱합니다. 안이 0번째 인덱스이고, 세가 3번째 인덱스이므로 안녕하까지만 출력된 것입니다. 한번 더 해볼까요?

>>> print(sayhello[3:7])

세요 파

3번째 인덱스는 세이고, 7번째 인덱스는 이이므로 세요 파가 출력되었습니다. 만약 끝까지 출력하고 싶다면 시작 인덱스만 입력하고 끝 인덱스는 숫자를 생략하면 됩니다.

>>> print(sayhello[5:])

파이썬!

중요한 것은 5번째 인덱스가 " "이므로 여기부터 끝까지 출력했다는 점입니다. 슬라이싱은 이정도면 기초는 뗀 셈입니다.

슬라이싱 좀 더 알아보기 : 음수 인덱스

슬라이싱은 음수 인덱스를 사용할 수도 있습니다. 인덱스가 0부터 시작하므로 -1은 문자열의 마지막 위치를 의미합니다. 만약 파이썬이라는 글자만 슬라이싱할 때 음수로 슬라이싱하고 싶으면 어떻게 하는 것이 좋을까요? 다음 그림을 보면서 고민해봅시다.

아마도 sayhello[-3:-1]이라고 해야 할 것 같습니다. 그런데 슬라이싱은 시작 인덱스 이상, 끝 인덱스 미만이므로 -1은 슬라이싱에서 제외됩니다. 그럴 때는 앞에서 배운대로 끝까지 슬라이싱한다는 의미의 '아무 것도 입력하지 않음'을 사용하면 됩니다. 결과를 보면 -3 인덱스 이상부터 끝까지 슬라이싱한 것을 알 수 있습니다.

>>> sayhello[-3:]

'파이썬'

슬라이싱 좀 더 알아보기 : 건너뛰며 슬라이싱

원하는 간격으로 건너뛰면서 슬라이싱할 수 있는 방법도 있습니다. 지금까지 우리가 배운 슬라이싱은 [시작:끝] 형태였습니다. 하지만 마지막에 [시작:끝:간격]와 같이 간격 옵션을 추가하면 일정한 간격으로 건너뛰며 슬라이싱할 수 있습니다. 다음 코드를 실행해봅시다.

>>> sayhello[0:6:2]

'안하요'

결과를 보면 인덱스 0이상, 6미만의 범위에서 인덱스를 2씩 더하며 슬라이싱을 수행한 것을 알 수 있습니다. 여기서 '건너뛴다'라는 표현 때문에 2칸을 비워야 하는 것으로 오해하기 쉽습니다. 하지만 그냥 인덱스에 더하기 2(+2)를 하면서 슬라이싱한다라고 생각하는 것이 옳습니다. 그래서 간격을 1로 설정하면 인덱스에 더하기 1을 하면서 슬라이싱을 진행하므로 생략했던 것과 같은 결과를 얻을 수 있습니다.

>>> sayhello[0:5:1]

'안녕하세요'

슬라이싱 좀 더 알아보기 : 음수로 건너뛰며 슬라이싱

가장 흥미로운 건 음수 간격입니다. 이걸 사용하면 데이터를 거꾸로 뒤집을 수 있거든요. 만약 전체 문자열을 선택하여 건너뛰는 간격을 -1로 설정하면 어떻게 될까요? 우선 시작과 끝을 생략하여 전체 문자열을 선택했고, -1로 간격을 설정했습니다.

>>> sayhello[::-1]

'썬이파 요세하녕안'

재미있는 결과가 보입니다. 거꾸로 문자열을 출력했네요. 직관적으로도 이 결과가 옳은 것 같습니다. 전체 문자열에서 반대로 인덱스를 더하며(-1을 더하며) 슬라이싱하므로 이런 결과가 나온 것입니다.

이정도면 문자열의 사용 방법을 대부분 설명한 것 같습니다. 지금까지 여러분이 배운 문자열 다루기의 콘셉트는 이후 리스트와 같은 자료구조를 공부할 때 다시 한 번 등장할 겁니다. 만약 '문자열을 다룰 일이 그렇게 많은가?'라는 생각을 했다면 이후 이 개념이 다시 등장하며 '아하! 이래서 문자열에서 그런 개념들을 배웠구나'라는 생각이 들 겁니다.

format( ) 함수로 문자열 다양하게 다뤄보기

format( ) 함수는 문자열 포매팅의 강력한 도구입니다. 출력에 대해서 공부했던 f-string과 비슷하면서도 조금 더 복잡하게 느껴질 수 있는 함수입니다. 하지만 format( ) 함수를 사용하면 문자열을 더 정교하게 다룰 수 있습니다.

format( ) 함수 사용해보기

다음 예를 입력하고 실행해서 format( ) 함수에 대한 감을 잡아보겠습니다.

name = "금요즘"
age = 25
height = 175.5
# ➊ 기본 사용법 - 순서대로 넣기
print("저는 {}입니다! 나이는 {}살이고 키는 {}cm입니다.".format(name, age, height))
# ➋ 번호로 순서 지정하기
print("제 이름은 {0}이고, {0}은 {1}살입니다.".format(name, age))

[실행 결과]

저는 금요즘입니다! 나이는 25살이고 키는 175.5cm입니다.

제 이름은 금바로고, 금요즘은 25살입니다.

➊을 보면 문자열 "저는 {}입니다! 나이는 {}살이고 키는 {}cm입니다."에 중괄호를 여닫은 표현이 보입니다. 이 중괄호가 format( ) 함수에 쉼표로 구분하여 전달한 name, age, height와 일대일 대응합니다. 그 결과로 변수의 값이 그대로 출력되었습니다. 하나의 중괄호가 format의 하나의 변수에 대응한다라고 생각하면 됩니다.

➋를 보면 중괄호에 0 또는 1을 전달하여 format( ) 함수에 담은 변수의 순서와 매치하였습니다. 파이썬의 인덱스 개념이 다시 쓰이는 순간입니다. 0은 format( ) 함수에 전달한 name을 의미하고, 1은 age를 의미합니다. 여러 번 재사용하여 사용할 때는 중괄호를 여닫는 것만으로는 충분하지 않으므로 이런 사용 방법도 생긴 것입니다.

다음은 format( ) 함수에 전달한 변수에 이름을 붙여 사용하는 방법입니다. ➋의 방식은 인덱스로 변수와 대응해야 하므로 format( )에 전달할 변수가 많아지면 일일이 세어 사용하기 힘듭니다. 그럴 때 다음 방법이 요긴합니다.

[Note] 소개하는 예제는 연습을 위해 억지로 만든 거라 정말 유용하다라는 느낌은 나지 않을 수 있습니다. 우선은 이런 사용 방법도 있구나하는 정도로 알아두고 넘어가기 바랍니다.

# 키워드로 이름 지정하기
print("이름: {erum}, 나이: {nae}세, 키: {key}cm".format(erum=name, nae=age, key=height))

[실행 결과]

이름: 금요즘, 나이: 25세, 키: 175.5cm

이 방법은 숫자가 아닌 직접 내가 지정한 이름으로 변수의 값을 전달하고 싶을 때 사용합니다. 예를 들어 name 변수의 값은 erum이라는 새 이름을 부여하여 문자열 내에서 사용했습니다.

format( ) 함수로 숫자 출력 다양하게 해보기

이번에는 format( ) 함수로 숫자 출력을 다양하게 해보겠습니다. 예를 들어 1234.56789라는 실수가 있을 때 특정 소수점까지 출력하고 싶다면 이렇게 하면 됩니다.

number = 1234.56789
print("소수점 둘째 자리까지:", format(number, ".2f"))
print("소수점 네째 자리까지:", format(number, ".4f"))

[실행 결과]

소수점 둘째 자리까지: 1234.57

소수점 네째 자리까지: 1234.5679

만약 천 단위를 쉼표로 구분하여 출력하고 싶다면 이렇게 하면 됩니다. 또 천 단위 쉼표 구분과 소수점 둘째자리까지 숫자를 표현하고 싶다면 이를 혼합할 수도 있습니다.

print("천 단위 구분자 포함:", format(number, ","))
print("천 단위 구분자 + 소수점 둘째:", format(number, ",.2f"))

[실행 결과]

천 단위 구분자 포함: 1,234.56789

천 단위 구분자 + 소수점 둘째: 1,234.57

조금 더 해볼까요? 만약 숫자에 퍼센트 표시를 하고 싶다면 어떻게 해야 할까요? 숫자를 문자열로 만든 후에 + "%"를 해야 할까요?

small_number = 0.123456
print("퍼센트 표시 : " + str(small_number) + "%")

[실행 결과]

퍼센트 표시 : 0.123456%

%를 숫자에 붙이기는 했습니다. 하지만 이건 자연스럽지 않습니다. 우선은 0.123456을 % 단위로 전환하면 12.3456%이지 0.1234%가 아니거든요. small_number를 str( ) 함수로 감싸 문자열로 변환한 다음 "%"를 이어 붙인 것이므로 어쩔 수 없는 결과네요. 하지만 format( ) 함수를 사용하면 간단하게 이 문제를 해결할 수 있습니다.

print("퍼센트 표시:", format(small_number, ".2%"))

[실행 결과]

퍼센트 표시: 12.35%

결과를 보면 small_number의 값 0.123456을 ".2%" 형식으로, 즉, 퍼센트 형식으로 바꾸면서 소수점 2번째 자리까지만 표현하라는 것을 직관적으로 잘 적용했습니다. 숫자에 단순히 퍼센트를 붙인 것이 아니라 완전히 퍼센트 형식으로 전환한 것을 볼 수 있습니다. 이를 종합한 예제를 실습하면서 format( ) 함수의 사용법을 마무리하겠습니다.

# 문자열 format() 메서드 사용
price = 15000
discount_rate = 0.15
final_price = price * (1 - discount_rate)
print("원가: {:,}원".format(price))
print("할인율: {:.1%}".format(discount_rate))
print("최종 가격: {:,.0f}원".format(final_price))
# 여러 값을 한 번에 형식 지정

print("상품 가격은 {:,}원이고, {}% 할인해서 {:,.0f}원입니다.".format(

price, int(discount_rate*100), final_price))

[실행 결과]

원가: 15,000원

할인율: 15.0%

최종 가격: 12,750원

상품 가격은 15,000원이고, 15% 할인해서 12,750원입니다.

이 밖에도 다양한 format( ) 함수의 사용 방법이 있지만 이정도만 공부하고 나머지 사용 방법은 검색을 통해 공부하는 것이 훨씬 좋습니다. 물론 이 도서에서 추천한 커서를 이용하면 더 쉬운 방법으로 공부할 수 있습니다.

➊ 커서 채팅창에 '파이썬의 format( ) 함수의 다양한 사용 방법을 알고 싶어'라고 이야기했더니 ➋ 현재 작성한 코드 파일을 살펴본 다음 ➌ 이를 바탕으로 더 많은 사용 방식을 설명과 함께 작성하여 format_example.py 파일을 만들어주었습니다. 이처럼 커서를 함께 사용하면 배운 내용을 바탕으로 더 나은 방식의 코드 작성 방법이나 추가 문법 요소를 공부하기 좋습니다.

문자열 공백 처리하기

문자열에 있는 불필요한 공백을 정리하는 방법도 아주 유용합니다. 파이썬은 strip( ), lstrip( ), rstrip( ) 함수로 공백을 다양하게 제거할 수 있습니다.

  • strip( ) : 양쪽 끝의 공백을 제거합니다.

  • lstrip( ) : 왼쪽(앞쪽) 공백만 제거합니다.

  • rstrip( ) : 오른쪽(뒤쪽) 공백만 제거합니다.

다음 코드를 작성하고 실행하면 이 함수들이 문자열을 어떻게 처리하는지 볼 수 있습니다. 이때 공백을 명확하게 표시하기 위해 repr( ) 함수로 공백 제거를 처리한 표현식을 감싸 작은따옴표 표시 처리를 했습니다.

[Note] repr( ) 함수로 문자열을 감싸면 작은따옴표 표시 처리를 해줍니다. 이렇게 하면 작은따옴표를 실제 문자열에 넣지 않고도 표시할 수 있어 유용합니다. 함수의 효과가 궁금하다면 코드에서 repr( )을 제외하고 출력해보세요.

# 양끝 공백 제거하기
messy_text = " 안녕하세요 파이썬! "
left_space = " 왼쪽에만 공백"
right_space = "오른쪽에만 공백 "
print("원본:", repr(messy_text))
print("strip():", repr(messy_text.strip()))
print("lstrip():", repr(left_space.lstrip()))
print("rstrip():", repr(right_space.rstrip()))

<1:1코칭> 문자열 처리 함수들은 문자열 자체를 변경하지는 않아요

문자열 처리 함수들을 공부할 때 문자열 처리 함수가 문자열 자체를 변경한다고 착각하기 쉽습니다. 하지만 실제로는 그렇지 않습니다. 무슨 말인지는 다음 코드를 보며 설명하겠습니다.

gongbak = " 공백이 있는 문자열 "
gongbak.strip( )

'공백이 있는 문자열'

print(gongbak)

' 공백이 있는 문자열 '

많은 사람들이 gongbak 변수에 좌우 공백이 있는 문자열을 담고 이를 strip( ) 함수로 처리하면 변수 안에 있는 문자열의 좌우 공백을 처리했다라고 착각합니다. 하지만 실제로 strip( ) 함수가 동작하는 방식은 좌우 공백을 처리한 결과를 반환하지 실제 문자열의 값을 변경하지 않습니다. 반환이라는 개념을 알아야 이해할 수 있는 설명이므로 아직은 깔끔하게 이해가 안 될 수 있습니다. 이해가 잘 안 되더라도 문자열 처리 함수가 문자열 자체를 변경하지 않는다는 것만 기억해도 좋습니다. 함수와 반환의 개념은 뒤에서 자세히 공부하겠습니다.

</1:1코칭>

문자열 특정 키워드로 나누고 합치기

문자열을 다루다 보면 특정 문자나 단어를 기준으로 문자열을 나누거나, 여러 개의 문자열을 특정 구분자로 연결해야 할 때가 자주 있습니다. 예를 들어 쉼표로 구분된 데이터를 조각조각 나눠 분리하고 싶을 수도 있고, 여러 단어를 하이픈 '-'으로 연결해야 하고 싶을 수도 있습니다. 파이썬에서는 split( ) 함수, join( ) 함수로 이런 작업들을 할 수 있습니다. 정말 자주 쓰이는 함수이므로 알아두면 좋습니다.

특정 키워드로 문자열을 나눠주는 split( ) 함수

먼저 split( ) 함수부터 사용해보겠습니다. 이름 그대로 문자열을 나누는 함수입니다. 이때 나눌 기준을 함수에 입력하면 됩니다. 나눈 결과물은 리스트라는 자료형에 담아주는데 결과값이 대괄호로 감싸져있고, 데이터가 쉼표로 구분되어 있으면 리스트라고 생각하면 됩니다. 리스트는 곧 공부할 예정입니다. 지금은 'split( )으로 문자열을 조각내서 대괄호에 나눠 담았구나' 정도로 생각하면 됩니다.

# 특정 키워드로 문자열 나누기
fruits = "사과,바나나,오렌지,포도,딸기"
sentence = "파이썬은-정말-재미있는-프로그래밍-언어입니다"
print("과일 목록:", fruits)
print("쉼표로 나누기:", fruits.split(","))
print("\n문장:", sentence)
print("하이픈으로 나누기:", sentence.split("-"))

[실행 결과]

과일 목록: 사과,바나나,오렌지,포도,딸기

쉼표로 나누기: ['사과', '바나나', '오렌지', '포도', '딸기']

문장: 파이썬은-정말-재미있는-프로그래밍-언어입니다

하이픈으로 나누기: ['파이썬은', '정말', '재미있는', '프로그래밍', '언어입니다']

결과를 보면 "사과,바나나,오렌지,포도,딸기"를 쉼표로 나누기 위해 fruits.split(",")를 사용했습니다. 결과는 ['사과', '바나나', '오렌지', '포도', '딸기']입니다.