-
파이썬 커스텀 range, iterator컴퓨터/파이썬 2020. 10. 30. 22:46728x90반응형
iterator
1. 만들어 볼 것
reversed(range) = range(start, end, -1)
rrange(10, 1, 2) # 10, 8, 6, 4, 2 # for i = 10; i > 1; i++ arr = [i for i in range(10)] for i in rrange(len(arr) - 1, 0): print(arr[i]) ''' 출력 9 8 ... 1 ''' for i in rrange(10): # 자동으로 10부터 0보다 클 때까지 print(i) ''' 10 9 8 7 6 5 4 3 2 1 '''
2. 파이썬 소스
초기화 함수
class rrange: def __init__(self, end=None, start=0, step=1): if end < start: # 예) 반대로 iterate하므로 end 값이 start보다 커야함 raise ValueError("end must be greater than start") if step < 0: # step은 0보다 커야함, end보다 크면 그냥 end만 출력 raise ValueError("Step must be greater than 0") self.start = start self.end = end self.step = step
__iter__, __next__
iterator로 만들기 위해선 __iter__ (iterable)와 __next__ (state)만 포함하면 된다.
iterator >= iterable
iterable != iterator
class rrange: def __init__(self, end=None, start=0, step=1): ... def __repr__(self): # print(rrange(10)) = "rrange(10 -> 0)" step = "" if self.step == 1 else f", by {self.step}" return f"rrange({self.end} -> {self.start}{step})" def __iter__(self): return self def __next__(self): if self.end > self.start: Next = self.end self.end -= self.step return Next else: # end가 start 값이면 그만 iterate하라고 말해주기 raise StopIteration
reversed(range)를 많이 한다면 이 부분을 Cython이나 C모듈로 작성해서 하면 괜찮을 듯하다.
728x90'컴퓨터 > 파이썬' 카테고리의 다른 글
파이썬 FastAPI로 REST API 구현하기 (0) 2020.10.31 파이썬 데코레이터 재귀 함수 (0) 2020.10.30 딥러닝: Mish 활성화 함수, 모델 불러오기 (0) 2020.10.29