11.1 시퀀스 자료형의 공통 기능 사용하기

Unit 11. 시퀀스 자료형 활용하기

우리가 지금까지 사용했던 리스트, 튜플, range, 문자열을 잘 보면 공통점이 있습니다. 이들 모두 값이 연속적(sequence)으로 이어져 있다는 점입니다.

그림 11-1 값이 연속적으로 이어진 자료형

파이썬에서는 리스트, 튜플, range, 문자열처럼 값이 연속적으로 이어진 자료형을 시퀀스 자료형(sequence types)라고 부릅니다.

그림 11-2 시퀀스 자료형

이 시퀀스 자료형 중에서 list, tuple, range, str을 주로 사용하며 bytes, bytearray라는 자료형도 있습니다(bytes, bytearray는 여기서 따로 설명하지 않겠습니다. 자세한 내용은 '47.3 bytes, bytearray 사용하기'를 참조해주세요).

이번 유닛에서는 시퀀스 자료형의 공통된 기능을 알아보겠습니다.

11.1 시퀀스 자료형의 공통 기능 사용하기

시퀀스 자료형의 가장 큰 특징은 공통된 동작과 기능을 제공한다는 점입니다. 따라서 시퀀스 자료형의 기본적인 사용 방법을 익혀 두면 나중에 어떠한 시퀀스 자료형을 접하게 되더라도 큰 어려움 없이 바로 사용할 수 있습니다.

시퀀스 자료형으로 만든 객체를 시퀀스 객체라고 하며, 시퀀스 객체에 들어있는 각 값을 요소(element)라고 부릅니다.

그림 11-3 시퀀스 객체와 요소

11.1.1  특정 값이 있는지 확인하기

먼저 시퀀스 객체 안에 특정 값이 있는지 확인하는 방법부터 알아보겠습니다. 다음은 리스트 a에서 30과 100이 있는지 확인합니다.

  • 값 in 시퀀스객체
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> 30 in a
True
>>> 100 in a
False

시퀀스 객체에 in 연산자를 사용했을 때 특정 값이 있으면 True, 없으면 False가 나옵니다. 따라서 리스트 a에 30이 있으므로 True, 100이 없으므로 False가 나옵니다.

반대로 in 앞에 not을 붙이면 특정 값이 없는지 확인합니다.

  • 값 not in 시퀀스객체
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> 100 not in a
True
>>> 30 not in a
False

이렇게 not in은 특정 값이 없으면 True, 있으면 False가 나옵니다.

물론 튜플, range, 문자열도 같은 방법으로 활용할 수 있습니다.

>>> 43 in (38, 76, 43, 62, 19)
True
>>> 1 in range(10)
True
>>> 'P' in 'Hello, Python'
True

11.1.2  시퀀스 객체 연결하기

시퀀스 객체는 + 연산자를 사용하여 객체를 서로 연결하여 새 객체를 만들 수 있습니다.

  • 시퀀스객체1 + 시퀀스객체2
>>> a = [0, 10, 20, 30]
>>> b = [9, 8, 7, 6]
>>> a + b
[0, 10, 20, 30, 9, 8, 7, 6]

리스트 ab를 더하니 두 리스트가 연결되었습니다. 물론 변수를 만들지 않고 리스트 여러 개를 직접 연결해도 상관없습니다.

그림 11-4 시퀀스 객체 연결하기

단, 시퀀스 자료형 중에서 range+ 연산자로 객체를 연결할 수 없습니다.

>>> range(0, 10) + range(10, 20)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    range(0, 10) + range(10, 20)
TypeError: unsupported operand type(s) for +: 'range' and 'range' 

이때는 range를 리스트 또는 튜플로 만들어서 연결하면 됩니다.

>>> list(range(0, 10)) + list(range(10, 20))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> tuple(range(0, 10)) + tuple(range(10, 20))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)

문자열은 + 연산자로 여러 문자열을 연결할 수 있습니다.

>>> 'Hello, ' + 'world!'
'Hello, world!'

따옴표로 묶은 문자열 'Hello, ''world!'를 연결하여 'Hello, world!'가 나왔습니다. 파이썬에서 문자열 연결은 여러 가지 결과를 묶어서 한 번에 출력할 때 자주 사용합니다.

참고 | 문자열에 숫자 연결하기

앞에서 + 연산자를 사용하여 문자열끼리 서로 연결했습니다. 그러면 문자열에 숫자를 연결할 수는 없을까요? 다음과 같이 'Hello, '에 10을 연결해봅니다.

>>> 'Hello, ' + 10
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    'Hello, ' + 10
TypeError: Can't convert 'int' object to str implicitly 

문자열에 정수를 연결하려고 하면 에러가 발생합니다(정수를 문자열로 변환할 수 없어서 TypeError가 발생합니다). 이 문제를 해결하려면 str을 사용하여 숫자(정수, 실수)를 문자열로 변환하면 됩니다.

'문자열' + str(정수)

'문자열' + str(실수)

>>> 'Hello, ' + str(10)      # str을 사용하여 정수를 문자열로 변환
'Hello, 10'
>>> 'Hello, ' + str(1.5)     # str을 사용하여 실수를 문자열로 변환
'Hello, 1.5'

'Hello, ' + str(10)과 같이 str을 사용하여 10을 문자열로 변환한 뒤 'Hello, '와 연결했습니다. 즉, 문자열에 +를 사용할 때는 어떤 형태의 값이든 str을 사용해서 문자열로 맞춰주면 됩니다. 특히 이 방식은 파이썬에서 자주 사용하는 방식인데요. 문자열과 숫자를 간단하게 조합할 수 있어서 계산 결과와 설명을 함께 출력할 때 편리합니다.

11.1.3  시퀀스 객체 반복하기

이번에는 시퀀스 객체를 반복하는 방법입니다. * 연산자는 시퀀스 객체를 특정 횟수만큼 반복하여 새 시퀀스 객체를 만듭니다(0 또는 음수를 곱하면 빈 객체가 나오며 실수는 곱할 수 없습니다).

  • 시퀀스객체 * 정수
  • 정수 * 시퀀스객체
>>> [0, 10, 20, 30] * 3
[0, 10, 20, 30, 0, 10, 20, 30, 0, 10, 20, 30]

요소 0, 10, 20, 30이 들어있는 리스트를 3번 반복해서 새 리스트를 만들었습니다.

그림 11-5 시퀀스 객체 반복하기

앞에서 range+ 연산자로 객체를 연결할 수 없었죠? 마찬가지로 range* 연산자를 사용하여 반복할 수 없습니다.

>>> range(0, 5, 2) * 3
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    range(0, 5, 2) * 3
TypeError: unsupported operand type(s) for *: 'range' and 'int' 

이때는 range를 리스트 또는 튜플로 만들어서 반복하면 됩니다.

>>> list(range(0, 5, 2)) * 3
[0, 2, 4, 0, 2, 4, 0, 2, 4]
>>> tuple(range(0, 5, 2)) * 3
(0, 2, 4, 0, 2, 4, 0, 2, 4)

문자열은 * 연산자를 사용하여 반복할 수 있습니다.

>>> 'Hello, ' * 3
'Hello, Hello, Hello, '