PYTHON. 


02. 파이썬의 프로그래밍의 기초, 자료형. 


02-2 문자열 자료형(2)


* 문자열 인덱싱과 슬라이싱

인덱싱(Indexing)이란 무엇인가를 "가리킨다"는 의미이고, 슬라이싱(Slicing)은 무엇인가를 "잘라낸다"는 의미이다. 

* 문자열 인덱싱 활용하기

인덱싱 예를 몇 가지 더 보도록 하자.a

>>> a = "Life is too short, You need Python" >>> a[0] == a[-0] 'L' >>> a[12] 's' >>> a[-1] // 문자열을 뒤에서부터 읽기 위해서 마이너스(-) 기호를 붙이는 것이다. 'n'

>>> a[-2] 'o' >>> a[-5] 'y'

* 문자열 슬라이싱이란?

>>> a = "Life is too short, You need Python" >>> a[0:4] // 끝 번호에 해당하는 것은 포함되지 않는다. 'Life'

>>> a[19:] // 끝 번호를 생략하면 시작 번호부터 그 문자열의 끝까지 뽑아낸다. 'You need Python'

>>> a[:17] // 시작 번호를 생략하면 문자열의 처음부터 끝 번호까지 뽑아낸다. 'Life is too short'

>>> a[:] // 시작 번호와 끝 번호를 생략하면 문자열의 처음부터 끝까지를 뽑아낸다. 'Life is too short, You need Python'

>>> a[19:-7] // 슬라이싱에서도 인덱싱과 마찬가지로 마이너스(-) 기호를 사용할 수 있다. 'You need'


* 슬라이싱으로 문자열 나누기

>>> a = "20010331Rainy" >>> year = a[:4] >>> day = a[4:8] >>> weather = a[8:] >>> year '2001' >>> day '0331' >>> weather 'Rainy'


["Pithon"이라는 문자열을 "Python"으로 바꾸려면?]

>>> a = "Pithon" >>> a[1] 'i' >>> a[1] = 'y'


에러가 발생한다. 왜냐하면 문자열의 요소값은 바꿀 수 있는 값이 아니기 때문이다

(문자열, 튜플 등 의 자료형은 그 요소값을 변경할 수 없다. 그래서 immutable한 자료형이라고도 부른다). 


>>> a = "Pithon" >>> a[:1] 'P' >>> a[2:] 'thon' >>> a[:1] + 'y' + a[2:] 'Python'


* 문자열 포맷팅(Formatting)


* 문자열 포맷팅 따라 하기


1) 숫자 바로 대입

>>> "I eat %d apples." % 3 // %d는 문자열 포맷 코드라고 부른다. 'I eat 3 apples.'


2) 문자열 바로 대입

>>> "I eat %s apples." % "five" 'I eat five apples.'


3) 숫자 값을 나타내는 변수로 대입

>>> number = 3 >>> "I eat %d apples." % number 'I eat 3 apples.'


4) 2개 이상의 값 넣기

>>> number = 10 >>> day = "three" >>> "I ate %d apples. so I was sick for %s days." % (number, day) 'I ate 10 apples. so I was sick for three days.'


* 문자열 포맷 코드

코드설명
%s문자열 (String)
%c문자 1개(character)
%d정수 (Integer)
%f부동소수 (floating-point)
%o8진수
%x16진수
%%Literal % (문자 % 자체)



>>> "I have %s apples" % 3 'I have 3 apples' >>> "rate is %s" % 3.234 'rate is 3.234'


%s 포맷코드는 어떤 형태의 값이든 변환해 넣을 수 있다.

3을 문자열 안에 삽입하려면 %d를 사용하고, 3.234를 삽입하려면 %f를 사용해야 한다. 

하지만 %s를 사용하면 이런 것을 생각하지 않아도 된다. 

왜냐하면 %s는 자동으로 % 뒤에 있는 값을 문자열로 바꾸기 때문이다


[포매팅 연산자 %d와 %를 같이 쓸 때는 %%를 쓴다]

>>> "Error is %d%." % 98 // 오류가 발생한다.


Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: incomplete format


* 포맷 코드와 숫자 함께 사용하기


[포매팅 연산자 %d와 %를 같이 쓸 때는 %%를 쓴다]

>>> "Error is %d%." % 98

위 예문의 결과값으로 당연히 "Error is 98%."가 출력될 것이라고 예상하겠지만 파이썬은 값이 올바르지 않다는 값 오류(Value Error) 메시지를 보여 준다.

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: incomplete format

