딕셔너리(dictionary)는 키(key)와 그것에 딸린 값(value)의 쌍들의 집합으로 이루어진 자료형이다. 어떤 사람과 관련된 데이터의 예를 들면 ‘name’은 ‘박장현’ , ‘age’가 ‘44’, 등이 있을 것이다. 여기서 ‘name’, ‘age’ 등이 키가 되고 ‘박장현’은 ‘name’이라는 키에 해당되는 값, ‘44’는 ‘age’라는 키에 해당되는 값이다. 이를 파이썬 문법으로 표현하면 다음과 같다.


>>> man1 = {‘name’:’박장현’, ‘age’:44 }


이렇게 입력하면 man1 이라는 딕셔너리가 생성된다. 딕셔너리는 {...}기호로 생성된다. 이와 같이 딕셔너리는 ‘키:값’ 쌍들의 집합이다. 키와 값은 콜론(:)으로 각 쌍은 콤마(,)로 구분한다.


{ key1:val1, key2:val2, …… }


키로 쓸 수 있는 객체는 숫자와 문자열 등 immutable한 객체라면 무엇이든지 사용할 수 있다. 값에 해당하는 것은 어떤 파이썬 객체라도 올 수 있다.


만약 앞의 예에서 man1의 이름에 해당하는 값객체를 얻고 싶다면 다음과 같이 접근할 수 있다.


>>> man1[‘name’]


이것은 man1 딕셔너리의 ‘name’ 키에 해당하는 값객체를 반환한다.


>>> capital = {‘kr’:’seoul’, ‘jp’:’tokyo’, ‘cn’:’beijing’}


이 예에서도 키가 문자열이고 값도 문자열이다. 딕셔너리는 데이터의 저장 ‘순서’라는 개념이 없다. 따라서 내부적인 인덱스는 없으며 오직 ‘키’로만 연결된 ‘값’에 접근할 수 있을 뿐이다.


>>> color = {0:’red’, 1:’yellow’, 2:’white’, 3:’black’}


위의 예도 딕셔너리이지만 이것은 키로 정수를 갖는다. 따라서


>>> color[1] # ‘yellow’ 값을 읽는다.
>>> x = color[0] # x에 문자열 ‘red’가 저장된다.
>>> color[3] = ‘grey’ # 키 3 에 해당하는 값을 변경한다.
>>> color[4] = ‘blue’ #새로운 키-값 쌍을 추가한다.


전술한 바와 같이 딕셔너리는 인덱스가 없다. 이 예제에서 color[1] 과 같은 용례는 인덱싱이 아니라 1이라는 키를 지정해 준 것이므로 혼동하면 안된다. 딕셔너리는 인덱싱도 할 수 없고 슬라이싱도 당연히 허용되지 않는다. 따라서 color[0:2] 같은 사용은 에러를 발생시킨다.


 또 한 가지 주의할 것은 중복된 키는 허용되지 않는다는 것이다.


>>> a={0:'a', 1:'b', 0:'c'}
>>> a
{0: 'c', 1: 'b'}


위 예에서 딕셔너리 a에 0이라는 키가 중복으로 지정되었는데 결과를 보면 하나는 무시되었다. 딕셔너리는 내부 데이터를 키값으로 구별하기 때문에 중복된 키는 허용하지 않는 것이다.


 딕셔너리의 키로 리스트는 사용 불가지만 튜플은 가능하다. 리스트는 mutable 이고 튜플은 immutable이기 때문이다.


>>> a={(1,):'hi', (1,2):'world'}
>>> a
{(1, 2): 'world', (1,): 'hi'}


값에는 어떠한 파이썬 객체도 올 수 있으며 딕셔너리 안에 값으로 딕셔너리가 다시 올 수도 있는 등 중첩도 얼마든지 가능하다.




Posted by 살레시오
,

튜플(tuple, 터플이라고도 읽는다)은 객체들의 묶음이라는 점에서 리스트와 유사하다. 정의할 때 대괄호 대신 괄호 (..)를 사용한다.


>>> t1 = () # empty tuple 생성
>>> t2 = (11,) # tuple의 요소가 하나일 경우 반드시 끝에 콤마(,)를 붙여야 한다.
>>> t3 = (11, 22)
>>> t4 = (‘abc’, 11, [22, 33])
>>> t5 = ( (11,22), (‘hi’, ‘world’))
>>> t6 = ((True, False))


