CODICT

1. Python의 자료형 (데이터 타입 = Data Type) 본문

Programming/Python

1. Python의 자료형 (데이터 타입 = Data Type)

Foxism 2019. 9. 17. 16:59

이번 게시글에서는 파이썬의 자료형인 불리언(Boolean), 정수, 실수, 문자열 자료형에 대해 다루게 될 것입니다. 제대로 다루기에 앞서 간략하게 소개하자면, 불리언(Boolean) 자료형은 True 혹은 False의 값만 갖는 자료형을 의미합니다. 파이썬에서 가장 간단한 자료형입니다. 정수 자료형은 42와 같은 숫자를 의미합니다. 실수 자료형은 3.14159와 같이 소수점이 있는 숫자 혹은 3.14e8과 같은 지수를 의미합니다. 이때, e8은 10의 8 제곱인 100000000을 의미합니다. 문자열 자료형은 텍스트 문자들의 시퀀스(Sequence)를 의미합니다. 시퀀스란, 데이터에 번호를 붙여 나열한 것을 의미합니다. 즉, 순서를 매겼다는 뜻입니다.

이번 게시글에서는 위에서 간단하게 설명한 자료형들을 하나하나 사용해보고, 다음 게시글에서 이 자료형들을 적절하게 조합하는 방법에 대해 설명하겠습니다.

각 자료형은 특정한 규칙을 갖으며, 컴퓨터에 따라 다르게 처리됩니다. 변수(Variable, 실제 데이터를 참조하는 이름)에 대해서도 설명할 것입니다.

이번 게시들에서 등장할 예제들은 모두 파이썬에서 동작하는 짧은 코드로 구성되어 있습니다. 대화식 인터프리터를 이용하여 코드를 입력하고, 결과를 확인 바로 확인할 수 있습니다. 물론 나중에는 파이썬 프로그램을 파일로 작성하여 실행하는 방식으로 설명하도록 하겠습니다.


1. 변수, 이름, 객체

 

파이썬에서 등장하는 모든 것은 객체로 구현되어 있습니다. 따라서, 파이썬은 다른 언어에선 볼 수 없는 언어의 일관성과 유용한 기능들을 제공합니다.

객체라 함은, 데이터가 담긴 박스와 같습니다. 객체는 데이터와 함께 무엇을 처리할 수 있는지 결정하는 부울 혹은 정수와 같은 타입입니다. 일상에서 유리잔이 그려진 박스는 '취급주의, 조심히 다루십시오'와 같은 의미를 담고 있습니다. 이처럼 파이썬에서 객체의 타입이 int라면, 여기에 또 다른 int를 더할 수 있다는 것을 의미합니다.

뿐만 아니라, 타입은 박스에 포함된 데이터 값을 변경할 수 있는 가변(Mutable)의 변수인지 혹은 변경할 수 없는 불변(Immutable)의 상수인지 판단할 수 있습니다. 투명한 박스로 예를 들어보면 가변 객체는 열린 박스와 같아서, 값을 볼 수도 있으며 바꿀 수도 있습니다. 하지만 타입은 변경할 수 없습니다. 불변 객체는 닫힌 상자와 같아서 값을 볼 수는 있지만, 바꿀 수도 없고, 타입도 변경할 수 없습니다.

파이썬은 객체의 타입을 바꿀 수 없는 강타입(Strong Type)입니다. 심지어 그 값이 가변인 경우에도 타입을 바꿀 수 없습니다.

프로그래밍 언어에서는 변수를 선언하여 사용할 수 있습니다. 변수는 컴퓨터 메모리에 있는 값을 참조하기 위한 이름이며, 코드에서 이를 선언해서 사용할 수 있습니다. 파이썬에서는 변수에 값을 할당하기 위해 대입 연산자 '='을 사용합니다. 참고할 점이라면, 초등학교 수학 시간에 '='은 '같다'의 의미로 배웠을 것입니다. 그러나 파이썬을 비롯한 다양한 프로그래밍 언어에서는 '='을 '할당하다'라는 의미로 사용합니다. '같다'라는 의미로는 보통 비교 연산자의 '=='을 사용합니다.

