Corgi Dog Bark

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Efficient Python 22. 변수위치 인자(*Args) 사용법
    뜯고 또 뜯어보는 컴퓨터/파이썬 (Python) 2021. 7. 30. 01:03
    반응형
    • 파이썬 뿐 아니라 다른 언어에서도 함수의 위치인자(positional argument)를 가변적으로 받을 수 있으면, 함수 호출이 더욱 깔끔해진다.이를 가변인자(varargs)나 스타인자(star args)라고 부르기도 한다.
    • 예를 들어 디버깅정보를 로그로 남기는 함수를 구현해볼때 인자수가 고정돼 있으면 메시지와 같이 list값을 받는 함수가 필요하다.
    def log(message,values):
        if not values:
            print(message)
        else:
            values_str = ",".join(str(x) for x in values)
            print(f'{message}: {values_str}')
            
    log("내숫자는",[1,2])
    log("안녕",[])
    더보기

    내숫자는: 1,2

    안녕

    • 이때, 빈 리스트를 넘기는 것은 코드에 잡음도 많고, 깔끔하지도 않기에 완전히 생략하면 좋을 것이다. 따라서, *args 를 사용하여, 위치인자를 넘겨보자.
    def log(message, *values):
        if not values:
            print(message)
        else:
            values_str = ",".join(str(x) for x in values)
            print(f'{message}: {values_str}')
            
    log("내숫자는",1,2)
    log("안녕")
    더보기

    내숫자는: 1,2

    안녕

     

    • 파이썬 에서 *연산자는 시퀀스의 원소들을 함수의 위치 인자로 넘길 것을 명령한다.
    favorites = [7,33,99]
    log("좋아하는 숫자는", *favorites)
    더보기

    좋아하는 숫자는: 7,33,99

    • 하지만 *args 를 썻을때 치명적 단점 2가지가 있는데, 알아보자.
    1. 만약 제너레이터 앞에 *를 붙였을시, 함수를 지속적으로 불러와 memory leak 이 발생가능성이 농후하다.
    2. 인자를 추가하게 되었을 시, 함수 전체를 바꿔줘야 하는 부분이 생긴다.
    #  제너레이터 앞에 *를 붙였을시
    def my_generator():
        for i in range(10):
            yield i
    
    def my_func(*args):
        print(args)
    
    it = my_generator()
    my_func(*it)
    # 인자를 추가했을시, 함수 전체를 바꿔줘야 할때,
    
    def log(sequence, message, *values):
        if not values:
            print(f"{sequence} - {message}")
        else:
            values_str = ",".join(str(x) for x in values)
            print(f"{sequence} - {message}: {values_str}")
            
    log(1,"좋아하는 숫자는",7,33) # ---> 새 코드에서 가변인자 사용 
    log("좋아하는 숫자는",7,33) # ---> 기존의 코드 양식은 깨지게 된다.

     

    반응형

    댓글

Designed by Tistory.