위에서 빈 튜플을 생성하는 첫 번째 경우만 제외하고 모두 괄호를 생략할 수 있다.


>>> t2 = 11,
>>> t3 = 11, 22
>>> t4 = ‘abc’, 11, [22, 33]
>>> t5 = (11,22), (‘hi’, ‘world’)
>>> t6 = (True, False), # 이 경우 마지막에 콤마가 반드시 붙어야 한다.


이것을 보면 이전에도 몇 번 나왔던 여러 개의 변수를 동시에 생성시키는 경우도 튜플이 사용됨을 알 수 있다.


>>> a, b, c = 11, 22+33j, True # 좌변과 우변 모두 (괄호가 생략된) 튜플이다.


>>> t = 11,22,33 # t는 튜플임
>>> e,f,g = t # e=t[0];f=t[1];g=t[2] 와 같다.
>>> e
11
>>> f
22
>>> g
33


 리스트와의 가장 차이점은 튜플은 그 크기나 개별 요소를 전혀 변경시킬 수 없다는 점이다. 즉, 한 번 생성되고 나면 변경시킬 수 없다. (뒤에서 설명할 immutable sequence 이다.)  튜플도 인덱싱과 슬라이싱이 가능하고 immutable sequence 들의 공통적인 연산(덧셈과 곱셈)이 가능하다.



Posted by 살레시오
,

 리스트도 문자열과 동일한 인덱싱과 슬라이싱이 가능하다. 또한 변형 가능(mutable)하기 때문에 mutable sequence에서 공통으로 사용 가능한 연산(덧셈과 곱셈)을 적용할 수 있다. 이 부분은 문자열의 인덱싱/슬라이싱 포스트와 문자열의 덧셈과 곱셈를 참조하기 바란다.


 리스트의 내장 메소들(method)들은 다음 표와 같다.


[표 1] 리스트의 메소드들

리스트 함수

동작

append(x)

x를 리스트의 마지막 요소로 추가한다.

extend(list)

list의 요소로 원 리스트를 확장한다.

insert(i, x)

x를 i번째 위치로 끼워 넣는다.

remove(x)

x와 같은 첫 번째 요소를 삭제한다.

pop()

pop(i)

마지막 요소를 삭제하고 반환한다.

i번째 요소를 삭제하고 반환한다.

clear()

모든 요소를 삭제한다.

index(x)

x와 같은 첫 번째 요소의 인덱스를 반환한다.

count(x)

x와 같은 요소들의 개수를 구한다.

sort()

정렬

reverse()

역순으로 배열

copy()

얕은 복사본을 반환한다.


이 함수들의 사용 예를 들면 다음과 같다.


>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
>>> a.pop()
1234.5
>>> a
[-1, 1, 66.25, 333, 333]


append()함수와 extend()함수는 그 동작에 차이가 있다.


>>> x=list(range(5))
>>> x.append([5.6]) # x의 마지막 요소로 [5,6] 이 들어간다.
[0,1,2,3,4,[5,6]]

>>> x=list(range(5))
>>> x.extend([5.6]) # x의 오른쪽에 [5,6]의 요소를 병합시킨다.
[0,1,2,3,4, 5,6]


그리고 append() 함수와 pop()함수를 이용하면 리스트를 스택(stack)으로 운영할 수 있다.


>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]


이와 같이 리스트의 메쏘드를 이용하면 stack/queue 와 같은 고급 자료형을 쉽게 구현할 수 있다.



Posted by 살레시오
,

 리스트는 여러 개의 객체를 하나로 묶는 데이터 형이다. (엄밀히 말하면 mutable sequence 형임) 기본적으로 대괄호 [..]를 이용하여 묶고자 하는 데이터들을 콤마(,)로 구별하여 나열한다. 보통은 같은 형의 데이터를 묶어서 많이 사용하지만 리스트의 요소는 서로 다른 데이터 형일 수 있다.


>>> la = [11, 22, 33] # 리스트를 생성하여 la 에 저장한다.
>>> lb = [‘life’, ‘is’, ‘short’] # 문자열의 리스트
>>> lc = [True, ‘hi’, 33.4, 2-3j]
>>> ld = [] # empty list를 생성하여 lc에 저장


이 예제와 같이 리스트의 요소는 어떠한 자료형이라도 가능하다. 리스트 안에 리스트가 오는 것도 얼마든지 가능하다.


>>> le = [ [11,22], [33, 44, 55] ]


이것을 중첩된 리스트라고 한다.