이유는 문자열 포맷 코드인 %d와 %가 같은 문자열 내에 존재하는 경우, %를 나타내려면 반드시 %%로 써야 하는 법칙이 있기 때문이다. 이 점은 꼭 기억해 두어야 한다. 하지만 문자열 내에 %d 같은 포매팅 연산자가 없으면 %는 홀로 쓰여도 상관이 없다.

따라서 위 예를 제대로 실행하려면 다음과 같이 해야 한다.

>>> "Error is %d%%." % 98
'Error is 98%.'

포맷 코드와 숫자 함께 사용하기

1) 정렬과 공백

>>> "%10s" % "hi" // "%10s"는 왼쪽에 공백으로 10칸(오른쪽 정렬) ' hi'


>>> "%-10sjane." % 'hi' // "%-10s"는 오른쪽에 공백으로 10칸 (왼쪽 정렬) 'hi jane.'


2) 소수점 표현하기

>>> "%0.4f" % 3.42134234 // 소수점 네 번째 자리까지만 나타내고 싶은 경우, '.'의 의미는 소수점 포인트를 말하고 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수 '3.4213'

>>> "%10.4f" % 3.42134234 // 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬하는 예 ' 3.4213'


* 문자열 관련 함수들


- 문자 개수 세기(count)


>>> a = "hobby" >>> a.count('b') 2
// 문자열 중 문자 b의 개수를 반환한다.

- 위치 알려주기1(find)

>>> a = "Python is best choice" >>> a.find('b') 10 >>> a.find('k') -1

// 문자 b가 처음으로 나온 위치를 반환한다.

// 만약 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다.

- 위치 알려주기2(index)

>>> a = "Life is too short" >>> a.index('t') 8 >>> a.index('k') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found
// 문자열 중 문자 t가 맨 처음으로 나온 위치를 반환한다. 
// 만약 찾는 문자나 문자열이 존재하지 않는다면 오류를 발생시킨다. 
// 앞의 find 함수와 다른 점은 문자열 안에 존재하지 않는 문자를 찾으면 오류가 발생한다는 점이다.

- 문자열 삽입(join)

>>> a= "," >>> a.join('abcd') 'a,b,c,d'
// abcd라는 문자열의 각각의 문자 사이에 변수 a의 값인 ','를 삽입한다.

- 소문자를 대문자로 바꾸기(upper)

>>> a = "hi" >>> a.upper() 'HI'

// upper() 함수는 소문자를 대문자로 바꾸어 준다. 

// 만약 문자열이 이미 대문자라면 아무런 변화도 일어나지 않을 것이다.


- 대문자를 소문자로 바꾸기(lower)


>>> a = "HI" >>> a.lower() 'hi'

// lower() 함수는 대문자를 소문자로 바꾸어 준다.


- 왼쪽 공백 지우기(lstrip)

>>> a = " hi " >>> a.lstrip() 'hi '


// 문자열 중 가장 왼쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다. lstrip에서 l은 left를 의미한다.


- 오른쪽 공백 지우기(rstrip)


>>> a= " hi " >>> a.rstrip() ' hi'
// 문자열 중 가장 오른쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다. rstrip에서 r은 right를 의미한다.

- 양쪽 공백 지우기(strip)

>>> a = " hi " >>> a.strip() 'hi'

// 자열 양쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다.


- 문자열 바꾸기(replace)


>>> a = "Life is too short" >>> a.replace("Life", "Your leg") 'Your leg is too short'

// replace(바뀌게 될 문자열, 바꿀 문자열)처럼 사용해서 문자열 내의 특정한 값을 다른 값으로 치환해 준다.


- 문자열 나누기(split)


>>> a = "Life is too short" >>> a.split() ['Life', 'is', 'too', 'short'] >>> a = "a:b:c:d" >>> a.split(':') ['a', 'b', 'c', 'd']
// a.split()처럼 괄호 안에 아무런 값도 넣어 주지 않으면 공백(스페이스, 탭, 엔터등)을 기준으로 문자열을 나누어 준다. 
// 만약 a.split(':')처럼 괄호 안에 특정한 값이 있을 경우에는 괄호 안의 값을 구분자로 해서 문자열을 나누어 준다. 
// 이렇게 나눈 값은 리스트에 하나씩 들어가게 된다. 
// (['Life', 'is', 'too', 'short']나 ['a', 'b', 'c', 'd']는 리스트)