다음 두 줄의 파이썬 코드는 a라는 이름의 변수에 정수 값 7을 할당합니다. 그리고 a에 할당된 값을 출력합니다.

>>> a = 7
>>> print(a)

파이썬 변수의 핵심은, 변수는 단지 이름일 뿐이라는 것입니다. 할당한다는 의미는 값을 복사하는 것이 아닌, 데이터가 담긴 객체에 그냥 이름을 붙이는 것입니다. 그 이름은 객체 자신에 포함되는 것이라기보다는 객체의 '참조'입니다. 아까 설명에서 사용한 박스를 이용하자면, 7이 담긴 박스에 'a'라고 메모하는 것입니다. 이 상태에서 'b=a'라는 코드를 작성하면, 박스에 'b'라는 메모도 추가되는 것이죠.

파이썬에서 변수 혹은 리터럴 값의 타입을 알고 싶다면, 'type()'의 괄호 안에 변수 혹은 리터럴 값을 입력하여 사용하면 됩니다. 다음과 같이 입력해보겠습니다.

>>> type(a)
#<class 'int'>
>>> type(123)
#<class 'int'>
>>> type(1.23)
#<class 'float'>
>>> type('abc')
#<class 'str'>

주의할 점은, 마지막 'type('abc')'를 입력할 때, 꼭 abc의 양 옆에 따옴표를 붙여야 한다는 점입니다. 그렇지 않으면 변수 abc를 의미하니, 유의하시기 바랍니다. 각각의 코드에 대한 결과에서 등장하는 클래스(Class)는 객체의 정의를 의미합니다. 추후 작성될 게시글에서 더 자세히 다루겠습니다. 파이썬에서 'class'와 'type'은 의미가 거의 같다고 생각하셔도 됩니다.

변수의 이름에는 다음 문자만 사용할 수 있습니다.

  • 소문자(a ~ z)

  • 대문자(A ~ Z)

  • 숫자(0 ~ 9)

  • 언더스코어(_)

단, 이름은 숫자로 시작할 수 없습니다. 또한, 파이선은 언더스코어로 시작하는 이름을 특별한 방법으로 처리합니다. 이 부분에 관해서도 추후 작성될 게시글에서 더 자세히 다루겠습니다.

또한, 아래에 있는 이름들은 파이썬의 예약어(Reserved Word)로, 변수로 선언할 수 없습니다.

False

class

finally

is

return

None

continue

for

lambda

try

True

def

from

nonlocal

while

and

del

global

not

with

as

elif

if

or

yield

assert

else

import

pass

break

except

in

raise

   

이 단어들은 파이썬의 구문을 정의하는 데 사용되며, 아마 앞으로 작성될 게시글들의 전반에 걸쳐서 볼 수 있을 것입니다.

 

2. 숫자

 

파이썬은 정수(5, 314 등)와 실수라고 불리는 부동소수점수(3.1415, 1.23, 12.34e3 등)를 지원하는 기능이 내장되어 있습니다. 다음 표에 등장하는 간단한 수학 연산자로 결합해서 계산할 수 있습니다.

연산자

설명

결과

+

더하기

1 + 3

4

-

빼기

3 - 1

2

*

곱하기

2 * 3

6

/

나누기

7 / 2

3.5

//

7 // 2

3

%

나머지

3 % 2

1

**

지수

2 ** 3

8

 

2.1. 정수

 

대화식 인터프리터에서 연속된 숫자는 리터럴(Literal) 정수로 간주합니다. 숫자 0을 사용할 수 있지만, 05와 같이 다른 숫자 앞에 넣을 수는 없습니다. 숫자 앞에 +기호를 붙이거나, 아무런 기호가 없는 경우 양수로 간주되며, 음수를 표현하기 위해서는 -기호를 붙여야 합니다. 숫자와 연산자 사이의 공백에 상관없이 계산을 수행하기 때문에 취향에 따라 공백을 넣어 계산을 하여도 무방합니다.

