객체
파이썬은 모든 데이터를 객체(object)로 다룬다.
정수, 실수, 문자열, 사용자 정의 클래스의 인스턴스 등 모든 데이터는 신원(id)과 타입(객체를 만든 클래스)을 가진다.
ex) a= 100이라는 코드에서 100이라는 int 타입을 갖는 객체가 생성된다.
이때 a는 int 타입의 인스턴스가 되고 이 인스턴스는 신원과 타입을 변경할 수 없다.
▶Immutable 객체
파이썬의 immutable 타입: int, float, str, bool, tuple 등
값의 변경이 불가능한 객체/ 값의 변경을 시도하면 새 값을 가진 객체를 새로 생성하여 이를 가리키게 한다.
다만 동일한 값을 쓸 경우 객체를 새로 생성하는 것이 비효율적이기 때문에 타입마다 값이 캐시되는 기준을 정해서
캐시 되어 있는 값이면 같은 값의 기존 객체를 가리키도록 한다.
a = 200
b = 200
print(id(a))
print(id(b))
#134481038875088
#134481038875088
(None, True, False 객체는 메모리에 유일하게 하나씩만 저장되므로 사용 시 새로 객체를 생성하지 않음
따라서 ==가 아닌 is로 비교)
▶mutable 객체
파이썬의 mutable 타입: list, dict, set 등
값의 변경이 가능한 객체/ 값의 변경을 시도하면 기존에 가리키고 있는 객체의 값을 바꾼다.
▶속성(attribute), 메서드(method)
내장되어 있는 행동은 dir()와 같은 함수를 통해 호출할 수 있지만,
객체의 속성과 메서드는 각 객체의 타입마다 각각 다르기 때문에 .연산자를 통해 호출한다.
이중밑줄 __로 시작하고 끝나는 특수한 메서드들도 있다.
a = [1,2,3]
a.append(4)
print(a)
a.__add__([5,6])
print(a)
#이때 __add__는 a 자체를 변경하지 않고 새로운 리스트를 반환하는
#비파괴적 메서드이기 때문에 a의 결과값이 바뀌지 않음
print(a.__add__([5,6]))
#[1,2,3,4]
#[1,2,3,4]
#[1,2,3,4,5,6]
Iterator, Iterable 객체
Iterable: 반복 가능한 객체
Iterator: 값을 차례대로 꺼낼 수 있는 객체
Iterable한 타입: list, dict, set, str, tuple ...
iterable 객체:__iter__() 메서드를 구현한 객체. 반복자(Iterator)를 반환한다.
Iterator 객체:__next__()메서드를 구현한 객체. 다음 요소를 반환하고 더 이상 반환할 요소가 없을 때 예외를 발생.
my_list = [1, 2, 3, 4, 5, 6]
a_iter = iter(my_list)
b_iter = my_list.__iter__()
for x in range(3):
print(next(a_iter))
print(a_iter.__next__())
print(b_iter.__next__())
#1 2 3 4 1
파이썬 내장함수 iter()를 사용하거나 iterable 객체의 __iter__()메서드를 사용하여 Iterator 객체를 만든다.
Iterator 객체는 next() 함수나 __next__() 메서드를 통해서 하나씩 값을 꺼낼 수 있다.
Generator
Generator 함수: iterator를 반환하는 함수로, yield 키워드를 사용하여 next() 함수와 상호작용하는 함수
yield 키워드: return과 유사하지만 함수를 종료시키지 않고 현재 상태를 저장하여 중단된 곳에서 다음 값을 생성할 수 있게 함.
def generator():
yield 1
yield 2
yield 3
g = generator()
print(next(g)) #1
print(next(g)) #2
print(next(g)) #3
yield 호출 시 현재의 상태를 임시로 저장한 후 현재 값을 반환하여 반환 값을 next() 함수 호출부로 전달
next() 함수 호출 시 저장해 둔 상태로 돌아가서 다음 yield를 만날 때까지 실행
generator는 iterable한 객체이기 때문에 for문에서 사용할 수 있으며
아래와 같이 무한 시퀀스를 생성할 수 있다.
def gen_counter(s=0):
num = s
while True:
yield num
num += 1
gen = gen_counter()
print(next(gen)) #... 무한 시퀀스 생성 가능
▶Generator의 메모리 효율성
파일, 리스트와 같은 일련의 값들을 한 번에 모두 메모리에 로드하지 않고 필요마다
yield 키워드를 통해 현재 상태를 임시 저장하고, next()가 호출될 때 그 상태부터 실행을 재개할 수 있다.
-> 대용량 데이터나 무한 시퀀스를 처리할 때 유용
'Lauguage > Python' 카테고리의 다른 글
[Python] GIL (Global Interpreter Lock) (0) | 2024.06.11 |
---|---|
[Python] [혼자 공부하는 파이썬] Chapter 8. 클래스 (0) | 2024.06.10 |
[Python] [혼자 공부하는 파이썬] Chapter 6-7 예외처리, 모듈 (1) | 2024.06.08 |
[Python] [혼자 공부하는 파이썬] Chapter 5. 함수 (1) | 2024.06.06 |
[Python] [혼자 공부하는 파이썬] Chapter 1~4 (1) | 2024.06.03 |