[[TableOfContents]] = 1. 튜플 = == 1. 튜플의 연산 == - 튜플은 리스트와 같은 시퀀스 형이므로 시퀀스 형이 갖는 일반적인 연산을 모두 갖는다 (인덱싱, 슬라이싱, 연결, 반복, 길이 연산 등) - 튜플은 ()로 표현된다. - 튜플과 리스트의 차이점은 튜플은 변경 불가능형이라는 것과, 리스트가 갖고 있는 것과 같은 메쏘드(자체 함수)를 갖지 않는다는 것이다. {{{~cpp t = () # 공 튜플 t = (1,2,3) t = 1,2,3 # 괄호가 없어도 튜플이됨 r = (1,) r = 1, # r=1로 해석되지 않기 위함 t[0]=100 # 허용 안됨. 에러 발생 * 튜플을 이용하여 좌우변에 복수개의 자료를 치환할 수 있다. >>> x,y,z=1,2,3 * 이를 이용하여 두 변수의 값을 쉽게 치환할 수 있다. >>> x = 1 >>> y = 2 >>> x, y = y, x >>> x, y (2,1) }}} == 패킹과 언패킹 == 튜플 패킹 - 한 튜플 안에 여러 개의 데이터를 넣는 것을 튜플 패킹이라고 한다. {{{~cpp t = 1,2,'hello' }}} 튜플 언패킹 - 반대로, 튜플에서 데이터를 꺼내오는 것을 튜플 언패킹이라고 한다. {{{~cpp x,y,z = t }}} * 리스트와 튜플은 상호 변환이 가능하다. {{{~cpp >>> T = (1,2,3,4,5) >>> L = list(T) >>> L[0] = 100 >>> L [100, 2, 3, 4, 5] >>> T = tuple(L) >>> T (100, 2, 3, 4, 5) }}} == 튜플을 사용하는 경우 == 1. 함수에 있어서 하나 이상의 값을 리턴하는 경우 {{{~cpp >>> def calc(a,b): return a+b, a*b >>> x, y = calc(5, 4) }}} 2. 문자열 포매팅 {{{~cpp >>> print 'id : %s, name : %s' % ('gslee','GangSeong') id : gslee, name : GangSeong }}} 3. apply 함수를 사용할 때 {{{~cpp >>> apply(calc, (4,5)) (9,20) }}} 4. 그 이외에 고정된 값을 표현하기 위하여 튜플을 사용한다. {{{~cpp >>> d = {'one':1, 'two':2} >>> d.items() [('one',1), ('two',2)] }}} = 2. 사전 = - 사전은 임의의 객체의 집합적 자료형인데, 자료의 순서를 갖지 않는다. - 집합적이라는 의미에서 리스트나 튜플과 동일하나, 자료의 순서를 정할 수 없는 매핑(mapping)형이다. - 매핑형에서는 키(key)를 이용해 값(value)에 접근하다. {{{~cpp >>> dic = {} # dic이라는 이름으로 비어있는 사전을 만든다. >>> dic['dictionary'] = '1. A reference book containing an alphabetical list of words, ...' >>> dic['python'] = 'Any of various nonvenomous snakes of the family Pythonidae, ...' >>> dic['dictionary'] # dic아, ‘dictionary’가 뭐니? '1. A reference book containing an alphabetical list of words, ...' }}} {{{~cpp >>> member = {'basketball' :5, 'soccer':11, 'baseball':9} >>> member['baseball'] # 검색 9 >>> member['volleyball'] = 7 # 항목 추가 >>> member {'soccer' : 11, 'volleyball' : 7 'baseball' : 9 , 'basketball' : 5} >>> len(member) 4 >>> del member['basketball'] # 항목 삭제 }}} * 사전의 순서는 입력값의 종류에 따라서 언제든지 바뀔 수 있다. 이런 구조를 사용하는 이유는 키에 의한 검색속도를 빨리하기 위함이다. < 해쉬 (hash) 용법 > * 값은 임의의 객체가 될 수 있지만, 키는 변경 불가능(immutable) 자료형이어야 한다. 따라서 문자열, 숫자, 튜플은 키가 될 수 있지만, 리스트, 사전은 키가 될 수 없다. 함수를 키나 값으로 활용할 수도 있다. {{{~cpp >>> def add(a,b): return a+b >>> def sub(a,b): return a-b >>> action = {0:add, 1:sub} >>> action[0](4,5) 9 >>> action[1](4,5) -1 }}} == 사전 객체의 메소드 == 1. D.keys() : 사전에서 키들을 리스트로 리턴 2. D.values() : 값들을 리스트로 리턴 3. D.items() : (key, value) 리스트로 리턴 4. D.has_key(key) : 멤버십 테스트. D가 key를 가지고 있는가 검사. 있으면 참(1), 없으면 거짓(0)을 리턴. key in D 와 같다. 5. D.clear() : 사전 D의 모든 아이템 삭제 6. D.copy() : 사전 복사 {{{~cpp >>> a = d # 사전 레퍼런스 복사. (사전 객체는 공유된다) >>> a = d.copy() # 사전 복사. (별도의 사전 객체가 마련된다.) >>> phone = {'jack': 232412, 'jim':1111, 'Joseph' : 234632} >>> p = phone >>> phone['jack'] = 1234 >>> phone {'jack': 1234, 'jim':1111, 'Joseph' : 234632} >>> p {'jack': 1234, 'jim':1111, 'Joseph' : 234632} >>> ph = phone.copy() >>> phone['babo'] = 5324 >>> phone {'jack': 1234, 'jim':1111, 'Joseph' : 234632, 'babo' : 5324} >>> ph {'jack': 1234, 'jim':1111, 'Joseph' : 234632} }}} 7. D.get(key , x) : 값이 존재하면 D[key] 즉 값을 리턴, 아니면 x를 리턴 8. D.setdefalut(key , x) : get 과 같으나 값이 존재하지 않을 때 값을 설정 (D[key] = x) 9. D.update(b) : for k in b.keys(): D[k]=b[k] 즉, 사전 b의 아이템들을 D에 추가시킨다. 10. D.popitem() : (키, 값) 튜플을 리턴하고 사전에서 항목을 제거한다. == 사전을 for문으로 참조하기 == {{{~cpp >>> D = {'a':1, 'b':2 ,'c':3} >>> for key in D.keys(): print key, D[key] b 2 c 3 a 1 }}} * 정렬하기 {{{~cpp >>> items = D.items() >>> items.sort() >>> items [('a', 1), ('b', 2) , ('c', 3)] >>> for k,v in items: print k, v a 1 b 2 c 3 }}} * 2.2 이상에서 가능 {{{~cpp >>> D = {'a':1, 'b':2, 'c':3} >>> for key in D: print key, D[key] a 1 c 3 b 2 }}} == 심볼 테이블 == globals()를 사용하면 전역 영역(모듈 영역)의 심볼 테이블(사전)을 얻는다. ---- [2학기파이선스터디]