나눗셈에서는 /를 이용한 나눗셈과 //를 이용한 나눗셈을 지원합니다. /를 이용한 나눗셈은 부동소수점을 포함한 결과를 출력하고, //는 부동소수점을 제외한 결과인 몫만을 출력합니다. 정수를 정수로 나누더라도 /를 이용한 나눗셈에서는 부동소수점 결과가 나오게 됩니다. 또한, 0으로 나누면 에러가 발생하게 됩니다. 

아래의 코드는 기존에 있던 a에서 3을 뺀 후, 다시 a에 저장하는 코드입니다.

>>> a = a - 3

등호의 오른쪽에서 뺄셈을 계산하여 그 결과를 왼쪽의 a에 할당합니다. 이처럼 파이썬에서는 등호의 오른쪽 부분을 왼쪽 부분보다 먼저 계산한 후, 왼쪽에 오른쪽의 결과를 할당합니다. 아래의 코드처럼, 등호 앞에 산술 연산자를 결합하여 할당할 수 있습니다.

>>> a -= 3

위 코드는 앞서 작성한 코드와 동일한 기능을 수행합니다. 단순히 뺄셈뿐만이 아니라, 이번 문단을 시작하며 소개한 여러 가지 연산자와 결합할 수 있습니다.

% 는 파이썬에서 다양한 용도로 사용됩니다. 기호 왼쪽의 숫자를 기호 오른쪽의 숫자로 나눈 나머지가 계산됩니다. 만약, 소수점을 제외한 몫과 나머지를 동시에 얻고 싶다면 다음의 함수를 이용하여 구할 수 있습니다.

>>> divmod(13, 5)
#(2, 3)

결괏값은 튜플로 반환되며, 함수와 튜플에 대해서는 추후 작성될 게시글에서 상세히 다루도록 하겠습니다. 물론 이 계산은 //와 %를 이용하여 따로 계산할 수도 있습니다.

 

2.2. 우선순위

 

다음과 같이 입력하면 어떤 결과가 나올까요?

>>> 2 + 3 * 4

두 가지 해석을 할 수 있을 것입니다. 2 + 3을 먼저 계산하여 20이 나오는 해석과, 3 * 4를 먼저 계산하여 14가 나오는 해석입니다. 대부분의 언어와 마찬가지로 파이썬에서 곱셈은 덧셈보다 높은 우선순위를 갖고 있습니다. 따라서, 14가 나오는 해석이 나오게 됩니다. 우선순위는 다음과 같습니다. 시간이 많이 있다면, 한 번 읽어보는 것도 나쁘진 않습니다.

더보기

이 표는 파이썬 3 연산자 우선순위에 대한 공식 문서에 근거하여 작성되었습니다. 표 상단에 위치할수록 우선순위가 높습니다.

연산자 설명
[v1, ...], {v1, ...}, {k1: v1, ...}, (...) 리스트 / 집합 / 딕셔너리 / 제너레이터 생성 혹은 컴프리헨션, 괄호에 싸인 표현식
seq[n], seq[n : m], func(args...), obj.attr 인덱스, 슬라이스, 함수 호출, 속성 참조
** 지수
'+'x, '-'x, '~'x 양수, 음수, 비트 연산 not
*, /, //, % 곱하기, 나누기, 몫, 나머지
+, - 더하기, 배기
<<, >> 왼쪽 시프트, 오른쪽 시프트(비트 연산)
& and(비트 연산)
| or(비트 연산)
in, not in, is, is not, <, <=, >, >=, !=, == Membership, Identity, 비교 연산자
not x 불리언 not(논리 연산)
and 불리언 and
or 불리언 or
if ... else 조건식
lambda 람다

물론 이 우선순위를 모두 외울 필요는 없습니다. 먼저 수행하고자 하는 계산식에 괄호를 붙이면 쉽게 해결할 수 있습니다. 이 방법을 사용하여 코드를 읽는 사람이 계산 의도를 추측하거나 위 표와 같은 우선순위 규칙을 찾아볼 필요가 없습니다.

 

2.3. 진수

 

정수 앞에 진수(Base)를 붙이지 않으면 10진수로 간주합니다. 보통 10진수 이외의 진수는 사용빈도가 낮습니다. 코드 목적에 따라 빈도가 다르지만, 언젠가 한 번은 접하게 될 것이기 때문에 소개하고자 합니다.

진수는 1을 올림 할 때까지 숫자를 어디까지 셀 수 있는지 나타냅니다. 2진수(Binary)에는 숫자 0과 1밖에 없습니다. 2진수의 0은 10진수의 0과 같고 1도 마찬가지지만, 2진수에서 1과 1을 더하면 10을 얻습니다.

파이썬에서는 10진수 외에도 3가지 리터럴 정수를 표현할 수 있습니다.

  • 2진수(Binary): 0b 혹은 0B

  • 8진수(Octal): 0o 혹은 0O

  • 16진수(Hex): 0x 혹은 0X

인터프리터는 이 리터럴 정수들을 10진수로 출력해줍니다. 10진수 이외의 다른 진수도 사용하는 이유는, 비트 단위(Bit-Level) 연산에서 유용하게 쓰이기 때문입니다. 추후 작성될 게시글에서 서로 다른 진수로 변환하는 방법과 비트 단위 연산에 대해 자세히 다루도록 하겠습니다.

 

2.4. 형 변환

 

다른 데이터 타입을 정수형으로 변환하려면 int() 함수를 사용합니다. 이 함수는 소수점을 버리고 정수를 반환합니다.

파이썬에서 가장 간단한 데이터 타입은 True와 False 값만을 가진 불리언 형입니다. 이 타입을 정수로 변환하면 각각 1과 0을 반환합니다. 앞서 말했듯이, 소수점을 버리고 정수를 반환하기 때문에, 부동소수점수를 정수로 변환하면 소수점 이하는 버려지게 됩니다. +, - 기호와 숫자로 이루어진 텍스트 문자열을 정수로 변환하여도 양/음수 구분은 여전히 됩니다. 다만, 숫자가 아닌 다른 뭔가를 변환하면 예외(Exception)가 발생하게 됩니다. 이는 소수점이나, 지수의 표현에도 마찬가지입니다. 오류와는 다른 개념이나, 자세한 것은 추후 작성될 게시글을 통해 자세히 설명하도록 하겠습니다.

만약 숫자의 타입을 섞어서 사용하면, 파이썬은 자동으로 형 변환을 합니다. 정수 혹은 부동소수점수와 같이 불리언 값을 계산할 때 False는 0 혹은 0.0으로, True는 1 혹은 1.0으로 간주합니다.

 

2.5. int의 크기

 

이전 버전의 파이썬에서 int의 크기는 32비트로 제한되었습니다. 대략 -21.4억 ~ 21.4억 까지 저장할 수 있는 공간입니다. long은 그보다 더 많은 공간인 64비트입니다. -922.3경 ~ 922.3경 정도입니다.

파이썬 3에서는 long이 사라지고, int의 크기가 64비트 이상의 공간을 가질 수 있게 되었습니다. 이에 따라 다음과 같은 수를 저장할 수도 있습니다.

>>> googol = 10**100
>>> googol
#10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> googol * googol
#100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

대부분의 언어에서는 컴퓨터가 허용한 공간보다 더 많은 공간을 차지하게 되어 정수 오버플로우(Integer Overflow)가 발생하게 될 것이며, 여러모로 골치 아픈 상황이 벌어지게 됩니다. 하지만 파이썬에선 문제없습니다.

 

2.6. 부동소수점수

 

정수는 숫자만으로 구성되어 있지만, 부동소수점수(float이라고 파이썬은 지칭합니다.)는 소수점이 있습니다. 부동소수점수는 앞서 소개한 연산자와 divmod() 함수를 사용할 수 있다는 점에서 정수와 유사하게 처리됩니다.

부동소수점수로 형 변환하기 위해서는 float() 함수를 사용합니다. 이전에 본 것처럼 불리언 값은 작은 정수처럼 간주합니다. 정수에서 부동소수점수로 변환할 때는 간단하게 소수점을 붙이며, int() 함수와는 다르게 유효한 부동소수점수의 문자열(숫자, 기호, 소수점, 혹은 지수)을 부동소수점수로 변환할 수 있습니다.

 

