본문 바로가기
Python/Python 개념

파이썬 반복과 이터레이터

by hyun-am 2020. 9. 22.

파이썬 다운 반복문

 

파이썬 답지 않게 처리하기

 

먼저 파이썬의 반복문을 C언어나 자바를 사용한 사람들은 다음과 같이 사용하는 것을 확인할 수 있습니다.

data = [1,2,3,4,5]
i = 0
while i<len(data):
    print(data[i])
    i+=1
# 출력 값
# 1
# 2 
# 3
# 4
# 5

먼저 이코드가 파이썬 답지 않는 이유는 무엇일까요?

  1. 수동으로 인덱스i를 0으로 초기화하고 반복마다 인덱스를 신중하게 증가시킵니다.
  1. 얼마나 반복할지를 결정하기 위해 len으로 data의 크기를 불러옵니다.

 

파이썬에서는 이것을 자동으로 처리하는 반복문을 작성할 수 있습니다.

 

파이썬 답게 처리하기

 

먼저 파이썬 답게 처리하기 위해 range()를 이용해서 자동으로 인덱스를 생성합니다. 또는 인덱스로 검색하지 않고 'for-each'반복문을 이용해서 반복문을 더욱 단순하게 만들 수 있습니다.

 

range( )를 이용한 반복문 처리

for i in range(len(data)):
    print(data[i])
# 출력 값
# 1
# 2 
# 3
# 4
# 5

 

'for-each'반복문을 이용한 처리

for x in data:
    print(x)
# 출력 값
# 1
# 2
# 3
# 4
# 5

 

enumerate( )를 이용한 인덱스와 같이 표현하기

enumerate( )를 이용하면 리스트의 인덱스와 함께 표현할 수 있습니다.

data = ['가','나','다','라']

for i,text in enumerate(data):
    print(f"{i}번째 아이템 {text}")
# 출력 값
# 0번째 아이템 가
# 1번째 아이템 나
# 2번째 아이템 다
# 3번째 아이템 라

 

dict( )의 키와 벨류 동시에 출력하기

해당하는 dict.items( )를 이용하면 key와 value를 출력할 수 있습니다.

data = {
    'apple' : '사과',
    'banana' : '바나나',
}

for alpha,text in data.items():
    print(f"{alpha}는 한글로 {text}입니다.")

 

파이썬 리스트 컴프리핸션

 

간단한 리스트 컴프리핸션

 

먼저 간단한 예시를 통해 리스트 컴프리핸션을 이해하겠습니다. 먼저 0부터 9까지에 대한 제곱근을 표현한 리스트입니다.

data = [x*x for x in range(10)]

print(data)

# 출력 값
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 

자세한 리스트 컴프리핸션 예시는 다음 링크에서 보겠습니다.

https://hyun-am-coding.tistory.com/entry/파이썬-list-comprehension?category=778330

 

파이썬 이터레이터

 

먼저 파이썬의 이터레이터를 설명하기위해 무한루프로 돌아가는 for-in 반복문으로 표현하겠습니다.

class Repeater:
    def __init__(self,value):
        self.value = value
    
    def __iter__(self):
        return RepeaterIterator(self)

class RepeaterIterator:
    def __init__(self,source):
        self.source = source
    def __next__(self):
        return self.source.value


repeater = Repeater('무한 루프 입니다.!!')

for item in repeater:
    print(item)

# 출력 값
# 무한 루프 입니다.!!
# 무한 루프 입니다.!!
# 무한 루프 입니다.!!
# 
#
#
..

이렇게 무한 루프 입니다.!!가 무한으로 출력 되는 것을 확인할 수 있습니다. 이제 이것을 강제 종료 하려면

ctrl + c를 눌러서 탈출하겠습니다.

 

여기서 Repeater클래스에 대해서 설명하겠습니다.

  1. _ _ init _ _ 메서드에서 Repeater 객체에 각 RepeaterIterator 인스턴스를 연결합니다. 그렇게 하면 반복될 '소스' 객체를 유지할 수 있습니다.
  1. RepeaterIterator._ _next_ _ 에서 '소스' Repeater 인스턴스로 돌아가 연결된 소스의 값을 반환합니다.

 

여기서 _ _init_ _와_ _next_ _는 파이썬 객체를 반복 가능하게 만드는 열쇠입니다. 만약 무한루프 없이 수동으로 enumerate하려면 다음과 같은 next를 이용하면 됩니다.

iterator = iter(repeater)

print(next(iterator))
# 출력 값
# 무한 루프입니다.!!

이렇게 하나만 출력 되는 것을 확인할 수 있습니다.

 

제네레이터와 yield키워드를 이용해 이터레이터 작성하기

 

class Repeater:
    def __init__(self, value):
        self.value = value

    def __iter__(self):
        return self
    
    def __next__(self):
        return self.value

def repeater(value):
    while True:
        yield value

for x in repeater('Hi'):
    print(x)
# 출력 값
# Hi
# Hi
# Hi
# ..
# ..

이렇게 Hi가 무한으로 출력 되는 것을 확인할 수 있습니다.

먼저 이 제너레이터는 평범한 함수처럼 보이지만 동작 방식은 아주 다릅니다. 제네레이터 함수를 호출해도 함수가 실행되지 않고 단지 '제너레이터 객체'를 만들고 반환합니다. 또한 제네레이터 함수의 코드는 next가 호출 될 때만 실행이 됩니다.

또한 위에서 repeater 함수를 보면 return이 아닌

yield로반환하는 것을 확인할 수 있는데 return문은 함수의 로컬 상태를 삭제하는 반면 yield는 함수를 일시 중단하고 로컬 상태를 유지시켜줍니다.

 

 

'Python > Python 개념' 카테고리의 다른 글

파이썬 클래스와 객체  (0) 2020.12.09
파이썬 파일 처리하기  (0) 2020.12.07
파이썬 자료구조(심화)-2  (0) 2020.09.17
파이썬 자료구조(심화)-1  (0) 2020.09.16
얕은 복사와 깊은 복사  (0) 2020.09.16

댓글