리스트를 만드는 또 다른 방법은 list comprehension 을 이용하는 것이다. 예를 들어서 제곱 수의 리스트틀 만든다고 가정하자. 다음과 같이 for 문을 이용할 수 도 있을 것이다.


>>> squares = []
>>> for x in range(10):
...    squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


하지만 이 방법은 변수 x가 생성되고 for 문이 종료된 후에도 변수 x 가 메모리에 남아 있게 된다. 좀 더 깔끔한 방법은 다음과 같이 map()과 익명 함수를 이용하는 것이다.


>>> squares = list(map(lambda x: x**2, range(10)))


이것과 완전히 동일한 방법이 바로 다음과같은 list comprehension 이고 훨씬 더 간결하고 가독성이 높다.


>>> squares = [x**2 for x in range(10)]


일반적으로 다음과 같이 구성된다.


[ 표현식 for문 (for 문 | if 문)* ]


예를 들어서 두 리스트 요소 중 다른 것들로만 조합하는 리스트는 다음과 같다.


>>> [(x,y) for x in [1,2,3] for y in [3,1,4] if x!=y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]


이것은 다음 프로그램과 동일한 동작을 수행한다.


>>> combs = []
>>> for x in [1,2,3]:
...    for y in [3,1,4]:
...        if x != y:
...            combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]


두 가지 경우에서 for 문과 if 문의 순서가 같다는 것을 알 수 있다.

표현식이 튜플일 경우 반드시 괄호로 묶어야 한다.


>>> [(x,x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]


만약 다음과 같이 괄호를 생략하면 에러가 발생한다.


>>> [ x,x**2  for x in range(6)] # 에러 발생


여기서 소개한 내용이 리스트를 생성하는 기본적인 방법들이다.



Posted by 살레시오
,

진리값

 파이썬에서 참, 거짓은 True 와 False 라는 키워드를 사용한다. (첫 글자가 대문자라는 것에 유의해야 한다.) 진리값은 자체로 변수의 값으로 사용될 수 있으며 논리 연산의 결과를 표현하는데 사용된다. 한 가지 알아둘 것은 파이썬은 False 뿐만 아니라 None, 0 (0.0, 0j, 0.0j, 0+0j 도 마찬가지), 빈 문자열(“” 혹은 ‘’),  빈 집합 ( (), {}, [] )도 False 로 간주한다는 것이다.


비교 연산자

 파이썬에는 다음과 같은 비교연산자들이 있다.


[표 1] 파이썬의 비교 연산자들

연산자

의미

x < y

x보다 y가 크면 True

x <= y

x보다 y가 크거나 같다면 True

x > y

x보다 y가 작으면 True

x >= y

x보다 y가 작거나 같다면 True

x == y

x와 y가 같다면 True

x != y

x와 y가 다르다면 True

x is y

동일한 객체인지를 판별 (x와 y가 같은 참조인지 판별)

x is not y

is 의 부정형 (x와 y가 다른 참조인지 판별)


연산자 ‘==’와 ‘!=’은 객체의 내용(content)를 직접 비교하여 참/거짓을 판별한다. 객체의 형(type)이 다르면 두 객체는 항상 다르다. 단, 숫자형인 경우 int, float, complex 간에도 실제로 같은 숫자라면 같다. 즉, 1 (int형), 1.0 (float형), 1+0j (complex형), 1.0+0j (complex형), 1.0+0.0j (complex형) 는 모두 같은 숫자로 판별된다.


>>> sa = 'hello everybody'   
>>> sb = 'hello everybody'
>>> sa == sb
True


반면 연산자 is 는 두 객체가 동일한 참조(주소)를 가지고 있는 지를 판별하는 것이다. 만약 id(x)와 id(y)가  같다면 x is y 는 True값을 가진다.


>>> sa='hello everybody'   
>>> sb='hello everybody'
>>> sa is sb
False

>>> x=[1,2]
>>> y=[1,2]
>>> x==y
True
>>> x is y
False
>>> z=x
>>> z is x
True


논리 연산자

 논리 연산자는 조건식들끼리 묶는 역할을 한다.


[표 2] 파이썬의 논리 연산자들

연산자

기능

x and y

x와 y 둘 다 True 일 때 True 그 외는 False

x or y

x와 y 둘 다 False 일 때 False 그 외는 True

not x

x가 True 일 때 False


이와 같이 파이썬의 논리 연산자는 다른 언어들과는 달리 자연어(and, or, not)을 사용한다.



Posted by 살레시오
,

 파이썬 문자열의 멤버 함수를 정리하면 다음 표와 같다.


문자열 함수

기능

format()

변수의 내용을 표시하기 위한 포맷팅을 수행한다.

lower(), casefold()

upper()

swapcase()

title()

capitalize()

대문자를 소문자로 바꾼다.

소문자를 대문자로 바꾼다.

대문자는 소문자로, 소문자는 대문자로 바꾼다.

모든 단어의 첫 문자만 대문자로 나머지는 소문자로 바꾼다.

문자열의 첫 글자만 대문자로 나머지는 소문자로 바꾼다.

islower()

isupper()

모든 문자가 소문자이면 True 반환

모든 문자가 대문자이면 True 반환

count(str)

str이 포함된 개수를 센다.

find(str)

index(str)

str의 첫 위치를 알아낸다. (없다면 -1 반환)

str의 첫 위치를 알아낸다. (없다면 예외 발생)

join(str)

str을 구성하는 각 문자 사이에 원 문자열을 끼워 넣는다.

lsrtip()

rstrip()

strip()

center(n[,str])

ljust(n[,str]))