2.7. 수학 함수

 

파이썬에는 제곱근, 코사인 등과 같은 수학 함수가 있습니다. 생각보다 많기 때문에, 아쉽지만 별도의 게시글로 분리하여 설명하도록 하겠습니다.

 

3. 문자열

 

일반적으로 프로그래머는 숫자를 다루기 때문에 수학을 잘해야 한다고 생각합니다. 사실 대부분의 프로그래머는 숫자보다 문자열과 더 많은 씨름을 합니다. 논리적이고 창조적인 생각은 수학 능력보다 더 중요합니다.

파이썬 3에서는 유니코드(Unicode) 표준에 대한 지원으로 전 세계에서 쓰이는 언어들의 많은 기호를 담을 수 있습니다 파이썬 3의 이러한 표준에 대한 지원이 파이썬 2로부터 분리된 가장 큰 이유입니다. 유니코드를 다루는 것이 가끔 까다로울 수 있기 때문에 유니코드를 다양한 환경에서 사용할 것입니다. 문자열 예제에서는 대부분 아스키(ASCII) 코드를 사용할 예정입니다.

다른 언어와 달리 파이썬에서는 문자열이 불변(Immutable)입니다. 문자열 자체는 변경할 수 없지만, 같은 효과를 얻기 위해 문자열의 일부를 다른 문자열로 복사할 수는 있습니다.

 

3.1. 인용 부호로 문자열 생성

 

단일 인용 부호 혹은 이중 인용 부호를 사용하여 문자열을 만들 수 있습니다. 대화식 인터프리터는 문자열을 단일 인용 부호로 출력합니다. 이와 같이 파이썬에서는 단일 인용 부호와 이중 인용 부호를 똑같이 처리합니다. 두 가지 종류의 인용 부호를 허용하는 이유는, 인용 부호가 포함된 문자열을 만들기 위해서입니다. 단일 인용 부호의 문자열을 이중 인용 부호에 넣거나, 이중 인용 부호의 문자열을 단일 인용 부호에 넣을 수 있습니다. 또한, 세 개의 단일 인용 부호 혹은 세 대의 이중 인용 부호를 사용할 수 있으며, 보통 여러 줄의 문자열에 사용합니다.

인터프리터는 단일 인용 부호 또는 \n과 같은 이스케이프 문자(Escape Character)가 들어 있는 문자열도 출력할 수 있습니다. 이스케이프 문자에 대해서는 잠시 후에 설명하도록 하겠습니다.

마지막으로 아무런 문자가 없는 유효한 빈 문자열이 존재합니다. 빈 문자열이 필요한 이유는, 빈 문자열을 이용하면 여러 문자열을 한 문자열로 합칠 때 문자열 사이에 공백을 입력할 수 있어서 유용합니다.

 

3.2. 데이터 타입 변환: str()

 

str() 함수를 사용하여 데이터 타입을 문자열로 변환할 수 있습니다. 문자열이 아닌 객체를 print() 함수로 호출할 때, 파이썬은 내부적으로 str() 함수를 사용합니다. 그리고 변수나 상수를 문자열 안에 삽입하면 문자열 보간(String Interpolation)을 할 때도 내부적으로 사용합니다. 이에 관한 내용은 추후 작성될 게시글에서 자세히 다루도록 하겠습니다.

 

3.3. 이스케이프 문자

 

파이썬은 문자열 안의 일부 문자의 의미를 다르게 해석하여 특정 효과를 줄 수 있습니다. 이렇게 하지 않으면 이들 효과를 문자열 안에서 표현하기 힘들 것입니다. 문자 앞에 백 슬래시 기호를 붙임으로써 특별한 의미를 줄 수 있습니다. 가장 일반적인 이스케이프 시퀀스는 줄 바꿈을 의미하는 \n입니다. 이것으로 한 줄의 문자열을 여러 줄의 문자열로 만들 수 있습니다. \t를 통해 탭 문자를 삽입할 수 있으며, \' 혹은 \"를 사용하여 단일 또는 이중 인용 부호를 표현할 수 있습니다. 백 슬래시를 입력하기 싶은 경우에는 백슬래시를 두 번 입력하면 됩니다.

 

