파이썬 기본 자료형 2부

파이썬에서 기본 자료형인 문자열 자료형을 살펴 본다.

  • 문자열 자료형(str):
    • 'a', 'abc', 'enginneering', ... 등등
    • 'abc' * 2, 'engineering' + 'math', 등등
  • 문자열 자료형과 관련하여 많이 사용되는 함수와 메소드를 살펴본다.

문자열(str)

문자들의 나열로 이루어진 값을 문자열(string)이라 부른다.


In [1]:
hello = 'hello'

print( hello )


hello

변수의 이름에 할당될 문자열과 동일할 필요는 물론 없다.


In [2]:
falafel = 'kebap'

print(falafel)


kebap

문자열의 덧셈은 이어붙이기이다.


In [3]:
print("kebap" + " and " + falafel)


kebap and kebap

문자열과 숫자를 곱하는 것은 반복해서 붙여주기이다.


In [4]:
"kebap" * 7


Out[4]:
'kebapkebapkebapkebapkebapkebapkebap'

In [5]:
7 * "kebap"


Out[5]:
'kebapkebapkebapkebapkebapkebapkebap'

문자열의 연산은 덧셈과 곱셈에 대해서만 정의되어 있다. 나눗셈, 뺄셈은 정의되어 있지 않다.

주의 문자열의 곱셈은 정수와의 곱셈만 가능하다.


In [6]:
"gyros"/"falafel"


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-ec2273e01fb3> in <module>()
----> 1 "gyros"/"falafel"

TypeError: unsupported operand type(s) for /: 'str' and 'str'

In [7]:
"gyros" - "falafel"


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-df4656ac4e0f> in <module>()
----> 1 "gyros" - "falafel"

TypeError: unsupported operand type(s) for -: 'str' and 'str'

In [8]:
"gyros" * "falafel"


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-f76c20505226> in <module>()
----> 1 "gyros" * "falafel"

TypeError: can't multiply sequence by non-int of type 'str'

문자열과 문자열이 할당된 변수들을 이용하여 새로운 문자열을 생성할 수 있다.


In [9]:
order = hello + ', I would like a ' + falafel + '.'

print(order)


hello, I would like a kebap.

문자열 메소드

문자열 자료형에만 사용하는 함수들이 있다. 이와같이 특정 자료형에만 사용하는 함수들을 메소드라 부른다. 보다 자세한 설명은 여기서는 하지 않는다. 다만 특정 자료형을 잘 다루기 위해서는 사용할 수 있는 메소드들을 잘 파악해두는 것이 매우 중요하다는 점만 강조한다.

특히, 메소드의 위치에 주목한다. 예를 들어, 문자열의 첫 문자를 대문자로 바꾸기 위해서는 capitalize() 메소드를 아래와 같이 사용한다.


In [10]:
order.capitalize()


Out[10]:
'Hello, i would like a kebap.'

문자열의 특정 문자열로 끝나는 것을 확인해주는 endswith()라는 메소드도 있다.


In [11]:
order.endswith('bap.')


Out[11]:
True

In [12]:
order.endswith('bap')


Out[12]:
False

함수와 메소드의 활용 방식의 차이점

  • 일반적으로 함수는 함수이름(인자1, 인자2, ...) 형태로 사용되나 capitalize(order)를 실행하면 오류가 난다.
  • 이유는 capitalize가 일반 함수가 아니라 문자열 자료형 값과만 사용하는 메소드, 즉 특수한 함수이기 때문이다.

변경된 문자열을 새로운 변수에 저장이 가능하다.


In [13]:
order1 = order.capitalize()
print(order1)


Hello, i would like a kebap.

하지만 원래의 문자열은 변경되지 않는다. 이미 말했듯이 한 번 생성된 문자열은 절대로 변경이 불가하다.


In [14]:
order


Out[14]:
'hello, I would like a kebap.'

capitalize() 비슷하지만 다른 일을 하는 메소드들은 다음과 같다.

  • lower(): 모든 문자를 소문자로 바꾼다.
  • upper(): 모든 문자를 대문자로 바꾼다.
  • title(): 모든 단어의 첫문자를 대문자로 바꾼다.

In [15]:
order.lower()


Out[15]:
'hello, i would like a kebap.'

In [16]:
order.upper()


Out[16]:
'HELLO, I WOULD LIKE A KEBAP.'

In [17]:
order.title()


Out[17]:
'Hello, I Would Like A Kebap.'

또한 문자열이 순수 알파벳으로만 이루어졌는지 여부를 판단할 수 있다.