rjust(n[,str]))

좌측 공백을 지운다.

우측 공백을 지운다.

양쪽의 공백을 지운다.

크기 n의 문자열의 중앙에 원 문자열을 정렬한다.

크기 n의 문자열의 왼쪽에 원 문자열을 정렬한다..

크기 n의 문자열의 오른쪽에 원 문자열을 정렬한다..

(두 번째 인수가 없다면 공백 문자를, 있다면 그 문자로 채운다.)

replace(str1, str2)

원 문자열 안의 str1을 str2로 바꾼다.

split()

split(sep)

공백문자를 기준으로 나누어서 리스트에 저장한다.

sep(문자열)을 기준으로 나누어서 리스트에 저장한다.

isalnum()

isalpha()

isidentifier()

모든 문자가 알파벳 혹은 숫자(alphanumeric)이면 True 반환.

모든 문자가 알파벳(alphabet)이면 True 반환.

문자열이 식별자의 조건에 맞다면 True 반환.

isdecimal()

isdigit()

isnumeric()

십진 정수이면 True 반환.

모든 문자가 0에서 9가지의 숫자이면 True 반환.

모든 문자가 0에서 9가지의 숫자이면 True 반환.

(세 함수의 차이점이 명확하지 않음.)


위의 함수들은 모두 문자열 혹은 문자열 변수에 바로 이어서 점(.)을 찍은 다음 호출할 수 있다. 예를 들면 다음과 같다.


>>> s = "HELLO"
>>> s2 = s.lower() #문자열 s를 전부 소문자로 만들어서 s2에 저장
>>> "Hi. My name is jhp.".count('jhp') #문자열에서 문자열 ‘jhp’의 개수를 센다.


 join()함수의 경우 str1.join(str2) 라고 입력하면 str2를 구성하는 각 문자의 사이에 str1을 끼워 넣어서 새로운 문자열을 생성한다.


>>>','.join('abc')
'a,b,c'
>>>'_and_'.join('jhpark')
'j_and_h_and_p_and_a_and_r_and_k'




