파이썬의 중요 특징(클로저함수, 장식자, 생성기, 코루틴)

2015. 2. 9. 17:16·python

@클로저함수
함수안에 또다른 함수가 선언되어 반환되는 것을 클로저 함수라고 한다.
- 전역변수를 사용하지 않음
- 내부 데이터의 은닉에 활용

 

<참조>

http://jonnung.blogspot.kr/2014/09/python-easy-closure.html
http://nbviewer.ipython.org/github/jonnung/book-review/blob/master/core_python_study/closure/python_closure.ipynb 

 

 

 

@장식자 - 데코레이터
데코레이터의 개념은 일종의 래핑(wrapping) 함수
실행되는 함수를 파라미터로 받아서 실행되는 함수

 

 

 #!/usr/bin/python
# -*- coding: utf-8 -*-
import time

def elapsed_time(functor):
   
    def decorated(*args, **kwargs):
        start = time.time()
        functor(args, kwargs)
        end = time.time()
       
        print "Elasped time : %f" %(end - start)
       
    return decorated

@elapsed_time
def print_hello(*args, **kwargs):
    print "hello"
   
   
print_hello()

 

<참조>

http://pyengine.blogspot.kr/2011/07/python-decorator.html
http://legacy-wiki.dgoon.net/doku.php?id=python:decorator 

 

 

@생성기와 yield

yield 를 이용하여 데이터를 반환
생성 시점에 호출되지 않음
for 문이나 next() 가 호출되었을 때 실제 사용됨
파일읽기등에 사용하면 메모리를 효율적으로 사용할 수 있음

 

 

 def read_in_chunks(file_object, chunk_size=102400):
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data

 

f = open(file_url, 'rb')
for line in read_in_chunks(f):
    print line

 

 

@코루틴과 yield

코루틴을 장식자로 선언
장식자는 코루틴을 선언할 경우 자동으로 next 를 호출해주는 역활을 한다.
(코루틴은 선언하고 next()를 호출해 주어야 사용 가능한 상태가 된다. )
yield 를 단독으로 사용하여 데이터를 입력받는 용도로 사용

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
def coroutine(func):          
    def start(*args, **kwargs):        
        cr = func(*args, **kwargs)        
        cr.next()        
        return cr          
    return start    

# Example use
if __name__ == '__main__':    
   
    @coroutine   
    def grep(pattern):        
        print "Looking for %s" % pattern        
       
        while True:            
            line = (yield)            
            if pattern in line:                
                print line,      
   
    g = grep("python")    
               
    # Notice how you don't need a next() call here    
    g.send("Yeah, but no, but yeah, but no")    
    g.send("A series of tubes")    
    g.send("python generators rock!")   

 

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import fnmatch
import gzip, bz2, sys

def coroutine(func):          
    def start(*args, **kwargs):        
        cr = func(*args, **kwargs)        
        cr.next()        
        return cr          
    return start    

@coroutine
def find_files(target):
    while True:
        topdir, pattern = (yield)
        for path, dirname, filelist in os.walk(topdir):
            for name in filelist:
                if fnmatch.fnmatch(name, pattern):
                    target.send(os.path.join(path, name))

@coroutine
def opener(target):
    while True:
        name = (yield)
       
        if name.endswith(".gz"):
            f = gzip.open(name)
        elif name.endswith(".bz2"):
            f = bz2.BZ2File(name)
        else:
            f = open(name)
           
        target.send(f)
       
@coroutine
def cat(target):
    while True:
        f = (yield)
        for line in f:
            target.send(line)
           
@coroutine
def grep(pattern, target):
    while True:
        line = (yield)
        if pattern in line:
            target.send(line)
           
@coroutine
def printer():
    while True:
        line = (yield)
        sys.stdout.write(line) 

 

 

 

@생성기 표현식

list1 = [ i for i in a]
list2 = ( i for i in a)

 

소괄호를 이용하면 생성기가 됨
for 문 처리 시점에 데이터를 순차적으로 생성함

 

 


반응형
저작자표시 비영리 (새창열림)

'python' 카테고리의 다른 글

[python] 문자열 치환 방법  (0) 2015.06.12
[python] subprocess 모듈을 이용한 명령어 실행  (1) 2015.06.11
[python][xlswriter] xlsxwriter 의 메모리 점유해제를 위한 constant_memory 모드 설정  (0) 2015.02.04
[파이선2] 파이선2의 한글 인코딩 비교하기  (2) 2015.01.12
Python 에 한글 입력하기  (0) 2015.01.09
'python' 카테고리의 다른 글
  • [python] 문자열 치환 방법
  • [python] subprocess 모듈을 이용한 명령어 실행
  • [python][xlswriter] xlsxwriter 의 메모리 점유해제를 위한 constant_memory 모드 설정
  • [파이선2] 파이선2의 한글 인코딩 비교하기
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    AWS
    HIVE
    알고리즘
    Hadoop
    오류
    ubuntu
    yarn
    다이나믹
    Tez
    Python
    build
    bash
    airflow
    파이썬
    nodejs
    하둡
    oozie
    Linux
    백준
    S3
    mysql
    정올
    HDFS
    하이브
    emr
    SPARK
    java
    hbase
    k8s
    error
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
파이썬의 중요 특징(클로저함수, 장식자, 생성기, 코루틴)
상단으로

티스토리툴바