In [18]:
hello.isalpha()


Out[18]:
True

In [19]:
'abc_'.isalpha()


Out[19]:
False

In [20]:
'abc '.isalpha()


Out[20]:
False

물론 순수 숫자로 이루어졌는지 여부도 알 수 있다. 이 기능은 텍스트에서 전화번호 등이 있는지 여부를 알아내기 위해 사용되기도 한다.

주의: isnumric() 메소드를 활용한다. 하지만, 해당 메소드는 유니코드 문자열에 대해서만 작동한다.

파이썬에서 유니코드 문자열을 표시하기 위해서 아래와 같이 u라는 기호를 앞에 붙혀주면 된다. 유니코드(unicode)는 전세계의 문자를 컴퓨터에서 일관된 방식으로 처리하는 표준이라고 알고 있는 것으로 여기서는 충분하다.


In [21]:
u'46'.isnumeric()


Out[21]:
True

In [22]:
u'4.6'.isnumeric()


Out[22]:
False

In [23]:
u'4a6'.isnumeric()


Out[23]:
False

숫자로만 이루어닌 문자열을 진짜 숫자로 형변환시킬 수 있다. 예를 들어 int() 함수를 이용한다.


In [24]:
real_number = int('4')

print( real_number )
print( type(real_number) )


4
<type 'int'>

float() 함수를 이용하면 부동소수점 모양의 문자열을 부동소수점으로 형변환시킬 수 있다.


In [25]:
float('4.2') * 2


Out[25]:
8.4

int() 함수는 정수모양의 문자열에만 사용할 수 있다.


In [26]:
int('4.2') * 2


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-26-1264ce07b5b6> in <module>()
----> 1 int('4.2') * 2

ValueError: invalid literal for int() with base 10: '4.2'

In [27]:
int('4') * 2


Out[27]:
8

부동소수점 모양의 문자열이 아니면 float() 함수도 오류를 발생시킨다.


In [28]:
float('I would like 4.5 gyros')


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-28-b7a074fdfbca> in <module>()
----> 1 float('I would like 4.5 gyros')

ValueError: could not convert string to float: I would like 4.5 gyros

문자열 자료형의 정체

문자열은 사실 컬렉션 자료형이다! 문자열은 여러 개의 문자들을 묶어서 다루기 때문이다. 따라서 컬렉션 자료형과 관련된 특징을 여러 개 갖고 있다. 예를 들어, 문자열에 포함된 각각의 문자를 확인하거나 읽을 수 있는 인덱싱(indexing)과 문자열의 일부를 추출하는 슬라이싱(slicing) 기능을 갖고 있다.

인덱싱

문자열 자료형 값 또는 변수 바로 뒤에 대괄호 기호인 [ ]를 사용한다.


In [29]:
falafel


Out[29]:
'kebap'

In [30]:
falafel[1]


Out[30]:
'e'

주의: 파이썬을 포함해서 많은 대부분의 프로그래밍 언어에서 인덱싱은 0부터 시작한다. 따라서 첫 째 문자를 확인하고자 할 때는 1이 아닌 0을 인덱스로 사용해야 한다.


In [31]:
falafel[0]


Out[31]:
'k'

인덱싱은 왼쪽에서부터 0으로 시작하며 오른쪽으로 진행할 때마다 1씩 증가한다. 예를 들어 세 번째 문자를 확인하고 싶다면 인덱스 2를 사용한다.


In [32]:
falafel[2]


Out[32]:
'b'

문자열이 길 경우 맨 오른편에 위치한 문자의 인덱스 번호를 확인하기가 어렵다. 그래서 파이썬에서는 -1을 마지막 문자의 인덱스로 사용한다.

즉, 맨 오른편의 인덱스는 -1이고, 그 왼편은 -2, 등등으로 진행한다.


In [33]:
falafel[-1]


Out[33]:
'p'

In [34]:
falafel[-2]


Out[34]:
'a'

문자열의 길이보다 같거나 큰 인덱스를 사용하면 오류가 발생한다. 문자열의 길이는 len() 함수를 이용하여 확인할 수 있다.


In [35]:
len(falafel)


Out[35]:
5

In [36]:
falafel[5]


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-36-9c7825952384> in <module>()
----> 1 falafel[5]

IndexError: string index out of range

주의: falafel 변수에 할당된 값은 kebap이란 문자열이다. kebap 문자열의 길이는 5이지만 마지막 문자인 p의 인덱스는 그보다 하나 작은 4이다.

