[Python] Pythonic Programming

1.Comprehension

List , Dictionary등을 빠르게 만드는 기법으로 for + append보다 속도가 빠르다. 

  • if 문을 넣어 원하는 요소만 추가 가능 
  • 겹 for 문 사용 가능 
  • 다차원 배열을 만들기에 매우 유용 (단, 최적화 할 때 사용 → 복잡해지면 가독성이 떨어지기 때문) 
evens = [ i for i in range(100) if i % 2 == 0 ] #if 조건이 들어간 comprehension
result = [(i,j) for i in range(5) for j in range(i)] #겹 for문

2.Generator

range 함수의 경우 숫자를 하나씩 생성하여 반환한다. 

이와 같이 요소를 하나씩 생성하여 반환하는 객체를 Generator라고 한다. 

  • function에서 yield를 사용할 시 Generator가 된다. 
  • yield 하는 위치에서 값을 반환한다. 
  • Sequence 전체를 생성하는 것이 아니므로 메모리 효율적이다. ( 필요 시마다 메모리에 올림)  
    • 따라서 매우 큰 데이터 셋을 처리할 땐 Generator 사용을 권장한다. 
  • Generator Comprehension 형태로 선언 가능하다. 
  • 필요시까지 계산을 늦춰주는 효과가 있다. → Lazy Evaluation  
    • 의도적으로 늦추고 싶은 구문을 yield 뒤에 선언하면 다시 호출하기 전까지 해당 연산을 지연시킬 수 있다. 

3.Built-in Functions 

  • zip 
    • 2개 이상의 순환 가능한 객체를 앞에서부터 한번에 접근할 때 사용 
    • Unpacking을 이용하여 2차원 리스트의 열 단위 접근 가능 
  • enumerate
    • For문이 Seq을 돌 때 index가 필요할 경우 사용 
    • List형태로 출력하기 위해서는 List 변환이 필요 

zip과 enumerate를 동시에 사용하는 등 여러 Generator을 한번에 사용할 수 있다. 

  • lambda function 
    • 함수의 이름없이 빠르게 만들 수 있는 익명함수 
    • lambda [param1],[param2],... : [expression] 형태로 사용 
    • 여러줄 쓸 수 없으며, 공식적으로 사용을 권장하지 않음 (문서화 미비, 이름이 존재하지 않는 함수 생성 등..) 

 

4.Higher-Order Function(HOF) , 고차함수

고차함수는 함수를 인자로 받거나 함수를 결과로 반환하는 함수이다. map() , filter(), reduce()는 고차함수로, 각각 iterable한 sequence를 변환, 필터링, 축약하는데 사용된다. 고차함수는 프로그램의 유연성을 크게 향상시킨다. 

  • map 
    • 각 요소에 function 함수를 적용하여 반환 
    • map([function],[iterable])

  • filter 
    • 각 요소에 function 함수를 적용하여 참이 나오는 것을 반환
    • filter([function] , [iterable]) 

 

  • reduce
    •  각 요소에 function 함수를 적용하여 실행 값을 누적시킨 결과를 반환 
    • reduce([function],[iterable])