파이썬 다운 반복문
파이썬 답지 않게 처리하기
먼저 파이썬의 반복문을 C언어나 자바를 사용한 사람들은 다음과 같이 사용하는 것을 확인할 수 있습니다.
data = [1,2,3,4,5]
i = 0
while i<len(data):
print(data[i])
i+=1
# 출력 값
# 1
# 2
# 3
# 4
# 5
먼저 이코드가 파이썬 답지 않는 이유는 무엇일까요?
- 수동으로 인덱스i를 0으로 초기화하고 반복마다 인덱스를 신중하게 증가시킵니다.
- 얼마나 반복할지를 결정하기 위해 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클래스에 대해서 설명하겠습니다.
- _ _ init _ _ 메서드에서 Repeater 객체에 각 RepeaterIterator 인스턴스를 연결합니다. 그렇게 하면 반복될 '소스' 객체를 유지할 수 있습니다.
- 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 |
댓글