티스토리 뷰

목차

    반응형

    함수 (def)

    PYTHON - def 함수 문법 예제PYTHON - def 함수 문법 예제


    def 문을 사용하여 함수(function)를 정의할 수 있습니다. 아래 파이썬 예제에서는 x, y라는 두 인수를 받아, 합계를 표시하는 함수 add()를 정의하고 호출합니다.


    1
    2
    3
    4
    def add(x, y):
        print x + y
     
    add(35)        #=> 8
    cs


    return은 함수의 반환값을 지정합니다. return 문을 생략하면 파이썬 함수는 None을 반환합니다.


    1
    2
    3
    4
    5
    6
    def add(x, y):
        ans = x + y
        return ans
     
    = add(35)
    print n         #=> 8
    cs


    아래와 같이 키워드가 첨부된 인수를 지정할 수 있습니다. 키워드가 붙은 인수는 함수를 정의할 때 기본값을 지정할 수 있습니다.


    1
    2
    3
    4
    5
    6
    def repeat_msg(msg, repeat=3):
        for i in range(repeat):
            print msg
     
    repeat_msg('Hello')            # Hello, Hello, Hello
    repeat_msg('Yahho'repeat=5)  # Yahho, Yahho, Yahho, Yahho, Yahho
    cs

    파이썬 팁

    *name은 순서대로 인수를 받고, **name은 인수를 딕셔너리(Dictionary 사전) 형태로 받습니다.


    1
    2
    3
    4
    5
    6
    7
    def func(a1, a2, *args**params):
        print a1             #=> A
        print a2             #=> B
        print args           #=> ('C', 'D')
        print params         #=> {'k1': 'K1', 'k2': 'K2'}
     
    func('A''B''C''D', k1='K1', k2='K2')
    cs


    args 및 params를 변수로 전달할 경우, 호출측에선 *와 **을 붙입니다.


    1
    2
    3
    args = ('C''D')
    params = {'k1''K1''k2''K2'}
    func('A''B'*args**params#=> A, B, ('C', 'D'), {'k1': 'K1', 'k2': 'K2'}
    cs


    함수는 여러값(복수)을 반환할 수 있습니다.


    1
    2
    3
    4
    5
    def func():
        return 3"ABC"
     
    n, s = func()
    print n, s           #=> 3 ABC
    cs


    함수 정의의 시작 부분에는 """..."""를 이용해 함수를 설명하는 파이썬 문서를 작성할 수 있습니다.


    1
    2
    3
    def func(x, y):
        """A sample function"""
        return x + y
    cs


    전역변수(global)

    PYTHON - global 함수 문법 예제PYTHON - global 함수 문법 예제


    함수의 외부에 정의된 변수가 전역변수입니다. 함수에서 전역 변수를 참조할 순 있지만 할당할 순 없습니다. 대입할 경우에는 global로 선언해야 합니다.


    1
    2
    3
    4
    5
    6
    count = 0           # 글로벌 변수
     
    def func():
        print count     # 참조할 수 있음
        global count    # global로 선언해 주면
        count += 1      # 대입할 수 있음
    cs


    globals()는 전역변수, locals()는 로컬 변수 목록을 파이썬 딕셔너리로 반환합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    def func():
        for k in globals().keys():
            print "GLOBAL: %s = %s" % (k, globals()[k])
     
        for k in locals().keys():
            print "LOCAL: %s = %s" % (k, locals()[k])
     
    func()
    cs

    람다식 (lambda)

    PYTHON - 람다(lambda) 함수 문법 예제PYTHON - 람다(lambda) 함수 문법 예제


    람다 (lambda) 표현식은 이름 없는 작은 함수를 정의합니다. 람다식 자체는 식으로 취급되므로 함수의 인수로도 사용할 수 있습니다.


    1
    2
    myfunc = lambda x, y: x + y
    print myfunc(35)             #=> 8
    cs


    파이썬에서 lambda는 sorted(), map(), filter() 등의 함수에 전달하는 무명함수로 이용되기도 합니다.


    1
    2
    = [123]
    print map(lambda x: x ** 2, a)    #=> [1, 4, 9]
    cs


    이터레이터 (iterator)

    이터레이터는 for문에서 사용 가능한 반복 기능을 가진 객체입니다. 이터레이터 객체는 __iter__()로 next() 메소드를 가지는 객체를 반환하고 next() 메소드는 다음의 요소를 반환합니다. 마지막에 도달하면 StopIteration 예외를 반환합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class MyClass:
        def __init__(self):
            self.data = (12345)
            self.index = 0
     
        def __iter__(self):
            return self
     
        def next(self):
            if self.index < len(self.data):
                self.index += 1
                return self.data[self.index - 1]
            else:
                raise StopIteration
     
    for n in MyClass():
        print n              #=> 1, 2, 3, 4, 5
    cs


    for문 마지막 작업은 아래와 똑같습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    it = MyClass().__iter__()
     
    while 1:
        n = it.next()
     
        try:
            print n          #=> 1, 2, 3, 4, 5
        except StopIteration:
            break
    cs

    제너레이터 (yield)

    PYTHON - yield 함수 문법 예제PYTHON - yield 함수 문법 예제


    yield이터레이터를 반환하는 제너레이터를 정의할 때 사용됩니다. 우선 yield를 사용하지 않는 파이썬 예제를 살펴보겠습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def funcA(list):
        ret = []
     
        for n in list:
            ret.append(n * 2)
     
        return ret
     
    for n in funcA([12345]):
        print n                  #=> 2, 4, 6, 8, 10
    cs


    yield를 이용한 이터레이터 사용 방식으로 변경하면 아래와 같습니다.


    실행 결과에는 변함이 없지만, funcA()가 [2, 4, 6, 8, 10]이란 리스트를 반환하는 반면 funcB()는 이터레이터 객체를 반환합니다.


    이터레이터의 경우, 값이 참조될 때마다 다음 값이 계산되고 반환됩니다.


    이 파이썬 예제에서는 5개 정도의 리스트이므로 퍼포먼스(성능) 차이는 없습니다.


    그러나, list가 100만개라면 funcA() 함수를 호출한 시점에 100만개의 list가 생성되지만, 이터레이터의 funcB()의 경우 사용했을 때에만 다음 값을 계산하므로, 메모리 및 처리 효율이 개선됩니다.


    1
    2
    3
    4
    5
    6
    def funcB(list):
        for n in list:
            yield n * 2
     
    for n in funcB([12345]):
        print n                  #=> 2, 4, 6, 8, 10
    cs


    파이썬 예제를 좀 더 살펴보겠습니다. 아래는 파일을 읽고 __END__가 나타날 때까지 줄을 출력하는 프로그램 소스 코드입니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def readfileA(f):
        lines = []
     
        for line in f:
            lines.append(line.rstrip())
     
        return lines
     
    = open("test.txt")
     
    for line in readfileA(f):
        if (line == "__END__"):
            break
     
        print line
     
    f.close()
    cs


    yield를 활용한 이터레이터를 사용방법은 아래와 같습니다.


    위의 파이썬 예제에선 파일을 모두 읽고 메모리로 로드하지만, 반복자를 사용한 예제에서는 한 줄(1행)의 메모리만 사용하여 __END__가 왔을 때 나머지를 건너뛰어 읽기 작업을 종료할 수 있습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def readfileB(f):
        for line in f:
            yield line.rstrip()
     
    = open("test.txt")
     
    for line in readfileB(f):
        if (line == "__END__"):
            break
     
        print line
     
    f.close()
    cs

    데코레이터 (@)

    PYTHON - 데코레이터 @ 함수 문법 예제PYTHON - 데코레이터 @ 함수 문법 예제


    함수를 실행 전과 후에 특수한 처리를 수행하려면 @ 데코레이터를 사용합니다. 아래 파이썬 예제에서는 hello() 함수를 mydecolater로 데코레이터(장식)합니다. 데코레이터 함수는 실행 전에 start, 함수 실행 후 end를 출력합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def mydecolater(func):        # 데코레이터 정의
        def wrapper():
            print "start"         # 전처리 실행
            func()                # 데코레이터 대상 함수 실행
            print "end"           # 후처리 실행
        return wrapper
     
    @mydecolater
     
    def hello():
        print "hello"
     
    hello()                       #=> start, hello, end
    cs


    아래는 데코레이터를 좀 더 범용적으로 사용한 예제입니다. 대상 함수에 @decolater로 설정함으로써, 함수의 인수나 반환값을 표시합니다. wraps()는 대상 함수의 함수 이름이나 문서 문자열(__doc__)을 유지하기 위해 호출합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    def mydecolater(func):
        import functools
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print "Funcname:", func.__name__
            print "Arguments:", args
            print "Keywords:", kwargs
            ret = func(*args, **kwargs)
            print "Return:", ret
            return ret
        return wrapper
     
    @mydecolater
    def func(msg1, msg2, flag=1, mode=2):
        """A sample function"""
        print "----", msg1, msg2, "----"
        return 1234
     
    = func("Hello""Hello2", flag=1)
    print n
     
    print repr(func)
    print func.__doc__
    cs




    파이썬 입문 강좌 11강


    관련 글

    [파이썬 입문] 연산자 - 산술 비트 대입 비교 논리 조건

    구문 - 문법, 주석, 들여쓰기, 인코딩 규칙

    [파이썬 입문] with assert pass del print exec 사용법

    [파이썬 입문] 제어문 - if else while for in break continue

    리스트 튜플 딕셔너리 (List, Tuple, dict)

    변수, 상수, 문서문자열(python docstring)

    반응형