슬라이싱

문자열의 하나의 문자가 아닌 특정 구간 및 부분을 추출하고자 할 경우 슬라이싱을 사용한다. 슬라이싱은 다음과 같이 실행한다.

문자열변수[시작인덱스 : 끝인덱스 : 계단(step)]

  • 시작인덱스: 해당 인덱스부터 문자를 추출한다.
  • 끝인덱스: 해당 인덱스 까지 문자를 추출한다.
  • 계단: 시작인덱스부터 몇 계단씩 건너뛰며 문자를 추출할지 결정한다. 예를 들어 계단값이 2라면 하나 건너 추출한다.

In [37]:
falafel


Out[37]:
'kebap'

kebap에서 ke 부분을 추출하고 싶다면 다음과 같이 하면 된다:


In [38]:
falafel[0 : 2 : 1]


Out[38]:
'ke'

즉, 문자열 처음부터 2번 인덱스 전까지, 즉 두 번째 문자까지 모두 추출하는 것이다. 반면에 하나씩 건너서 추출하려면 다음처럼 하면 된다:


In [39]:
falafel[0 : 4 : 2]


Out[39]:
'kb'

시작인덱스, 끝인덱스, 계단 각각의 인자가 경우에 따라 생략될 수도 있다. 그럴 때는 각각의 위치에 기본값(default)이 들어 있는 것으로 처리되며, 각 자리의 기본값은 다음과 같다.

  • 시작인덱스의 기본값 = 0
  • 끝인덱스의 기본값 = 문자열의 길이
  • 계단의 기본값 = 1

In [40]:
falafel[0 : 2]


Out[40]:
'ke'

In [41]:
falafel[: 2]


Out[41]:
'ke'

In [42]:
falafel[: 4 : 2]


Out[42]:
'kb'

In [43]:
falafel[ : : 2]


Out[43]:
'kbp'

양수와 음수를 인덱스로 섞어서 사용할 수도 있다.


In [44]:
falafel[ : -1 : 2]


Out[44]:
'kb'

주의: -1은 문자열의 끝인덱스를 의미한다.

끝인덱스가 문자열의 길이보다 클 수도 있다. 다만 문자열의 길일 만큼만 문자를 확인한다.


In [45]:
falafel[: 10]


Out[45]:
'kebap'

아래와 같이 아무 것도 입력하지 않으면 해당 문자열 전체를 추출한다.


In [46]:
falafel[:]


Out[46]:
'kebap'

시작인덱스 값이 끝 인덱스 값보다 같더가 작아야 제대로 추출한다. 그렇지 않으면 공문자열이 추출된다.


In [47]:
falafel[3 : 1]


Out[47]:
''

이유는 슬라이싱은 기본적으로 작은 인덱스에 큰 인덱스 방향으로 확인하기 때문이다. 역순으로 추출하고자 한다면 계단을 음수로 사용하면 된다.


In [48]:
falafel[3 : 1 : -1]


Out[48]:
'ab'

In [49]:
falafel[-1 : : -1]


Out[49]:
'pabek'

연습문제

애완동물의 목록을 할당받는 pet_shop 변수가 아래와 같이 선언되어 있다.


In [50]:
pet_shop = 'dog cat hedgehog fish bird'

연습

애완동물의 종류를 의미하는 단어의 첫알파벳을 대문자로 바꾸려면 어떻게 해야 하는가? 단, 특정 메소드를 사용하여 한 줄 코드로 작성해야 한다.

견본답안:


In [51]:
pet_shop.title()


Out[51]:
'Dog Cat Hedgehog Fish Bird'

연습

pet_shop으로부터 g 문자 하나를 추출하라.

견본답안:


In [52]:
pet_shop[2]


Out[52]:
'g'

연습

hedgehog을 추출하려면?

견본답안:


In [53]:
pet_shop[8 : 16]


Out[53]:
'hedgehog'

연습

gohegdeh을 추출하려면?

견본답안:


In [54]:
pet_shop[15: 7 : -1]


Out[54]:
'gohegdeh'

연습

dogscats 두 개의 변수가 다음과 같이 선언되었다.


In [55]:
dogs, cats = '8', '4'
  • 강아지와 고양이를 몇 마리씩 갖고 있는지 확인하는 방법은?
  • 강아지가 고양이보다 몇 마리 더 많은지 확인하는 방법은?

견본답안:


In [56]:
print(int(dogs))


8

In [57]:
print(int(cats))


4

In [58]:
print(abs(int(dogs) - int(cats)))


4