108

Python Programming: Type and Object

Embed Size (px)

Citation preview

Page 1: Python Programming: Type and Object

Python Intermediate Programming

임찬식 ([email protected])

1

Page 2: Python Programming: Type and Object

Python Intermediate Programming타입과 객체

함수와 함수형 프로그래밍

클래스와 객체지향 프로그래밍

데이터 구조

튜닝과 최적화

2

Page 3: Python Programming: Type and Object

타입과 객체파이썬에서 모든 데이터는 객체라는 개념을 사용하여 저장

기본이 되는 숫자, 문자열, 리스트, 사전은 모두 객체

클래스를 사용해 사용자 정의 객체를 생성해 사용

인터프리터 내부에서 사용하는 객체도 존재

3

Page 4: Python Programming: Type and Object

용어

프로그램에서 저장하는 모든 데이터는 객체

객체는 신원(identity), 타입(혹은 클래스), 값을 가짐

>>> a = 42# 42 라는 값을 갖는 정수(타입) 객체, 신원은 객체가 메모리에 저장된 위치

특정 타입의 객체가 생성되면 해당 객체를 그 타입의 인스턴스라고 부름

인스턴스는 신원과 타입을 변경할 수 없음

인스턴스 값을 변경할 수 있는지 여부에 따라

변경 가능 (mutable)변경 불가능 (immutable)

다른 객체에 �한 참조들을 담는 객체를 컨테이너 혹은 컬렉션이라 부름

객체는 �부분 몇 개의 속성과 메서드로 특징지어짐4

Page 5: Python Programming: Type and Object

객체 신원과 타입

내장 함수인 id()는 객체의 신원을 나타내는 정수를 반환

일반적으로 id() 함수 반환값은 메모리 상에서 객체가 위치한 곳을 나타냄파이썬 구현에 따라 달라질 수 있음

>>> a = 42>>> b = "Python">>> id(a)4435590512>>> id(b)4440351720

5

Page 6: Python Programming: Type and Object

객체 신원과 타입

is 연산자를 이용해 두 객체의 신원을 비교하는 여러가지 방법

# 두 객체를 비교한다def compare(a, b): if a is b: print("a 와 b 는 동일한 객체") if a == b: print("a 와 b 는 동일한 값") if type(a) is type(b): print("a 와 b 는 동일한 타입")

>>> a = 42>>> b = 30>>> compare(a, b)a 와 b 는 동일한 타입

6

Page 7: Python Programming: Type and Object

객체 신원과 타입

객체 타입은 객체의 클래스라고 하며 그 자체도 객체로 존재

타입 객체는 고유하게 정의

주어진 타입의 모든 인스턴스에 �해서 항상 동일

타입은 is 연산자로 비교 가능

>>> item = 10>>> s = [1, 2, 3]>>> if type(s) is list:... s.append(item)...>>> s[1, 2, 3, 10]

7

Page 8: Python Programming: Type and Object

객체 신원과 타입

타입은 클래스를 통해 특수화(specialization)가 가능하기 때문에isinstance(object, type) 을 사용하여 검사하는 것이 좋음

isinstance() 함수는 클래스 상속 관계를 인식하여 타입 검사 수행

>>> item = 10>>> s = [1, 2, 3]>>> if isinstance(s, list):... s.append(item)...>>> s[1, 2, 3, 10]

8

Page 9: Python Programming: Type and Object

참조 횟수와 쓰레기 수집

모든 객체는 참조 횟수(reference count)를 유지하며, 이 값이 0이 되면쓰레기 수집(garbage collection) 단계를 거쳐 메모리를 반납

참조 횟수를 증가시키는 경우객체가 새로운 이름에 �입

리스트, 튜플, 사전 같은 컨테이너에 추가

>>> import sys>>> a = 42>>> sys.getrefcount(a)9>>> b = a>>> sys.getrefcount(a)10>>> c = [a]>>> sys.getrefcount(a)11

9

Page 10: Python Programming: Type and Object

참조 횟수와 쓰레기 수집

참조 횟수를 감소시키는 경우del 연산자 사용

참조가 유효 범위를 벗어날 경우

>>> import sys>>> a = 42>>> sys.getrefcount(a)9>>> b = a>>> sys.getrefcount(a)10>>> del b>>> sys.getrefcount(a)9

인터프리터는 숫자나 문자열 같은 변경 불가능한 객체에 의해 사용되는메모리를 절약하기 위해 이들을 여러 곳에서 최�한 공유

10

Page 11: Python Programming: Type and Object

참조 횟수와 쓰레기 수집

순환 참조가 존재할 경우에는 참조 횟수를 줄일 수가 없어 메모리를 계속 점유

>>> import sys>>> a = {}>>> b = {}>>> sys.getrefcount(b)2>>> a['b'] = b>>> sys.getrefcount(b)3>>> del a>>> sys.getrefcount(b)2>>> a = {'b': b}>>> b['a'] = a>>> del a>>> sys.getrefcount(b)3

11

Page 12: Python Programming: Type and Object

참조 횟수와 쓰레기 수집

del a 를 실행해도 b 객체 참조 횟수가 줄어들지 않아 할당된 그�로메모리를 계속 점유하게 됨

순환 참조에 의한 메모리 점유를 방지하기 위해서인터프리터는 주기적으로 접근 불가능한 객체들의 순환 참조를 감지하는순환 참조 감지기(cycle detector)를 구동해 메모리 확보

12

Page 13: Python Programming: Type and Object

참조와 복사

프로그램에서 a = b �입이 숫자, 문자열 같은 변경 불가능한 객체에 �해서수행되면 b 에 �한 복사본이 생성되는 것처럼 작동

리스트나 사전 같은 변경 가능한 객체에 �해서 �입이 이루어질 경우에는변경 불가능한 객체에 �입한 경우와는 다른 결과를 보여줌

13

Page 14: Python Programming: Type and Object

참조와 복사

>>> a = [1, 2, 3, 4]>>> b = a>>> b is aTrue>>> b[2] = 42>>> a[1, 2, 42, 4]

a 와 b 가 동일한 객체를 참조하기 때문에 두 변수 중 하나에 가해진 변화가다른 변수에서도 그�로 나타남

이러한 Ý향을 방지하려면 객체에 �한 참조가 아니라 복사본을 생성해서 사용

14

Page 15: Python Programming: Type and Object

참조와 복사

리스트나 사전 같은 컨테이너 객체에 적용되는 복사 연산에는얕은 복사와 깊은 복사 두 가지가 존재

얕은 복사: 새로운 객체를 생성하지만 그 안은 원래 있던 참조로 채워짐

깊은 복사: 새로운 객체 생성 후 안에 있는 모든 객체를 재귀적으로 복사

15

Page 16: Python Programming: Type and Object

얕은 복사

a 와 b 는 서로 다른 리스트 객체이지만, 그 안의 원소는 공유

b 의 한 원소에 가한 변화는 a 에서도 그�로 나타남

