KalelPark's LAB

[ CLEAN CODE ] Comparison, Generator? 본문

Python/CLEAN CODE

[ CLEAN CODE ] Comparison, Generator?

kalelpark 2023. 3. 15. 10:50
 

Comparison, Generator

   Comparison을 사용하면, 타입을 간결하게 이터레이션하면서 원소로부터 파생되는 데이터 구조를 생성할 수 있습니다.

   Comparison은 Generator로 확장하는 것이 가능합니다.

 

   Generator는 성능을 향상시키고, 메모리 사용량을 줄이고, 코드의 가독성을 향상시킬 수 있습니다.

 

list comparision을 사용하는 경우, map과 filter를 사용하는 대신에, list에서 바로 생성하는 것이 좋습니다.

alt = map(lambda x : x ** 2, a)   # don't use

even_square = [x ** 2 for x in a if x % 2 == 0] # using list comparison
print(even_sqaure)

Sequence 결과를 만들어내는 함수를 만들 때, 가장 간단한 선택은 원소들이 모인 리스트를 반환하는 것입니다.

예를 들면 문자열에서 찾은 단어의 인덱스를 반환하고 싶다면 append 메소드를 사용해 리스트에 결과를 추가하고 마지막에 리스트를

반환하는 것이 좋습니다.

 

아래의 코드의 단점은

   1. 코드에 잡음이 많고 핵심을 알아보기 어려움

   2. 메서드 호출의 덩어리가 너무 크기 때문에, result 부분의 중요성이 희석됩니다.

def index_words(text):
    result = []
    if text:
        result.append(0)
    for index, letter in enumerate(text):
        if letter == " ":
            result.append(index + 1)
    
    return result

이러한 함수를 개선하기 위해, Generator를 사용하는 것입니다.

yield 키워드는 결과값을 여러 번 나누어서 제공한다는 점에서 의미가 있습니다. 

def index_words_iter(text):
	if text:
    	yield 0
    for index, letter in enumerate(text):
    	if letter == " ":
        	yield index + 1

이후 불러올 때, 리스트와 함께 사용하면 코드가 훨씬 간결하고 이해하기 훨씬 편리합니다.

result = list(index_words_iter(address))
print(result[:10])

제너레이터를 사용하면 결과를 리스트에 합쳐서 반환하는 것보다 더 깔끔합니다.

제너레이터를 반환하는 이터레이터는 제너레이터 함수의 본문에서 yeild가 반환되는 값들로 이뤄진 내용들을 만듭니다.

Comments