Posted by 살레시오
,

 파이썬에서 문자열을 포맷팅할 때 문자열 객체의 멤버 함수인 format()을 이용할 수도 있다. (이 경우 C#의 문자열 포멧팅과 유사한 방법을 사용할 수 있다.)


>>> age = 44
>>> print(“I’m {0} years old.'.format(age))
I’m 44 years old.


문자열 안의 ‘{번호}’ 가 format() 멤버함수의 인자의 내용으로 치환이 됨을 알 수 있다. 변수의 종류는 가리지 않으며 foramt()함수의 첫 번째 인자가 0번, 두 번째 인자가 1번...순으로 지정된다.


 여러 개의 변수를 출력할 수도 있다.


>>> name='Jang-Hyun Park'
>>> age=44
>>> print("My name is {0} and {1} years old.".format(name,age))
My name is Jang-Hyun Park and 44 years old.


여기에서 문자열 내부의 ‘{0}’은 name 변수로, ‘{1}’은 age변수의 내용으로 치환된다.


 실수의 소수점 아래 자리수를 제한하려면 다음과 같이 하면 된다.


>>> rn = 1.2345678
>>> print("rn is about {0:.4f}.".format(rn))
rn is about 1.2346.


 포맷팅을 하는 두 가지 방법 모두 장단점이 있으므로 상황에 따라 편한 쪽을 택해서 사용하면 된다. 예를 들어서 동일한 변수를 여러 번 출력할 때는 여기에서 소개한 방법이 더 유리하다.


>>> blah = ‘blah’
>>> print(“%s %s %s %s”%(blah, blah, blah, blah))
>>> print(“{0} {0} {0} {0}”.format(blah))


이와 같이 동일한 변수를 여러 번 출력할 경우 세 번째 줄과 같이 문자열의 format() 필드를 이용하면 두 번째 줄의 %-formatter보다 더 간략하게 사용할 수 있다.



Posted by 살레시오
,

 문자열 중간에 어떤 변수의 내용을 출력하고 싶다면 print()함수를 이용하면 된다.


>>> a=3+4j
>>> b=’hi’
>>> print('a is',a,’and b is’,b) #변수 앞뒤에 공백문자를 자동으로 넣어준다.
a is (3+4j) and b is hi


또는 변수의 내용으로 아예 치환한 문자열을 만들고 싶다면 str() 내장함수를 이용하는 방법도 있다.


>>> a=3+4j
>>> b=’hi’
>>> ‘a is ‘+str(a)+’ b is ‘+ b
a is (3+4j) and b is hi


더 간단하고 일반적인 방법은 문자열 포맷팅 기능을 이용하는 것이다.  C 언어에서 printf() 문을 이용하여 변수의 내용을 출력하는 유사한 방법을 파이썬에서도 지원한다. 이것을 문자열의  formatting이라고 하는데 예를 들어서 정수값을 출력하고 싶다면 다음과 같이 하면 된다.


>>> a=11
>>> “a equals %d.”%a


이와 같이 문자열 내부의 %d는 문자열에 바로 뒤따르는 ‘%변수’의 변수값으로 바꾸어 준다. 두 개 이상을 출력하려면 다음과 같이 괄호로 묶어주면 된다. (괄호로 묶인 자료 집합을 튜플이라고 하며 뒤에서 자세하게 설명할 것이다.)


>>> a=11
>>> b=-22
>>> "vars are %d and %d."%(a,b)
'vars are 11 and -22.'


실수를 출력하려면 %f, 문자열을 출력하려면 %s를 사용하면 된다.


[표 1] 문자열 formatter 의 종류

문자열 포맷팅

기능

%d, %x, %o

십진수, 16진수, 8진수(복소수는 출력이 안 됨)

%f

%.숫자f

실수를 출력 (복소수는 출력이 안 됨.)

표시할 소수점 아래 자리수를 명시한다.

%s

문자열 출력

%%

‘%’ 문자 자체를 출력


문자열을 출력하는 예를 들어보면 다음과 같다.


>>> ss = 'short'   
>>> print('Life is %s.'%ss)
Life is short.


아래 예와 같이 실수의 경우 표시할 소수점 아래 자리수를 지정해줄 수 있다.


>>> rn = 1.2345678  
>>> 'f is about %.4f'%rn
'f is about 1.2346'


소수점 다섯째 자리에서 반올림하여 소수점 넷째 자리까지 표시했음을 알 수 있다.


 한 가지 짚고 넘어갈 것은 %d와 %f 는 복소수는 출력하지 못한다. 복소수는 %s를 이용하여 출력하면 된다.


>>> c1=11+22.3j
>>> print('c1=%s'%c1)
c1=(11+22.3j)


재미있는 것은 %s를 이용하면 숫자나 문자열을 가리지 않고 모두 출력해준다는 것이다. 이는 숫자도 내부적으로 자동으로 문자열로 변환되기 때문이다.


>>> n=1024
>>> print('n equals %s.'%n)
n equals 1024.


따라서 숫자를 출력하든 문자를 출력하든 %s를 사용하여도 전혀 문제가 없다.



Posted by 살레시오
,

 파이썬에서는 문자열끼리 더하거나 곱할 수 있다. 문자열끼리 연결하는데  덧셈 연산자를 사용하는 것은 다른 언어에서도 흔하지만 곱셈은 독특하다.  두 개의 문자열을 더하면 문자열이 하나로 합해진 새로운 문자열이 만들어진다.


>>> “My name is “+”Salesio.”
>>> q = “ipython”
>>> r = “ is useful.”
>>> s = q+r


이 예제에서 원래의 문자열 q와 r은 더하기 연산으로 변경되지 않는다. 앞에서도 밝혔듯이 문자열은 한 번 내용이 정해지면 그 다음에는 변경할 수 없다. (이러한 자료형을 immutable 자료형이라고 한다.)  다만 연산의 결과로 새로운 문자열이 생성되는 것이다.  만약


>>>s = ’Life is long.’


에서 long이라는 단어를 short로 바꾸고 싶다면 슬라이싱을 이용해서 다음과 같이 할 수 있다.


>>> s = s[:8] + ’short.’


이 경우 원래 문자열이 바뀌는 것이 아니라 기존의 문자열은 모두 삭제되고 새로 생성된 문자열이 다시 변수 s에 저장되는 것이다. (사실 변수 s 는 문자열에 대한 참조가 저장된다. 이 경우 참조, 즉 주소가 새로 생성된 문자열의 그것으로 바뀌는 것이다.)


 유사하게 문자열에 정수를 곱하면 정수만큼 반복되는 새로운 문자열을 생성한다.


>>> “blah “*5

blah blah blah blah blah

>>> ‘=’*50

==================================================


위에서 두 번째 예는 화면에 출력할 때 간단히 구분선을 만드는 용도로 사용된다.



Posted by 살레시오
,

 파이썬3의 문자열은 내부적으로 (유니코드) 문자의 배열로 취급된다. 예를 들어보자.


>>> s=“Hello World”


문자열

H

e

l

l

o


w

o

r

l

d

인덱스 (기본 방향)

0

1

2

3

4

5

6

7

8

9

10

인덱스 (역방향)

-11




-7

-6

-5

-4

-3

-2

-1


문자열에 포함된 각각의 문자에 매겨진 이 번호를 인덱스(index)라고 한다. 이 예에서 문자열의 길이는 11이고  인덱스는 0부터 시작한다. 인덱스가 1부터 시작하지 않고 0부터 시작함에 주의해야 한다. (다른 프로그래밍 언어에서도 배열의 인덱싱은 보통 0부터 시작한다.)


>>> s[0]

H

>>> s[6]

w

>>> s[-1]

d


마지막의 s[-1]과 같이 음수는 뒤에서부터 세는 것이다. 따라서 뒤에서 첫 번째 문자인 ‘d’가 된다.


>>> s[-2]

l

>>> s[-6]


만일


>>>  a=”python is the best.”


라는 문자열에서 첫 단어를 뽑아내고 싶다면 아래와 같이 한다.


>>> b=a[0:6]


인덱스 ‘0:6’ 이 뜻하는 것은 ‘0부터 5까지’ 이다. 끝 번호 6은 포함하지 않는다는 것에 주의해야 한다. 이렇게 콜론(:)을 이용하여 연속적인 인덱스를 지정하는 것을 슬라이싱(slicing)이라고 한다. 문자열의 마지막까지 지정하려면 끝 번호를 생략하면 된다.


>>> c = a[7:] # ‘is the best.’ 가 c에 저장된다.


반대로 시작 번호가 생략되면 문자열의 처음부터 선택된다.


>>> d = a[:8] # ‘python is’ 가 d에 저장된다.


그리고 시작 번호와 끝 번호가 모두 생략된다면, 즉 e=a[:] 이라고 하면 문자열 전체가 선택이 된다. 즉, e에는 a 문자열 전체가 저장된다.


슬라이싱에서도 인덱싱과 마찬가지로 음수를 사용할 수 있다.


>>> f = a[:-5]


결과를 확인해 보기 바란다. 이 경우에도 끝 번호는 포함되지 않으므로 첫 문자부터 -6번 문자까지 뽑아져서 f에 저장된다. 슬라이싱을 정리하면 다음과 같다.


  • s[m:n] 은 s[m] 부터 s[n-1] 까지의 부분 문자열이다.


예를 들어서 만약 문자열 h를 5번째 문자를 기준으로 둘로 나눠서 hl, hr에 정하고 싶다면 다음과 같이 하면 될 것이다.


>>> hl = h[:5]
>>> hr = h[5:]


이러한 기능을 이용해서 문자열 자체를 바꿀 수는 없다는 것에 주의하자. 즉, 다음과 같이 문자열의 일부분을 바꾸는 것은 불가능한다.


>>>a[0] = ’x’ #불가능하다


이는 문자열은 한 번 내용이 정해지면 내용을 읽는 수는 있지만 변경될 수는 없는 자료형이기 때문이다. (이러한 자료형을 immutable 하다고 한다.)




Posted by 살레시오
,