3.4. 결합: +

 

다음과 같이 + 연산자를 사용하여 리터럴 문자열 또는 문자열 변수를 결합할 수 있습니다.

>>> "Hello " + "world!"
#'Hello world!'

또한, 문자열 변수가 아닌 리터럴 문자열을 다음과 같이 차례로 결합할 수 있습니다.

>>> "Hello " "world!"
#'Hello world!'

파이썬은 문자열을 결합할 때 공백을 자동으로 붙이지 않습니다. 그래서 위 예제처럼 명시적으로 공백을 넣었습니다. print() 함수는 각 인자 사이에 공백을 붙입니다. 그리고 마지막에는 줄 바꿈 문자를 붙입니다.

>>> print('Hello', 'world!')
#Hello world!

 

3.5. 복제하기: *

 

* 연산자를 이용하여 문자열을 복제할 수 있습니다. + 연산자를 연속하여 불러오는 것으로 생각하면 편합니다.

 

3.6. 문자 추출: []

 

문자열에서 한 문자를 얻기 위해서는 문자열 이름 뒤에 대괄호([])와 오프셋을 지정합니다. 가장 왼쪽의 오프셋은 0이고, 그다음은 1, 2,... 이런 식으로 진행됩니다. 가장 오른쪽의 오프셋은 -1입니다. 그래서 문자열의 수를 셀 필요가 없습니다. 마찬가지로 그다음의 오프셋은 -2, -3,... 이런 식으로 진행됩니다.

오프셋을 문자열의 길이 혹은 이상(오프셋은 0에서 문자열 길이 -1까지입니다.)으로 지정하는 경우에는 예외를 출력하게 됩니다. 인덱싱(Indexing)은 추후 작성될 게시글에서 다루게 될 다른 시퀀스 타입(리스트와 튜플)과 동일하게 작동합니다.

문자열은 불변하기 때문에 특정 인덱스에 문자를 삽입하거나 변경할 수 없습니다. TypeError를 발생시키는데, 대신 replace() 함수나 잠시 후에 배우게 될 슬라이스(Slice)와 같은 문자열 함수를 사용할 수 있습니다.

 

3.7. 슬라이스: [start : end : step]

 

슬라이스(Slice)를 사용하여 한 문자열에서 문자열의 일부(Substring)를 추출할 수 있습니다. 대괄호를 사용하여 시작(start) 오프셋, 끝(end) 오프셋, 그리고 옵션으로 스텝(step)을 명시하여 슬라이스를 정의합니다. 이들 중 일부는 생략할 수 있습니다. 슬라이스는 오프셋의 start와 end - 1 사이의 문자를 포함합니다.

  • [ : ] 처음부터 끝까지 전체 시퀀스를 추출한다.

  • [start : ] start 오프셋부터 끝까지 시퀀스를 추출한다.

  • [ : end] 처음부터 (end - 1) 오프셋까지 시퀀스를 추출한다.

  • [start : end] start 오프셋부터 (end - 1) 오프셋까지 시퀀스를 추출한다.

  • [start : end : step] step 만큼 문자를 건너뛰면서, start 오프셋부터 (end - 1) 오프셋까지 시퀀스를 추출한다.

이전에 본 것처럼 시작 지점에서 오른쪽으로 가는 오프셋은 0, 1, 2,...이고, 끝에서 왼쪽으로 가는 오프셋은 -1, -2, -3,...이다. 만약 시작 오프셋을 명시하지 않았다면 슬라이스는 0을 사용하고, 끝 오프셋을 명시하지 않으면 마지막 문자를 사용한다.

스텝(step)을 음수로 지정하게 된다면, 백스텝을 하며 뒤로 건너뛰게 된다. 슬라이스는 단일 인덱스 조회라기보다는 까다로운 오프셋 조건을 광범위하게 조회하는 것에 더 가깝습니다. 첫 번째 문자열 이전의 슬라이스 오프셋은 0으로 간주하고, 마지막 다음 오프셋은 -1로 간주합니다.

 

3.8. 문자열 길이: len()

 

지금까지는 문자열을 조작하기 위해 +와 같은 특수 기호를 사용했습니다. 그러나 이들 기능은 앞에서 예로 든 정도로 매우 제한적입니다. 이제부터 파이썬의 내장 함수(특정 작업을 수행하는 코드에 이름을 붙인 것)들 중 일부를 사용하도록 하겠습니다.

len() 함수는 문자열의 길이를 측정합니다. 다른 시퀀스 타입에서 len()을 사용할 수 있으며, 따로 게시글로 작성하겠습니다.

>>> letters = 'Hello world!'
>>> len(letters)
#12
>>> empty = ""
>>> len(empty)
#0

 

3.9. 문자열 나누기: split()

 

len() 과는 달리 문자열에 특정한 함수도 있습니다. 문자열 함수는 string.function(arguments) 형태로 입력하여 사용합니다. 즉, 문자열(String) 이름을 입력하고 .을 입력한 후 함수(Function) 이름을 입력합니다. 그리고 함수에 필요한 인자(Arguments)도 입력합니다. 함수에 대해서는 추후 작성될 게시글에서 상세히 설명하도록 하겠습니다.

어떤 구분자를 기준으로 하나의 문자열을 작은 문자열들의 리스트로 나누기 위해서는 문자열 내장 함수 split()을 사용합니다 리스트(List)는 추후 작성될 게시글에서 상세히 다루도록 하겠습니다. 리스트는 다음과 같이 콤마(,)로 구분하고, 양쪽을 대괄호([])로 둘러싼 값들의 시퀀스입니다.

>>> ex = 'Me, Mom, Dad, Sister'
>>> ex.split(',')
#['Me', ' Mom', ' Dad', ' Sister']

위의 예제에서 ex_list 문자열과 단일 구분자의 인자로 ', '와 함께 split() 함수를 사용했습니다. 만약 구분자를 지정하지 않으면 split()는 문자열에 등장하는 공백 문자(줄 바꿈, 스페이스, 탭)를 사용합니다.

>>> ex = 'Me, Mom, Dad, Sister'
>>> ex.split()
#['Me,', 'Mom,', 'Dad,', 'Sister']

아무런 인자 없이 split 함수를 호출할 때도 괄호()가 필요합니다. 파이썬은 이런 방식으로 함수 호출을 구분합니다.

 

3.10. 문자열로 결합하기: join()

 

join() 함수는 split() 함수와 반대의 역할을 수행합니다. join() 함수는 문자열 리스트(List)를 하나의 문자열로 결합합니다. 먼저 결합할 문자열을 지정한 다음에 문자열 리스트를 결합합니다. 마치 split() 함수를 역행하는 것처럼 보입니다. join 함수는 문자열 리스트를 string.join(list) 형태로 결합합니다. 그러므로 lines 리스트를 각각 줄 바꿈 하여 하나의 문자열로 결합하기 위해서는 '\n'. join(lines)를 입력합니다. 다음 코드는 리스트를 콤마와 스페이스로 구분하여 하나의 문자열로 결합합니다.

>>> ex_list = ['Hello', 'World', 'Welcome to my blog']
>>> ex_string = ', '.join(ex_list)
>>> print('gogo: ', ex_string)
#gogo:  Hello, World, Welcome to my blog

 

3.11. 문자열 다루기

 

파이썬에는 많은 문자열 함수가 있습니다. 일반적인 문자열 함수를 사용하여 어떻게 동작하는지 살펴보겠습니다. 테스트 대상은 윤동주 시인의 '서시'를 포함하는 다음 문자열입니다.

>>> poem = '''죽는 날까지 하늘을 우르러
한점 부끄럼이 없기를、
잎새에 이는 바람에도
나는 괴로워했다。
별을 노래하는 마음으로
모든 죽어가는것을 사랑해야지
그리고 나안테 주어진 길을
거러가야겠다。

오늘밤에도 별이 바람에 스치운다。'''

먼저 처음 14자를 출력해 보겠습니다. (오프셋 0에서 13까지를 의미합니다.)

>>> poem[:14]
#'죽는 날까지 하늘을 우르러'

공백과 개행을 포함하여 이 시의 글자 수는 다음과 같이 구할 수 있습니다.

>>> len(poem)
#121

이 시는 '죽는'이라는 단어로 시작할까요?

>>> poem.startswith('죽는')
#True

'스치운다'라는 단어로 끝날까요?

>>> poem.endswith('스치운다。')
#True

이 시에서 '이'가 첫 번째로 나오는 오프셋은 어디일까요?

>>> poem.find('이')
#21

이 시에서 '이'가 나오는 마지막 오프셋은 어디일까요?

>>> poem.rfind('이')
#110

이 시는 글자와 숫자로만 이루어져 있을까요?

>>> poem.isalnum()
#False

아! 고리점도 들어가 있었군요.

 

3.12. 대소문자와 배치

 

이번 절에서는 문자열 내장 함수를 좀 더 사용해 보겠습니다. 테스트 문자열은 다음과 같습니다.

>>> text = 'the quick brown fox jumps over the lazy dog...'

양끝에서 . 시퀀스를 삭제해 보겠습니다.

>>> text.strip('.')
#'the quick brown fox jumps over the lazy dog'

문자의 시작은 대문자로 해야겠죠?

>>> text.capitalize()
#'The quick brown fox jumps over the lazy dog...'

모든 단어의 첫 글자를 대문자로 바꿔보겠습니다.

>>> text.title()
#'The Quick Brown Fox Jumps Over The Lazy Dog...'

글자 모두를 대문자로 만들어봅시다.

>>> text.upper()
#'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG...'

다시 소문자로 만들어버립시다.

>>> text.lower()
#'the quick brown fox jumps over the lazy dog...'

대소문자를 바꿔볼까요?

>>> text = 'aAbBcCdD'
>>> text.swapcase()
#'AaBbCcDd'

지금부터는 문자열을 정렬(Alignment)하는 함수를 다뤄보겠습니다. 문자열을 지정한 공간(여기서는 30)에서 정렬해 보겠습니다.

문자열을 지정한 공간에서 중앙에 배치해봅시다.

>>> text.center(30)
#'           aAbBcCdD           '

왼쪽과 오른쪽으로도 배치할 수 있습니다.

>>> text.ljust(30)
#'aAbBcCdD                      '
>>> text.rjust(30)
#'                      aAbBcCdD'

% 와 format()을 포함한 문자열 포매팅과 변환에 대해서는 추후 작성할 게시글에서 상세히 다루겠습니다.

 

3.13. 대체하기: replace()

 

문자열의 일부를 대체하기 위해서는 replace()를 사용합니다. 인자로 바꿀 문자열, 대체할 새 문자열, 바꿀 문자열에 대한 횟수를 입력합니다. 마지막 인자를 생략하면 첫 번째 인스턴스만 바꿉니다. 다음 예제는 지정한 문자열과 일치하는 문자열을 찾아서 새로운 문자열로 대체하는 코드입니다.

>>> text = 'the quick brown fox jumps over the lazy dog...'
>>> text.replace('fox', 'cat')
#'the quick brown cat jumps over the lazy dog...'

대체하고 싶은 정확한 문자열을 안다면, replace() 함수가 적합합니다. 그러나 주의해야 할 사항이 있는데, 의도치 않은 문자가 바뀔 수 있으므로, 각 인자들을 정확히 명시해야 합니다. 대체하고 싶은 문자열이 전체 단어인지, 한 단어의 시작의 일부인지 등 특수한 조건이 있다면, 추후 작성될 게시글에서 다루게 될 정규표현식을 사용하면 됩니다.

 

3.14. 문자열 함수

 

이 게시글에서 본 문자열 함수보다 더 많은 문자열 함수가 존재합니다. 그중 일부는 추후 작성될 다른 게시글에서 보게 될 것입니다. 문자열 함수에 관한 자세한 사항은 표준 문서 웹사이트를 참고하면 도움이 될 것 같습니다.