본문 바로가기

개발공부/Python

[파이썬 입문 4] 문자열(슬라이싱, 함수)

1. 문자열이란?

문자열은 문자들의 집합을 의미한다.
앞에서 배운 내용과 같이 한글이나 알파벳 등으로 작성한 글자를 작은 따옴표 또는 큰따옴표로 감싸서 문자열임을 나타낸다.

sentence1 = "나는 소년입니다."
print(sentence1)

# 출력 결과
# 나는 소년입니다.

1-1. 긴 문자 출력하기

문자열을 여러 줄에 거쳐 작성해야하는 경우도 있을 것이다.
이럴때에는 따옴표를 각각 3개씩(큰따옴표 작은따옴표 상관없이 / 하지만 하나의 종류로만 작성되어야함) 넣어 앞뒤로 감싸면 된다.

sentence2 = """
안녕하세요.
반갑습니다.
파이썬 공부중입니다.
"""

print(sentence2)

# 출력 결과
# 안녕하세요.
# 반갑습니다.
# 파이썬 공부중입니다.

작은따옴표로 감쌌을때도 잘 출력되는것을 확인할 수 있다.
하지만 출력 결과만으로는 문자열인지 아닌지 확인하기가 어렵다.

1-2. 타입확인하기 : type() 이란?

type()을 사용하여 문자열인지 아닌지 확인할 수 있다.

sentence1 = "나는 소년입니다."
print(sentence1, type(sentence1))

# 출력 결과
# 나는 소년입니다. <class 'str'>

2. 원하는 만큼 문자열 자르기 : 슬라이싱

파이썬에서는 슬라이싱(slicing)이라는 방법으로 원하는 만큼 데이터를 자를 수 있다.
슬라이싱을 사용하려면 먼저 인덱스(index)를 알아야하는데, 인덱스는 데이터의 순서 또는 위치를 나타낸다.

다음 코드를 한번 살펴보자.

potato = "010203-1234567"
print("성별 식별번호 :" + potato[7])

# 출력 결과
# 성별 식별번호 :1

성별을 나타내는 1이라는 값은 문자열에서 8번째에 자리하고 있는데 왜 7이라고 적었을까?
바로 코드에서 위치를 나타내는 인덱스를 시작할때에는 1부터 시작하는것이 아닌 0부터 시작한다.
즉, 010203-1234567에서 제일 앞에 오는 0은 1번째가 아닌 0번째라는것이다.
따라서 7번째가 1이라는 값이 되는것이다.

2-1. 인덱스 활용하기1

슬라이싱은 대괄호 안에 인덱스를 넣고 필요한 번위를 콜론(:)으로 구분해 표시한다.
콜론을 사이에 두고 시작 인덱스와 종료 인덱스를 넣는다.

예를 들어, [3:7] 이라고 작성하면 3부터 7직전, 즉 3부터 6번째에 있는 데이터를 가져온다.

potato = "010203-1234567"
print("연 : " + potato[0:2]) # 0번째부터 2번째 바로 앞까지
print("월 : " + potato[2:4]) # 2번째부터 4번째 바로 앞까지
print("일 : " + potato[4:6]) # 4번째부터 6번째 바로 앞까지

# 출력 결과
# 연 : 01
# 월 : 02
# 일 : 03

2-2. 인덱스 활용하기2

  • 변수명[:종료인덱스] : 처음부터 종료 인덱스 직전까지 슬라이싱
  • 변수명[시작인덱스:] : 시작 인덱스부터 끝까지 슬라이싱
  • 변수명[:] : 처음부터 끝까지 슬라이싱

슬라이싱은 앞에서부터가 아니라 뒤에서부터 슬라이싱할 수도 있는데, 이때는 음수 인덱스를 사용한다.
단, 양수 인덱스일때는 0부터 시작하지만, 음수 인덱스일때는 -1부터 시작하니 주의하자.

potato = "010203-1234567"
print("주민등록번호 뒷자리(뒤에서부터) : " + potato[-7:])

# 출력 결과
# 주민등록번호 뒷자리(뒤에서부터) : 1234567

3. 함수로 문자열 처리하기

파이썬에서는 문자열을 다루기 쉽도록 굉장히 많은 함수를 제공한다.
그중에서 유용한 몇가지 함수를 알아보자.

  • lower() : 문자열을 소문자로 변환
  • upper() : 문자열을 대문자로 변환
  • islower() : 문자열이 소문자인지 확인
  • isupper() : 문자열이 대문자인지 확인
  • replace() : 문자열 바꾸기
  • index() : 찾는 문자열의 인덱스(없으면 오류 발생)
  • find() : 찾은 문자열의 인덱스(없으면 -1 반환)
  • count() : 문자열이 나온 횟수

문자열 처리 함수는 문자열(또는 문자열을 담은 변수)과 함수를 점(.)으로 연결해서 사용한다.

문자열(또는 변수).함수()

실제로 적용한 예시코드를 보면서 한번 더 이해해보자

python = "Python is Amazing"

print(python.lower()) # 전체를 소문자로 변환
print(python.upper()) # 전체를 대문자로 변환
print(python[0].isupper()) # 0번째(인덱스가 0)에 있는 값이 대문자인지 확인
print(python[1:3].islower()) # 1번째부터 3번째 직전(2번째까지)에 있는 값이 소문자인지 확인
print(python.replace("Python", "JavaScript")) # Python이라는 단어를 Javascript로 바꾸기

# 출력 결과
# python is amazing
# PYTHON IS AMAZING
# True
# True
# JavaScript is Amazing

이렇게 예시코드를 통해서 보면 어떤 함수가 어떤 기능을 하는지 훨씬 더 알아보기 쉬워진다.

그렇다면 여기서 의문을 가질만한 함수가 두가지가 있다.

find()index() 함수이다.
두 함수는 찾는 문자열의 인덱스. 즉, 위치를 알아보는 함수이다.
하지만 둘의 차이는 무엇일까?

3-1. find()와 index() 함수의 차이

시작 인덱스와 종료 인덱스 사이에서 지정한 문자를 찾는데, 이때 시작 인덱스와 종료 인덱스는 생략 가능하다.
시작 인덱스와 종료 인덱스를 모두 생략하면 문자열 전체에서 찾고, 종료 인덱스만 생략하면 시작 인덱스부터 끝까지 문자열을 확인한다.

find(찾는 문자, 시작 인덱스, 종료 인덱스)
index(찾는 문자, 시작 인덱스, 종료 인덱스)

find()index() 함수는 기능이 비슷하지만, 찾는 문자가 문자열 안에 없는 경우에는 결과를 다르게 반환한다.
문자열에 찾는 문자가 없을때 find()함수는 -1을 반환한 후 다음 문장을 실행한다.
반면에 index() 함수는 오류(ValueError: substring not found. 문자열을 발견하지 못함)가 발생하면서 이후 문장을 수행하지 않고 프로그램을 종료한다.

sentence1 = "abcdeded"

find1 = sentence1.find("f")
find2 = sentence1.find("g")

print(find1)
print(find2)

# 출력 결과
# -1
# -1

find()의 경우 "f" 문자열을 찾지 못해도 다음 문장을 실행하고 있는걸 확인할 수 있다.

sentence1 = "abcdeded"

index1 = sentence1.index("f")
index2 = sentence1.index("g")

print(index1)
print(index2)

# 출력 결과
# Traceback (most recent call last):
#   File "/Users/potato/Desktop/pythonworkspace/ch4-3.py", line 11, in <module>
#     index1 = sentence1.index("f")
# ValueError: substring not found

index()함수의 경우 "f" 문자열을 찾지 못한다는 메세지를 출력하고 다음 문장을 실행하고 있지 않는것을 확인할 수 있다.

3-2. index()함수 보다는 find()함수가 더 유용한것이 아닐까?

나는 위 예시코드들을 보면서 에러메세지를 출력하는 index()함수보다는 find()함수가 더 용이하지 않을까 라는 생각이 들어서
index() 함수를 사용하면 적절한 예시를 찾아보았다.

  • 하위 문자열의 존재여부에 대해 해당 문자열이 없으면 오류로 처리되어야 하는 경우
  • 코드를 더 깔끔하고 명확하게 만들기 위해 오류 처리에 예외를 사용하는 경우
# 하위 문자열 존재 확인
# 하위 문자열의 존재가 작업에 매우 중요하고 해당 하위 문자열이 없으면 오류가 발생해야 한다.
Traceback (most recent call last):
  File "/Users/kimminji/Desktop/pythonworkspace/ch4-3.py", line 11, in <module>
    index1 = sentence1.index("f")
ValueError: substring not found



# 예외가 포함된 더욱 깔끔한 제어 흐름
# 코드에서 오류 사례를 처리하기 위해 이미 except를 사용하는 경우 
# index()를 사용하면 제어 흐름이 더욱 깔끔하고 일관되게 될 수 있다.
Traceback (most recent call last):
  File "/Users/kimminji/Desktop/pythonworkspace/ch4-3.py", line 11, in <module>
    index1 = sentence1.index("f")
ValueError: substring not found




# 코드 가독성
# 일부 개발자의 경우 except를 사용하여 오류를 처리하면 '-1'값을 확인하는 대신
# 코드를 더 읽기 쉽고 명시적으로 만들 수 있다.
Traceback (most recent call last):
  File "/Users/kimminji/Desktop/pythonworkspace/ch4-3.py", line 11, in <module>
    index1 = sentence1.index("f")
ValueError: substring not found

아직 위 코드들이 무슨말인지는 모르겠지만 일단 index()도 유용하게 쓰이는 상황이 있구나~
하는 정도로 넘어가기로 했다.

3-3. count() 함수

count()함수는 지정한 문자 또는 문자열이 총 몇번 나오는지 횟수를 확인할 수 있다.
만약 해당 문자나 문자여링 없다면 0 으로 표시한다.

sentence1 = "abcdeded"

print(sentence1.count("d"))
print(sentence1.count("f"))

# 출력 결과
# 3
# 0

3-4. len() 함수

len() 함수는 문자열만을 위한 함수는 아니지만 문자열에서도 자주 사용하는 함수이다.
len() 함수는 문자열의 길이 정보를 알려주는데, 이때 문자열 길이에는 공백까지 모두 포함한다.

앞에서 다룬 문자열 처리함수들은 문자열(또는 변수).함수() 의 형태로 사용하지만,
len() 함수는 len(문자열 또는 변수)의 형태로 사용한다.

sentence1 = "abcdeded"

print(len(sentence1))

# 8