>>> a = [1, 2, [3, 4]]>>> b = list(a) # a 에 �한 얕은 복사본 생성>>> b is aFalse>>> b.append(42) # b 에 새로운 원소 추가>>> b[1, 2, [3, 4], 42]>>> a # a 에 아무런 변화 없음[1, 2, [3, 4]]>>> b[2][0] = 100 # b 안에 있는 리스트 중 첫번째 원소 변경>>> b[1, 2, [100, 4], 42]>>> a # a 도 변경됨[1, 2, [100, 4]]

16

Page 17: Python Programming: Type and Object

깊은 복사

>>> import copy>>> a = [1, 2, [3, 4]]>>> b = copy.deepcopy(a) # 깊은 복사를 거쳐 b 생성>>> b[2][0] = 42>>> b[1, 2, [42, 4]]>>> a # a 가 변경되지 않음[1, 2, [3, 4]]

17

Page 18: Python Programming: Type and Object

1급 객체

파이썬에서 모든 객체는 '1급 (first class)' 객체

식별자로 명명될 수 있는 모든 객체는 동일한 지위를 가짐

이름을 가질 수 있는 모든 객체는 데이터로서 취급 가능

>>> items = {... 'number': 42, # 일반적인 정수형 데이터... 'text': 'Hello, World!' # 문자열 데이터... }>>> items["func"] = abs # abs() 함수 추가>>> import math>>> items["math"] = math # 모듈 추가>>> items["error"] = ValueError # 예외 타입>>> nums = [1, 2, 3, 4]>>> items["append"] = nums.append # 다른 객체 메서드 추가

위 예제 코드에서 보는 것처럼 함수나 모듈, 예외 타입 등 모든 객체를데이터로서 취급하는 것이 가능

18

Page 19: Python Programming: Type and Object

1급 객체

다양한 객체를 사전에 넣고 이를 이용해 코드 실행

>>> items["func"](-42) # abs(-42) 실행42>>> items["math"].sqrt(16) # math.sqrt(16) 실행4.0>>> try:... x = int("invalid")... except items["error"] as e: # except ValueError as e:... print("Convert failed")...Convert failed>>> items["append"](42) # nums.append(42) 실행>>> nums[1, 2, 3, 4, 42]

19

Page 20: Python Programming: Type and Object

1급 객체

문자열을 타입 객체 리스트를 이용해 변환하는 방법

>>> s = "HELLO,100,3.14">>> types = [str, int, float]>>> values = s.split(",")>>>>>> fields = [ty(val) for ty, val in zip(types, values)]>>> print(fields)['HELLO', 100, 3.14]

문자열 안에 있는 필드 각각을 나타낼 수 있는 타입 리스트 먼저 생성 후(타입, 값) 쌍을 만들어 타입(값) 형태로 필드 생성

20

Page 21: Python Programming: Type and Object

데이터 표현을 위한 내장 타입

파이썬에서 �부분의 데이터를 표현하는 데 사용할 수 있는 내장 데이터 타입

없음: type(None)숫자: int, float, complex, long(Python2)순서열: str, list, tuple, unicode(Python2)매핑: dict

집합: set, frozenset

21

Page 22: Python Programming: Type and Object

데이터 표현을 위한 내장 타입

타입 범주 타입 이름 설명

없음 (None) type(None) 널 객체인 None

숫자 (Number)

int 정수

long 임의 정Â도 정수 (Python 2)

float 부동 소수점

complex 복소수

bool 불리언 (True / False)

22

Page 23: Python Programming: Type and Object

데이터 표현을 위한 내장 타입

타입 범주 타입 이름 설명

순서열(sequence)

str 문자열

unicode 유니코드 문자열 (Python 2)

list 리스트

tuple 튜플

xrange함수로 생성되는 정수 범위(python 2)

23

Page 24: Python Programming: Type and Object

데이터 표현을 위한 내장 타입

타입 범주 타입 이름 설명

매핑(mapping) dict 사전

집합(set)set 변경 가능한 집합

frozenset 변경 불가능한 집합

24

Page 25: Python Programming: Type and Object

None 타입

아무 값이 없는 객체를 나타냄

프로그램 코드에서는 None 이라고 사용

값을 반환하지 않는 함수에 의해서 반환

생략해도 되는 인수 기본 값으로 흔히 사용함수 안에서 호출자 쪽에서 값을 지정하Ü는지 여부 확인 가능

아무런 속성도 지니지 않으며 불리언 표현식에서 False 로 평가

25

Page 26: Python Programming: Type and Object

숫자 타입

불리언: True, False 두 가지 값으로 표시. 부호를 가지지 않음

정수: Python3 에서 int 형은 무제한 범위의 전체 숫자를 나타냄Python2 에서 int 형은 ‑2 ^ 31 ~ 2 ^ 31 ‑ 1 까지 표현 가능

long 형은 무제한 범위의 전체 숫자 표현 가능

부동 소수점: 64비트 배정Â도로 보통 17자리 정Â도까지 표현 가능정Â도를 정확하게 제어할 필요가 있는 경우에는 numpy 모듈 고려

복소수: 부동 소수점 수의 쌍으로 표현복소수 z 의 실수부와 허수부는 z.real 과 z.imag 로 접근

>>> z = 2 + 4j>>> z.real2.0>>> z.imag4.0

26

Page 27: Python Programming: Type and Object

순서열 타입

순서열은 음수가 아닌 정수로 색인되는 순서 있는 객체들의 모음을 표현모든 순서열은 반복 기능을 지원

문자열: 문자들의 순서열. 변경 불가능

리스트: 임의의 파이썬 객체들의 순서열. 변경 가능

튜플: 임의의 파이썬 객체들의 순서열. 변경 불가능

27

Page 28: Python Programming: Type and Object

모든 순서열에 공통적인 연산

항목 설명

s[i] 순서열의 원소 i 를 반환

s[i:j] 조각을 반환

s[i:j:stride] 확장 분할에 의한 조각을 반환

len(s) s 에 있는 원소 개수

min(s) s 의 최솟값

max(s) s 의 최댓값

all(s) s 에 있는 모든 항목이 True 인지 검사

any(s) s 에 있는 아무 항목이나 True 인지를 검사

28

Page 29: Python Programming: Type and Object

모든 순서열에 공통적인 연산

>>> s = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> s[5]6>>> s[2:6] # 조각을 반환[3, 4, 5, 6]>>> s[1:8:2] # 1에서 8까지 2씩 증가시키면 조각 반환[2, 4, 6, 8]>>> len(s)10>>> min(s)1>>> max(s)10>>> sum(s, 0) # s 항목들의 합, 두 번째 인자에 초기값 지정55>>> all(s) # s 에 있는 모든 항목이 True 인지 검사True>>> any(s) # s 에 있는 아무 항목이나 True 인지 검사True

29

Page 30: Python Programming: Type and Object

변경 가능한 순서열에 적용할 수 있는 연산

항목 설명

s[i] = v 항목 �입

s[i:j] = t 조각 �입

s[i:j:stride] 확장 분할에 의한 조각 �입

del s[i] 항목 삭제

del s[i:j] 조각 삭제

del s[i:j:stride] 확장 분할에 의한 조각 삭제

30

Page 31: Python Programming: Type and Object

변경 가능한 순서열에 적용할 수 있는 연산

>>> s = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> s[0] = 42 # 항목 �입>>> s[42, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> s[3:6] = [100, 200, 300] # 조각 �입>>> s[42, 2, 3, 100, 200, 300, 7, 8, 9, 10]>>> s[0:5:2] = [20, 40, 60] # 확장 분할 이용 조각 �입>>> s[20, 2, 40, 100, 60, 300, 7, 8, 9, 10]>>> del s[0] # 항목 삭제>>> s[2, 40, 100, 60, 300, 7, 8, 9, 10]>>> del s[0:2] # 조각 삭제>>> s[100, 60, 300, 7, 8, 9, 10]>>> del s[0:7:2] # 확장 분할 이용 조각 삭제>>> s[60, 7, 9]

31

Page 32: Python Programming: Type and Object

리스트

메서드 설명

list(s) s 를 리스트로 변환

s.append(x) s 의 끝에 새로운 원소 x 추가

s.extend(t) s 의 끝에 새로운 리스트 t 추가

s.count(x) s 에서 x 가 출현한 횟수

s.index(x [, start [, stop]]) s[i]==x 인 가장 작은 i 반환

s.insert(i, x) 색인 i 의 위치에 x 삽입

s.pop([i]) 리스트에서 원소 i 를 제거하면서 반환

s.remove(x) s 에서 x 를 찾아서 제거

s.reverse() s 의 항목들을 그 자리에서 뒤집음

s.sort([key [, reverse]]) s 의 항목들을 그 자리에서 정렬32

Page 33: Python Programming: Type and Object

리스트

내장 함수인 list(s) 는 반복 가능한 타입을 리스트로 변환

s 가 이미 리스트이면 s 의 얕은 복사본으로 새로운 리스트 생성

s.append(x) 는 리스트 끝에 새로운 원소 x 추가

s.index(x) 는 리스트에서 처음으로 나타나는 x 를 검색x 가 없을 경우에는 ValueError 예외 발생

s.remove(x) 는 리스트에서 처음으로 나타나는 x 를 제거x 가 없을 경우에는 ValueError 예외 발생

s.extend(t) 는 t 에 있는 원소를 추가해 리스트 s 확장

s.sort() 는 리스트 원소를 정렬s 에 있는 항목은 모두 동일한 타입이여야 함

key 함수를 지정해 비교를 수행할 때 사용할 값 지정 가능

reverse 플래그를 지정해 역순 정렬 가능

s.reverse() 는 s 의 항목들을 뒤집어 저장33

Page 34: Python Programming: Type and Object

리스트 메서드 실행

>>> s = list((1, 2, 3, 4)) # 튜플을 이용해 리스트 생성>>> s[1, 2, 3, 4]>>> s.append(10) # 리스트 끝에 10 추가>>> s[1, 2, 3, 4, 10]>>> s.extend([20, 30, 40]) # 다른 리스트를 추가해 확장>>> s[1, 2, 3, 4, 10, 20, 30, 40]>>> s.count(10) # s 안에 있는 10 원소 횟수1>>> s.index(10) # s 에서 10이 나타나는 위치4>>> s.insert(4, 100) # 4번째 위치에 100을 추가>>> s[1, 2, 3, 4, 100, 10, 20, 30, 40]

34

Page 35: Python Programming: Type and Object

리스트 메서드 실행

>>> s.pop() # 가장 마지막 원소 삭제40>>> s[1, 2, 3, 4, 100, 10, 20, 30]>>> s.remove(100) # 100 원소를 찾아 삭제>>> s[1, 2, 3, 4, 10, 20, 30]>>> s.reverse() # s 의 항목을 뒤집어 저장>>> s[30, 20, 10, 4, 3, 2, 1]>>> s.sort() # s 의 원소를 오름차순 정렬>>> s[1, 2, 3, 4, 10, 20, 30]

35

Page 36: Python Programming: Type and Object

key 함수를 이용한 정렬 항목 지정

>>> student_tuples = [... ('john', 'A', 15),... ('jane', 'B', 12),... ('dave', 'B', 10),... ]>>>>>> # 마지막 숫자를 정렬 항목으로 사용>>> student_tuples.sort(key=lambda x: x[2]) >>>>>> student_tuples[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

36

Page 37: Python Programming: Type and Object

key 함수를 이용한 정렬 항목 지정

key 함수 지정 패턴은 자주 사용하기 때문에 이를 위한 함수군을 제공해줌

>>> student_tuples = [... ('john', 'A', 15),... ('jane', 'B', 12),... ('dave', 'B', 10),... ]>>> from operator import itemgetter>>>>>> student_tuples.sort(key=itemgetter(2))>>> student_tuples[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]>>>>>> student_tuples.sort(key=itemgetter(1, 2))>>> student_tuples[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

37

Page 38: Python Programming: Type and Object

key 함수를 이용한 정렬 항목 지정

itemgetter(2) 함수를 이용해 세 번째 항목을 정렬 �상으로 지정 가능

>>> student_tuples.sort(key=itemgetter(2))

itemgetter(1, 2) 함수를 이용해 두 번째 항목으로 우선 정렬하고, 같은 경우에세 번째 항목을 이용해 정렬하도록 지정 가능

>>> student_tuples.sort(key=itemgetter(1, 2))

38

Page 39: Python Programming: Type and Object

문자열

파이썬 2에는 두 종류의 문자열 객체 타입이 존재

바이트 문자열8비트 데이터를 담는 바이트들의 순서열

이진 데이터와 널 바이트 저장

유니코드 문자열인코딩되지 않은 유니코드 문자들의 순서열

각 유니코드 문자는 내부적으로 16비트 정수로 표현

16비트 정수는 65,536 개의 고유한 문자 값 표현 가능

유니코드 문자열을 32비트 정수로 저장하는 것도 가능U+000000 에서 U+110000 까지 전체 범위 표현 가능

39

Page 40: Python Programming: Type and Object

문자열 메서드

메서드 설명

s.capitalize() 첫 번째 문자를 �문자로 변환

s.center(width [, pad])width 길이를 가지는 필드 안에문자열을 가운데 정렬

s.count(sub [, start [, end]]) 지정된 부분 문자열이 나타나는 횟수

s.decode([encoding [, errors]]) 문자열을 디코딩해서 유니코드 반환

s.encode([encoding [, errors]]) 인코딩된 버전의 문자열 반환

s.endswith(suffix [, start [, end]]) 문자열이 suffix로 끝나는지를 검사

s.expandtabs([tabsize]) 탭을 스페이스로 �체

40

Page 41: Python Programming: Type and Object

문자열 메서드

메서드 설명

s.find(sub [, start [,end]])부분문자열이 처음으로 나타나는 위치 검색못 찾으면 ‑1을 반환

s.format(*args, **kwargs) s의 포맷을 지정

s.index(sub [, start [,end]])부분문자열이 처음으로 나타나는 위치 검색못 찾으면 예외 발생

s.isalnum() 모든 문자가 알파벳이나 숫자인지를 검사

s.isalpha() 모든 문자가 알파벳인지를 검사

s.isdigit() 모든 문자가 숫자인지를 검사

s.islower() 모든 문자가 소문자인지를 검사

41

Page 42: Python Programming: Type and Object

문자열 메서드

메서드 설명

s.isspace() 모든 문자가 공백 문자인지를 검사

s.istitle() 각 단어의 첫 Ú자가 �문자인지를 검사

s.isupper() 모든 문자가 �문자인지를 검사

s.join(t)s를 분리자로 사용해서 순서열 t에 들어있는문자열들을 이어붙임

s.ljust(width [, fill]) 길이 width인 문자열에서 s를 왼쪽 정렬

s.lower() 소문자로 변경

s.lstrip([chrs]) 앞쪽에 있는 공백이나 chrs로 지정된 문자들을 제거

42

Page 43: Python Programming: Type and Object

문자열 메서드

메서드 설명

s.partition(sep) 문자열 sep에 기반해서 문자열을 분할

s.replace(old, new [,maxreplace])

부분문자열을 �체

s.rfind(sub [,start [,end]])

부분문자열이 최종적으로 나타난 위치 검색

s.rindex(sub [,start [,end]])

부분문자열이 최종적으로 나타난 위치를 찾거나 예외를 발생

s.rjust(width [, fill]) 길이 width인 문자열에서 s를 오른쪽 정렬

s.rpartition(sep)s를 분리자 sep에 기반해서 분할오른쪽 끝에서 검색 시작

43

Page 44: Python Programming: Type and Object

문자열 메서드

메서드 설명

s.rsplit([sep [,maxsplit]])sep를 구분자로 사용해서 문자열을 끝에서부터 분할

s.rstrip([chrs])끝에 나오는 공백이나 chrs로 지정된문자들을 제거

s.split([sep [,maxsplit]]) sep를 구분자로 사용해 문자열 분할

s.splitlines([keepends]) 문자열을 줄들의 리스트로 분할

s.startswith(prefix [,start[,end]])

문자열이 prefix로 시작하는지 검사

s.strip([chrs])앞이나 뒤에 나오는 공백이나 chrs로지정된 문자들을 제거

44

Page 45: Python Programming: Type and Object

문자열 메서드

메서드 설명

s.swapcase() �문자를 소문자로, 소문자를 �문자로 변경

s.title() 제목 �소문자 형태로 된 문자열을 반환

s.translate(table [,deletechars])

문자 변환 표를 사용해 문자열 치환deletechars에 있는 문자들은 삭제

s.upper() �문자로 변경

s.zfill(width) 문자열을 왼쪽에서부터 width만큼 0으로 채움

45

Page 46: Python Programming: Type and Object

문자열 메서드 : 새로운 문자열 생성

>>> s = "hello, world!">>> s.capitalize()'Hello, world!'>>> s.center(40)' hello, world! '>>>>>> s = "hello\tworld!">>> s'hello\tworld!'>>> s.expandtabs(8)'hello world!'

위 메서드는 모두 원본 문자열 자체를 변경하지 않고 새로운 문자열을 생성

46

Page 47: Python Programming: Type and Object

문자열 메서드 : 문자열 내부 검사

>>> "ABCD".isupper() # 모든 문자열이 �문자인지 검사True>>> "abcd1234".isalnum() # 문자열이 알파벳과 숫자로만 이루어졌는지 검사True>>> "ABCD".islower() # 모둔 문자열이 소문자인지 검사False>>> "".isalnum() # 비어 있는 문자열일 경우에는 False 반환False>>> "".isupper() # 비어 있는 문자열일 경우에는 False 반환False

47

Page 48: Python Programming: Type and Object

문자열 메서드 : 검색

find() 메서드는 부분문자열을 찾지 못하면 ‑1을 반환하고index() 메서드는 부분문자열을 찾지 못하면 ValueError 예외 발생

>>> s = "hello, world!">>> s.find("world") # 지정한 문자열이 처음 나타나는 위치7>>> s.find("there") # find() 는 문자열을 찾지 못하면 -1-1>>> s.index("world")7>>> s.index("there") # index() 는 문자열을 찾지 못하면 예외Traceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: substring not found

48

Page 49: Python Programming: Type and Object

문자열 메서드 : 검색

>>> s = "hello, world. hello, programmer">>> s.find("hello")0>>> s.rfind("hello")14>>> s.index("hello")0>>> s.rindex("hello")14>>> s.rfind("there")-1>>> s.rindex("there")Traceback (most recent call last): File "<stdin>", line 1, in <module>ValueError: substring not found

rfind() 와 rindex() 는 부분문자열을 뒤에서 검색하여 위치를 반환

49

Page 50: Python Programming: Type and Object

문자열 메서드 : 분리

>>> s = " name email country state city ">>> s.split()['name', 'email', 'country', 'state', 'city']>>> s.rsplit()['name', 'email', 'country', 'state', 'city']>>> s.split(None, 3)['name', 'email', 'country', 'state city ']>>> s.rsplit(None, 3)[' name email', 'country', 'state', 'city']

split(), rsplit() 첫 번째 인자로 분리할 문자를 지정하고두 번째 인자로 분리할 문자열 갯수 지정

split() 은 왼쪽에서 분리할 문자열을 생성하고rsplit() 은 오른쪽에서 분리할 문자열을 생성

50

Page 51: Python Programming: Type and Object

문자열 메서드 : 분리

>>> s = "FIELD-VALUE-OPTION">>> s.partition("-")('FIELD', '-', 'VALUE-OPTION')>>> s.rpartition("-")('FIELD-VALUE', '-', 'OPTION')

partition(), rpartition() 메서드는 분리자 부분 문자열을 검색한 후분리자 앞쪽 텍스트, 분리자, 그리고 분리자 뒤쪽 텍스트로 분할

partition() 은 왼쪽에서 처음 나오는 분리자 부분 문자열을 검색rpartition() 은 오른쪽에서 처음 나오는 분리자 부분 문자열을 검색

51

Page 52: Python Programming: Type and Object

문자열 메서드 : 변환 (Python 2)

>>> from string import maketrans>>> intab = "aeiou">>> outtab = "12345">>> transtab = maketrans(intab, outtab)>>> len(transtab)256>>> s = "this is string example">>> s.translate(transtab)'th3s 3s str3ng 2x1mpl2'

translate() 메서드는 특정한 문자를 변환하거나 제거하는 치환 작업에 사용원본 문자열과 결과 문자열 사이에 일�일 매핑 정보를 담은 변화표 필요

8비트 문자열에 �해서 변환표는 256개 문자로 된 문자열 필요

유니코드일 경우 s[n]이 n의 유니코드 문자에 �응하는 순서열 객체 필요

52

Page 53: Python Programming: Type and Object

문자열 메서드 : 변환 (Python 3)

>>> transtab = str.maketrans("aeiou", "12345")>>> transtab{97: 49, 101: 50, 105: 51, 111: 52, 117: 53}>>> s = "this is string example">>> s.translate(trans)'th3s 3s str3ng 2x1mpl2'

Python 3 에서 바이트 문자열을 �상으로 변환하고 싶다면bytes.maketrans(), bytes.translate() 메서드 이용

53

Page 54: Python Programming: Type and Object

문자열 메서드 : 포맷 지정

>>> s = "Your name is {0} and your age is {1}">>> s.format("Mike", 40)'Your name is Mike and your age is 40'>>> s = "Your name is {name} and your age is {age}">>> s.format(name="Mike", age=40)'Your name is Mike and your age is 40'

54

Page 55: Python Programming: Type and Object

문자열 메서드 : 포맷 지정

>>> s = "Your name is {item[name]} and \ your age is {item[age]}">>> person = {"name": "Mike", "age": 40}>>> s.format(item=person)'Your name is Mike and your age is 40'

포맷 문자열 안에 있는 자리 표시자 {item} 은 간단한 색인 검색이나속성 검색을 포함하는 것도 가능

{item[n]}: 순서열 검색을 통해 문자열 치환

{item[key]}: 사전 검색을 통해 문자열 치환

{item.key}: item 의 속성 attr 을 이용해 문자열 치환

55

Page 56: Python Programming: Type and Object

xrange() 객체 (Python 2)

xrange(i, j, stride) 함수는 범위가 k 인 (i <= k < j) 정수들을나타내는 객체 생성

i, stride 는 생략 가능. 기본 값은 0, 1

xrange 객체는 접근될 때마다 값을 계산

range() 함수는 순서열 객체를 생성하지만,xrange 객체는 순서열 객체가 아님

Python 3 에서는 xrange 이름이 range 로 변경됨

# Python 2>>> range(1, 10)[1, 2, 3, 4, 5, 6, 7, 8, 9]>>> xrange(1, 10)xrange(1, 10)>>> list(xrange(1, 10))[1, 2, 3, 4, 5, 6, 7, 8, 9]

56

Page 57: Python Programming: Type and Object

매핑 타입

거의 임의적인 키 값으로 색인되는 객체를 나타냄

순서열과 달리 매핑 객체는 순서를 지니지 않음

숫자, 문자열 및 기타 다른 객체로 색인 가능

매핑 객체는 변경 가능

57

Page 58: Python Programming: Type and Object

사전

사전은 유일한 내장 매핑 타입이며 해시 테이블이나 연관 배열의 파이썬 버전

변경 불가능한 객체라면 어떤 객체든 사전의 키 값으로 사용 가능

문자열, 숫자, 튜플 등 사용 가능

리스트, 사전, 변경 가능한 객체를 담은 튜플은 사용 불가

키 값의 순서를 유지하는 것이 필요할 경우에는 OrderedDict 사용

58

Page 59: Python Programming: Type and Object

사전의 메서드와 연산

메서드 설명

len(m) m에 있는 항목 개수를 반환

m[k] 키 k로 m의 항목을 반환

m[k]=x m[k]를 x로 설정

del m[k] m에서 m[k]를 제거

k in m 키 k가 m에 있으면 True를 반환

m.clear( ) m에서 모든 항목을 제거

m.copy( ) m의 복사본을 생성

59

Page 60: Python Programming: Type and Object

사전의 메서드와 연산

메서드 설명

m.fromkeys(s [,value])순서열 s에서 키를 가져와 모든 값을 value로 설정한 새로운 사전 생성

m.get(k [,v]) m[k]가 있으면 m[k]를 반환. 아니면 v를 반환

m.has_key(k) m에 키 k가 있으면 True를 반환 (Python 2)

m.items() m의 모든 (키, 값) 쌍들로 구성되는 순서열 반환

m.keys() m의 모든 키들의 순서열 반환

m.pop(k [,default])m[k]가 있으면 m[k]를 반환하고 m에서 제거m[k]가 없을 경우 default가 제공되면default를 반환. 아니면 KeyError

60

Page 61: Python Programming: Type and Object

사전의 메서드와 연산

메서드 설명

m.popitem() 임의의 (키,값) 쌍을 제거하고 이를 튜플로 반환

m.setdefault(k [, v])m[k]가 있으면 m[k]를 반환없으면, v를 반환하고 m[k]를 v로 설정

m.update(b) b에 있는 모든 객체를 m에 추가

m.values() m에 있는 모든 값으로 구성되는 순서열을 반환

61

Page 62: Python Programming: Type and Object

사전의 메서드와 연산

>>> person = {"name": "Mike", "age": 40}>>> person["name"]'Mike'>>> person["location"] # 키를 못 찾을 경우 KeyErrorTraceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 'location'>>> person.get("location", "No data") # 못 찾을 경우 기본 값 'No data'>>> person.update({"location": "Seoul"})>>> person{'name': 'Mike', 'age': 40, 'location': 'Seoul'}>>> len(person)3>>> person.pop("location") # 항목 값을 반환하면서 삭제'Seoul'>>> person{'name': 'Mike', 'age': 40}

62

Page 63: Python Programming: Type and Object

사전의 메서드와 연산

>>> m = dict.fromkeys(["name", "age"]) # 키를 가져와 생성>>> m{'name': None, 'age': None}>>> m["name"] = "Mike">>> m["age"] = 40>>> n = m.copy() # 매핑 객체에 �한 얕은 복사본>>> n["name"] = "David">>> m{'name': 'Mike', 'age': 40}>>> n{'name': 'David', 'age': 40}

63

Page 64: Python Programming: Type and Object

사전의 메서드와 연산

Python 3

>>> m = {"name": "Mike", "age": 40}>>> m.keys()dict_keys(['name', 'age'])>>> m.values()dict_values(['Mike', 40])>>> m.items()dict_items([('name', 'Mike'), ('age', 40)])

Python 3 에서 keys(), values(), items() 메서드 결과로

현재 내용에 �해 반복을 수행하는 반복자를 반환

64

Page 65: Python Programming: Type and Object

사전의 메서드와 연산

Python 2

>>> m = {"name": "Mike", "age": 40}>>> m.keys()['age', 'name']>>> m.values()[40, 'Mike']>>> m.items()[('age', 40), ('name', 'Mike')]

Python 2 에서 keys(), values(), items() 메서드 결과로

실제 내용을 담고 있는 리스트를 반환

65

Page 66: Python Programming: Type and Object

집합 타입

고유한 항목들의 순서 없는 모음

순서열과는 달리 집합은 색인 및 분할 연산 지원 안함

객체에 연관된 키가 없음

집합에 들어있는 항목들은 변경이 불가능해야함

set: 변경이 가능한 집합

frozenset: 변경이 불가능한 집합

>>> s = set([1, 10, 20, 30])>>> f = frozenset(['a', 1, 'hello', 42])>>> s{1, 10, 20, 30}>>> ffrozenset({1, 42, 'a', 'hello'})

66

Page 67: Python Programming: Type and Object

집합 타입 메서드와 연산

메서드 설명

len(s) s에 있는 항목의 개수

s.copy() s의 복사본을 생성

s.difference(t) 차집합. s에는 있지만 t에는 없는 모든 항목을 반환

s.intersection(t) 교집합. s와 t에 둘 다 들어 있는 모든 항목을 반환

s.isdisjoint(t)s와 t에 공통으로 들어 있는 항목이 없을 경우 True를 반환

67

Page 68: Python Programming: Type and Object

집합 타입 메서드와 연산

메서드 설명

s.issubset(t) s가 t의 부분집합인 경우 True를 반환

s.issuperset(t) s가 t의 포함집합인 경우 True를 반환

s.symmetric_difference(t)�칭 차집합. s나 t에 들어있지만 둘 모두에는 들어 있지 않은 모든 항목 반환

s.union(t) 합집합. s나 t에 있는 모든 항목을 반환

68

Page 69: Python Programming: Type and Object

집합 타입 메서드와 연산

>>> a = {1, 3, 5, 7}>>> b = {1, 2, 4, 6}>>> len(a)4>>> a.difference(b) # 집합 연산 a - b{3, 5, 7}>>> a.intersection(b) # 집합 연산 a ∩ b{1}>>> a.union(b) # 집합 연산 a ∪ b{1, 2, 3, 4, 5, 6, 7}>>> a.symmetric_difference(b) # 집합 연산 a ∪ b - (a ∩ b){2, 3, 4, 5, 6, 7}

69

Page 70: Python Programming: Type and Object

집합 타입 메서드와 연산

>>> a = {1, 3, 5}>>> b = {1, 3, 5, 7, 9}>>> a.issubset(b) # a ⊂ bTrue>>> b.issuperset(a) # a ⊂ bTrue>>> a.isdisjoint(b) # a ∩ b is ∅ ?False>>> a = {1, 3, 5}>>> b = {2, 4, 6}>>> a.isdisjoint(b) # a ∩ b is ∅ ?True

70

Page 71: Python Programming: Type and Object

집합 타입 메서드와 연산

변경 가능한 집합에 사용 가능한 메서드

메서드 설명

s.add(item)item을 s에 추가이미 item이 s에 있으면 아무런 효과 없음

s.clear() s에서 모든 항목을 제거

s.difference_update(t) s에서 t에 있는 모든 항목을 제거

s.discard(item)s에서 item을 제거s에 item이 없는 경우 아무런 변화없음

71

Page 72: Python Programming: Type and Object

집합 타입 메서드와 연산

변경 가능한 집합에 사용 가능한 메서드

메서드 설명

s.intersection_update(t)s와 t의 교집합을 구하고 결과를 s에 남겨둠

s.pop( )s에서 아무 원소나 반환하는 동시에 s에서 제거

s.remove(item)s에서 item을 제거한다. item이 없으면 KeyError 예외

s.symmetric_difference_update(t)s와 t의 �칭 차집합을 구하고 결과를 s에 남겨둠

s.update(t) t의모든항목을s에추가

72

Page 73: Python Programming: Type and Object

집합 타입 메서드와 연산

변경 가능한 집합에 사용 가능한 메서드

>>> a = {1, 3, 5}>>> b = {2, 3, 5, 7}>>> a.add(9) # a 집합에 항목 추가>>> a{1, 3, 5, 9}>>> a.difference_update(b) # a := a - b>>> a{1, 9}>>> c = {1, 10}>>> a.intersection_update(c) # a := a ∩ c>>> a{1}

73

Page 74: Python Programming: Type and Object

집합 타입 메서드와 연산

변경 가능한 집합에 사용 가능한 메서드

>>> a = {1, 3, 5, 7}>>> a.update({1, 1, 3, 3, 5, 9})>>> a{1, 3, 5, 7, 9}>>> a.pop() # 원소를 반환하면서 집합에서 제거1>>> a.pop()3>>> a{5, 7, 9}>>> a.remove(10) # 없는 값을 지정할 경우 KeyErrorTraceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 10>>> a.discard(10) # 없는 값을 지정할 경우 무시

74

Page 75: Python Programming: Type and Object

프로그램 구조를 나타내는 내장 타입

파이썬에서 함수, 클래스, 모듈은 모두 데이터로서 다루어질 수 있는 객체

타입 분류 타입 이름 설명

호출가능

(callable)

types.BuiltinFunctionType 내장 함수나 메서드

type 내장 타입과 클래스의 타입

object 모든 타입과 클래스의 조상

types.FunctionType 사용자 정의 함수

types.MethodType 클래스 메서드

75

Page 76: Python Programming: Type and Object

프로그램 구조를 나타내는 내장 타입

타입 분류 타입 이름 설명

모듈 types.ModuleType 모듈

클래스 object 모든 타입과 클래스의 조상

타입 type 내장 타입과 클래스의 타입

object 와 type 은 두 번씩 나와 있는데클래스와 타입의 경우 모두 함수로서 호출될 수 있기 때문

76

Page 77: Python Programming: Type and Object

호출가능 타입

호출가능(callable) 타입은 함수 호출 연산을 지원하는 객체

사용자 정의 함수

내장 함수

인스턴스 메서드

클래스

77

Page 78: Python Programming: Type and Object

사용자 정의 함수

사용자 정의 함수(user‑defined function)는 모듈 수준에서def 문이나 lambda 연산자로 생성되는 호출 가능 객체

>>> def foo(x, y):... return x + y...>>> bar = lambda x, y: x + y

78

Page 79: Python Programming: Type and Object

사용자 정의 함수

사용자 정의 함수는 다음 속성을 가짐

속성 설명

f.__doc__ 문서화 문자열

f.__name__ 함수이름

f.__dict__ 함수속성을담은사전

f.__code__ 바이트 컴파일된 코드

f.__defaults__ 기본 인수들을 담는 튜플

f.__globals__ 전역 네임스페이스를 나타내는 사전

f.__closure__ 중첩된 유효범위와 관련된 데이터를 담은 튜플

79

Page 80: Python Programming: Type and Object

메서드

메서드(method)는 클래서 안에서 정의되는 함수

인스턴스 메서드

클래스 메서드

정적 메서드

class Foo(object): def instance_method(self, arg): print("instance_method: ", arg) @classmethod def class_method(cls, arg): print("class_method: ", arg) @staticmethod def static_method(arg): print("static_method: ", arg)

80

Page 81: Python Programming: Type and Object

메서드

인스턴스 메서드(instance method)는 주어진 클래스에 속한인스턴스에 �해 수행되는 메서드

첫 번째 인수로 인스턴스 전달 (관례에 따라 self)

클래스 메서드(class method)는 클래스 자체를 객체로 보고여기에 �해 수행되는 메서드

첫 번째 인수 cls 로 클래스 객체 전달

정적 메서드(static method)는 클래스 안에 함께 묶인 함수

첫 번째 인수로 인스턴스나 클래스 객체를 받지 않음

81

Page 82: Python Programming: Type and Object

메서드

인스턴스 메서드와 클래스 메서드는 모두 타입이types.MethodType 객체로 표현

메서드를 호출할 때 찾는 연산과 호출하는 연산이 모두 발생하지만무언가를 찾는 연산은 함수를 호출하는 연산과 별개로 수행

82

Page 83: Python Programming: Type and Object

메서드

>>> f = Foo()>>> meth = f.instance_method>>> meth(42)instance_method: 42

위 코드에서 meth를 묶인 메서드(bound method)라고 부름

메서드와 메서드에 연관된 인스턴스 둘 다를 감싸는 호출가능 객체

묶인 메서드를 호출하면 인스턴스가 첫 번째 인수(self)로 전달

83

Page 84: Python Programming: Type and Object

메서드

클래스 자체에 �해서 메서드 검색을 수행하는 것도 가능

>>> umeth = Foo.instance_method>>> umeth(f, 37) # self 를 직접 전달하면서 호출instance_method: 37

위 코드에서 umeth를 안 묶인 메서드(unbound method)라고 부름

메서드 함수를 감싸고 인스턴스는 첫 번째 인수로 넘어올 것을 기�

엉뚱한 타입 객체를 전달하면 TypeError 발생 (Python 2)

84

Page 85: Python Programming: Type and Object

메서드

사용자 정의 클래스에 �해 묶인 메서드와 안 묶인 메서드는 모두타입이 types.MethodType 인 객체로 표현

메서드 객체 속성

속성 설명

m.__doc__ 문서화 문자열

m.__name__ 메서드 이름

m.__class__ 이 메서드가 정의되어 있는 클래스

m.__func__ 메서드를 구현하는 함수 객체

m.__self__ 메서드와 연결되어 있는 인스턴스

85

Page 86: Python Programming: Type and Object

내장 함수와 메서드

types.BuiltinFunctionType 객체는 C 와 C++ 로 구현된내장 함수와 메서드를 나타냄

내장 함수 속성 목록

속성 설명

b.__doc__ 문서화 문자열

b.__name__ 함수나 메서드 이름

b.__self__ 메서드와 연결된 인스턴스(묶인 메서드일 경우)

len() 같은 내장 함수는 __self__ 값이 None 이며어떤 객체에도 묶여있지 않음

x 가 리스트일 때 x.append 같은 내장 메서드의 __self__ 는 x 로 설정

86

Page 87: Python Programming: Type and Object

호출가능한 클래스와 인스턴스

클래스 객체와 인스턴스는 호출 가능한 객체로도 동작

클래스 객체

클래스 객체는 class 문에 의해 생성

클래스 객체가 호출될 때 인수들은 __init__() 메서드에 전달

__init__() 메서드에 전달된 인수를 이용해 인스턴스를 초기화

인스턴스

__call()__ 을 정의하여 함수를 흉내내는 것 가능

인스턴스 x 에 �해 이 메서드가 정의되어 있으면 x(args)를 통해x.__call__(args) 호출 가능

87

Page 88: Python Programming: Type and Object

클래스, 타입, 인스턴스

클래스를 정의하면 일반적으로 타입이 type 인 객체 생성

>>> class Foo(object):... pass...>>> type(Foo)<class 'type'>

88

Page 89: Python Programming: Type and Object

클래스, 타입, 인스턴스

타입 객체 t 에 �해서 자주 사용되는 속성 목록

속성 설명

t.__doc__ 문서화 문자열

t.__name__ 클래스 이름

t.__bases__ 기반 클래스들로 구성되는 튜플

t.__dict__ 클래스 메서드와 변수들을 담은 사전

t.__module__ 클래스가 정의되어 있는 모듈의 이름

t.__abstractmethods__ 추상 메서드 이름들의 집합

89

Page 90: Python Programming: Type and Object

클래스, 타입, 인스턴스

어떤 객체의 인스턴스가 생성되면 이 인스턴스의 타입은인스턴스를 정의하는 클래스가 됨

>>> f = Foo()>>> type(f)<class '__main__.Foo'>

인스턴스 i 의 특수한 속성 목록

속성 설명

i.__class__ 인스턴스가 속하는 클래스

i.__dict__ 인스턴스 데이터를 담은 사전

90

Page 91: Python Programming: Type and Object

모듈

모듈(module) 타입은 import 문으로 로드되는 객체들을 담는 컨테이너import foo 문을 실행하면 �응되는 모듈 객체에 이름 foo 가 할당됨

모듈은 속성 __dict__ 로 접근할 수 있는 사전을 통해서 네임 스페이스 정의

>>> import foo>>> foo.__name__'foo'>>> foo.x42>>> foo.__dict__["x"]42

91

Page 92: Python Programming: Type and Object

모듈

모듈이 가진 속성 목록

속성 설명

m.__dict__ 모듈과 연결된 사전

m.__doc__ 모듈의 문서화 문자열

m.__name__ 모듈의 이름

m.__file__ 모듈이 로드된 파일

m.__path__패키지 전체 경로모듈 객체가 패키지를 참조할 경우에만 정의됨

92

Page 93: Python Programming: Type and Object

객체의 작동 방식과 특수 메서드

모든 기본적인 인터프리터 연산은 특수한 객체 메서드에 의해 구현됨

메서드들의 이름은 이중 밑줄(__)로 시작해서 이중 밑줄로 끝남

프로그램이 실행됨에 따라 인터프리터에 의해 자동으로 호출

>>> x = 10>>> y = 20>>> x + y30>>> x.__add__(y)30>>> s = [1, 2, 3]>>> s[0]1>>> s.__getitem__(0)1

각 데이터 타입의 작동 방식은 그 타입이 구현하고 있는특수 메서드 집합에 따라 결정

93

Page 94: Python Programming: Type and Object

객체 생성 및 파괴

객체 생성과 파괴를 위한 특수 메서드

메서드 설명

__new__(cls [, *args [, **kwargs]])새 인스턴스를 생성하기 위해호출되는 클래스 메서드

__init__(self [, *args [, **kwargs]]) 새 인스턴스를 초기화할 때 호출

__del__(self) 인스턴스가 파괴될 때 호출

del x 문은 객체의 참조 횟수를 감소시킬 뿐반드시 __del__() 함수 호출로 이어지지는 않음

94

Page 95: Python Programming: Type and Object

객체 생성 및 파괴

__new__(), __init__() 메서드는 새 인스턴스 생성 후 초기화하는 데 사용

>>> class Foo(object):... def __init__(self):... pass...>>> x = Foo.__new__(Foo)>>> x.__init__()>>> type(x)<class '__main__.Foo'>

__new__() 는 보통 변경 불가능한 타입 중 하나로부터 상속을 받은사용자 정의 객체나 메타클래스에서 주로 사용

__del__() 는 자원 관리 문제를 다루어야 하는 상황에서 주로 사용

95

Page 96: Python Programming: Type and Object

객체의 문자열 표현

객체 표현을 위한 특수 메서드

메서드 설명

__format__(self, format_spec) 포맷이 적용된 표현을 생성

__repr__(self) 객체의 문자열 표현을 생성

__str__(self) 객체의 간단한 문자열 표현을 생성

96

Page 97: Python Programming: Type and Object

객체의 문자열 표현

__repr__() 메서드

평가될 경우 객체를 재생성하는 표현식 문자열 반환

�화형 인터프리터에서 변수를 살펴볼 때 보여주는 출력 값

문자열 표현식을 생성할 수 없는 경우에는 <...메시지...>형태의 문자열을 반환하는 것이 관례

>>> a = [1, 2, 3, 4]>>> s = repr(a)>>> s'[1, 2, 3, 4]'>>> b = eval(s)>>> b[1, 2, 3, 4]>>>>>> f = open('sample.txt', 'w')>>> a = repr(f)>>> a"<_io.TextIOWrapper name='sample.txt' mode='w' encoding='UTF-8'>

97

Page 98: Python Programming: Type and Object

객체의 문자열 표현

__str__() 메서드

내장 함수 str() 또는 출력과 관련된 함수에 의해서 호출

__str__() 은 __repr__() 에 비해서 더 간결한 문자열 반환

__str__() 이 정의되어 있지 않으면 __repr__() 가 �신 호출

__format__() 메서드

format() 함수 또는 문자열의 format() 메서드에 의해 호출

>>> format(12300.345678, ".2f")'12300.35'>>> "{0:.2f}".format(12300.345678)'12300.35'>>> format(255, "x")'ff'>>> "{0:x}".format(255)'ff'

98

Page 99: Python Programming: Type and Object

객체 비교와 순서 매기기

객체 검사 및 해싱을 위한 특수 메서드

메서드 설명

__bool__(self) 진리값 검사를 위해 False나 True를 반환

__hash__(self) 정수 해시 색인을 계산

__bool__()

진리값 검사를 수행하는 데 사용

메서드가 정의되어 있지 않을 경우에는 __len__() 메서드 사용

99

Page 100: Python Programming: Type and Object

객체 비교와 순서 매기기

__hash__()

사전에서 키로 쓰일 수 있는 객체에서 정의 필요

동일한 두 객체에 �해서 동일한 값을 갖는 정수 반환

변경 가능한 객체에서는 메서드를 정의하면 안됨객체에 변경이 가해지면 해시 값이 변경되어 검색 불가

>>> s = "hello">>> s.__hash__()-3744210719992765910>>> s = "world">>> s.__hash__()-2831968778691815178

100

Page 101: Python Programming: Type and Object

객체 비교와 순서 매기기

객체는 하나 이상의 관계 연산자를 구현하는 것이 가능각 메서드는 두 개의 인수를 받아 어떤 종류의 객체든 반환 가능

메서드 설명

__lt__(self,other) self < other

__le__(self,other) self ≤ other

__gt__(self,other) self > other

__ge__(self,other) self ≥ other

__eq__(self,other) self == other

__ne__(self,other) self != other

== 로 비교하거나 사전 키로 사용하려면 __eq__() 메서드 구현

객체를 정렬하거나 min(), max() 를 사용하려면 __lt()__ 메서드 구현101

Page 102: Python Programming: Type and Object

순서열 및 매핑 메서드

순서열과 매핑을 위한 메서드 목록

메서드 설명

__len__(self) self의 길이 반환

__getitem__(self, key) self[key] 반환

__setitem__(self, key, value) self[key] = value 반환

__delitem__(self, key) self[key] 삭제

__contains__(self,obj)obj가 self에 있으면 True를 반환아닐 경우 False를 반환

102

Page 103: Python Programming: Type and Object

순서열 및 매핑 메서드

순서열이나 매핑 객체를 흉내 내기 원하는 객체에서 사용

>>> a = [1, 2, 3, 4, 5]>>> len(a)5>>> a.__len__()5>>> a.__getitem__(2) # 순서열에 �해서는 보통 정수 사용3>>> a.__delitem__(3)>>> a[1, 2, 3, 5]>>> 5 in aTrue>>> a.__contains__(1)True

103

Page 104: Python Programming: Type and Object

순서열 및 매핑 메서드

x = s[i:j] 같은 분할 연산을 구현할 때에는 slice 객체 이용

>>> a = [1, 2, 3, 4, 5, 6]>>> a[1:5][2, 3, 4, 5]>>> a.__getitem__(slice(1, 5, None))[2, 3, 4, 5]>>> a[1:3] = [10, 11]>>> a[1, 10, 11, 4, 5, 6]>>> a.__setitem__(slice(1, 3, None), [20, 21])>>> a[1, 20, 21, 4, 5, 6]>>> a.__delitem__(slice(1, 3, None)) # del a[1:3]>>> a[1, 4, 5, 6]

104

Page 105: Python Programming: Type and Object

반복

객체가 반복을 지원하고자 하면 반복자 객체를 반환하는obj.__iter__() 메서드를 구현하는 것이 필요

반복자 iter 는 iter.__next__() 메서드를 구현해야함 (Python 2: iter.next())

>>> s = [1, 2, 3, 4]>>> for x in s:... print(x)...>>> _iter = s.__iter__()>>> while True:... try:... x = _iter.__next__()... except StopIteration:... break... print(x)...1234

105

Page 106: Python Programming: Type and Object

호출가능 인터페이스

객체는 __call__(self [, *args [, **kwargs]]) 메서드를 제공해함수처럼 호출하는 것이 가능

x(arg1, arg2, ...) ‑> x.__call__(self, arg1, arg2, ...)

함수를 흉내내는 객체는 함수기(functor), �리자(proxy)를 생성하는 데 유용

>>> class DistanceFrom(object):... def __init__(self, origin):... self.origin = origin... def __call__(self, x):... return abs(x - self.origin)...>>> nums = [20, 40, 0, -10, 10, 42]>>> nums.sort(key=DistanceFrom(10))>>> nums[10, 20, 0, -10, 40, 42]

106

Page 107: Python Programming: Type and Object

컨텍스트 관리 프로토콜

with 문은 컨텍스트 관리자(context manager)라고 부르는 객체 제어하에서일련의 문장들을 실행하는 데 사용

with context [as var]: 문장들

파일이나 네트워크 연결, 락 같은 시스템 자원을 with 문 안에서 사용하고빠져나올 때 자동으로 해제하는 형태로 사용

>>> with open("sample.txt", "w") as f:... f.write("Hello, World!")...13>>> open("sample.txt").read()'Hello, World!'

107

Page 108: Python Programming: Type and Object

컨텍스트 관리 프로토콜

컨텍스트 관리자를 위한 특수 메서드

메서드 설명

__enter__(self)새로운 컨텍스트에 들어설 때 호출반환되는 값은 as 로 지정된 변수에 저장

__exit__(self, type, value, tb)컨텍스트를 벗어날 때 호출예외가 발생되었으면 type, value, tb는예외 타입, 값, 역추적 정보를 담고 있음

108