[고급 문자열 포매팅]

문자열의 format 함수를 이용하면 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있다. 앞에서 살펴본 문자열 포매팅 예제들을 format 함수를 이용해서 바꾸면 다음과 같다.

- 숫자 바로 대입하기

>>> "I eat {0} apples".format(3)
'I eat 3 apples'

"I eat {0} apples" 문자열 중 {0} 부분이 숫자 3으로 바뀌었다.

- 문자열 바로 대입하기

>>> "I eat {0} apples".format("five")
'I eat five apples'

문자열의 {0} 항목이 five라는 문자열로 바뀌었다.

- 숫자 값을 가진 변수로 대입하기

>>> number = 3
>>> "I eat {0} apples".format(number)
'I eat 3 apples'

문자열의 {0} 항목이 number 변수의 값인 3으로 바뀌었다.

- 2개 이상의 값 넣기

>>> number = 10
>>> day = "three"
>>> "I ate {0} apples. so I was sick for {1} days.".format(number, day)
'I ate 10 apples. so I was sick for three days.'

2개 이상의 값을 넣을 경우 문자열의 {0}, {1}과 같은 인덱스 항목들이 format 함수의 입력값들로 순서에 맞게 바뀐다. 즉, 위 예에서 {0}은 format 함수의 첫 번째 입력값인 number로 바뀌고 {1}은 format 함수의 두 번째 입력값인 day로 바뀐다.

- 이름으로 넣기

>>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
'I ate 10 apples. so I was sick for 3 days.'

위 예에서 볼 수 있듯이 {0}, {1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 이용하는 방법도 있다. {name} 형태를 이용할 경우 format 함수의 입력값에는 반드시 name=value와 같은 형태의 입력값이 있어야만 한다. 위 예는 문자열의 {number}, {day}가 format 함수의 입력값인 number=10, day=3 값으로 각각 바뀌는 것을 보여 주고 있다.

- 인덱스와 이름을 혼용해서 넣기

>>> "I ate {0} apples. so I was sick for {day} days.".format(10, day=3)
'I ate 10 apples. so I was sick for 3 days.'

위와 같이 인덱스 항목과 name=value 형태를 혼용하는 것도 가능하다.

- 왼쪽 정렬

>>> "{0:<10}".format("hi")
'hi        '

:<10 표현식을 이용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있다.

- 오른쪽 정렬

>>> "{0:>10}".format("hi")
'        hi'

오른쪽 정렬은 :< 대신 :>을 이용하면 된다. 화살표 방향을 생각하면 어느 쪽으로 정렬이 되는지 금방 알 수 있을 것이다.

- 가운데 정렬

>>> "{0:^10}".format("hi")
'    hi    '

:^ 기호를 이용하면 가운데 정렬도 가능하다.

- 공백 채우기

>>> "{0:=^10}".format("hi")
'====hi===='
>>> "{0:!<10}".format("hi")
'hi!!!!!!!!'

정렬 시 공백 문자 대신에 지정한 문자 값으로 채워 넣는 것도 가능하다. 채워 넣을 문자 값은 정렬 문자인 <, >, ^ 바로 앞에 넣어야 한다. 위 예에서 첫 번째 예제는 가운데(^)로 정렬하고 빈 공간을 =문자로 채웠고, 두번째 예제는 왼쪽(<)으로 정렬하고 빈 공간을 !문자로 채웠다.

- 소수점 표현하기

>>> y = 3.42134234
>>> "{0:0.4f}".format(y)
'3.4213'

위 예는 format 함수를 이용해 소수점을 4자리까지만 표현하는 방법을 보여 준다. 이전에 살펴보았던 표현식 0.4f가 그대로 이용된 걸 알 수 있다.

>>> "{0:10.4f}".format(y)
'    3.4213'

위와 같이 자릿수를 10으로 맞출 수도 있다. 역시 58쪽에서 살펴보았던 "10.4f"의 표현식이 그대로 이용된걸 알 수 있다.

-{ 또는 } 문자 표현하기

>>> "{{ and }}".format()
'{ and }'

format 함수를 이용해 문자열 포매팅을 할 경우 {나 }와 같은 중괄호(brace) 문자를 포매팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는 위 예의 {{와 }}처럼 2개를 연속해서 사용하면 된다.



Posted by 너래쟁이
: