Python Function Parameters

유동헌·2021년 3월 21일
0

1. 함수 기본

  • input parameter를 받아서 return 값output으로 return
  • 호출 시 parameter를 함수에 건내주어 호출(pass)
  • 함수의 parameter에는 크게 보면 4가지 형태가 존재

2. 함수 parameter의 4가지 형태

  1. Positional Argument

    def love_you(my_name, your_name):
        print(f"{my_name} likes {your_name}")
    love_you('유재석', '최준')
    
    # 출력
    # 유재석 likes 최준
    • my_name이라는 parameter 자리에 '유재석'이 위치하고, your_name이라는 자리에 '최준'이 위치한다(조금 더 개발자?스럽게 표현을 하고 싶은데.. 용어 정리가 안된다)
    • 함수 안의 parameter들이 순서대로 전해져 print 구문으로 반환된다.
    • 이때 주의를 해야할 점은 순서대로 반환이 된다는 점이다.
  1. Keyword Argument

    def love_you(my_name, your_name):
        print(f"{my_name} likes {your_name}")
    love_you(your_name='최준', my_name='유재석')
    
    # 출력
    # 유재석 likes 최준
    • 함수를 호출할 때 순서대로 parameter, 즉 인자(argument)를 정리하는 방법 외에 아예 순서 대신이 인자에 해당하는 값을 입력해 줄 수 있다. 이러한 방식을 사용하게 되면 순서를 지키지 않아도 된다.
    • 또한 입력할 인자의 값을 순서에 의지하지 않고 정확하게 표현해 줄 수 있어 1. Positional Argument의 방법보다는 가독성이 좋다고 한다.
  1. Mixing positional arguments and keyword arguments

    def love_you(my_name, your_name):
        print(f"{my_name} likes {your_name}")
    
    love_you('유재석', your_name='최준')
    
    # 출력
    # 유재석 likes 최준
    • 3번째 방법은 1번 방법과 2번 방법을 섞는 것이다.

    • 위의 코드에서 알 수 있듯이 my_name에 해당하는 '유재석' 부분은 그대로 Positional Argument로 호출하였고, 그 다음 '최준'이라는 인자는 Keyword Argument로 호출하였다.

    • 3번의 경우 수행 방법은 그렇게 어렵지도 않고 특별할 건 없어 보이는데.. 한 가지 매우 중요한 점으로 항상 Positional Argument방법을 사용하는 인자가 Keyword Argument를 사용하는 인자보다 앞 서 나와야 한다. 만약 이 둘의 위치가 제대로 지켜지지 않을 시 아래와 같은 오류가 발생한다.

      def love_you(my_name, your_name):
          print(f"{my_name} likes {your_name}")
      
      love_you(your_name='최준', '유재석')
      
      # 오류 출력
      positional argument follows keyword argument
      
      # 같은 말
      non-default argument follows default argument
  2. Parameter Default Value

    def love_you(my_name, your_name='최준'):
        print(f"{my_name} likes {your_name}")
    
    love_you('유재석')
    
    # 출력
    유재석 likes 최준
    • 4번째 방법은 함수의 parameter 자체에 default 값을 정의해 주는 것이다.
    • 위에서 보는 것처럼, default 값이 정의된 parameter는 함수를 호출할 때 따로 값을 넘기지 않아도 된다.
    • 3번 방법과 마찬가지로, Non-Default Argument를 항상 앞에 위치를 시켜야하고 그렇지 않을 경우 3번의 오류와 같은 예가 똑같이 발생한다.

3. 왜 Default value parameter를 Non-default value parameter보다 항상 뒤에 정의하여야 하는가?

  • 함수의 인자를 받는 위치의 맨 앞에 default argument가 있다면 혼란스러울 수 있다고 한다.
    • 화면 캡처 2021-03-21 201753
  • 아래 표에서 나오는 Variable Length Positional Arguments를 잘 모르겠다. 알아봐야 할 것 같다.

  • Python Function Definition, Arguments Kind and Order

4. 다양한 Augement에 대한 학습

  1. 중요한 것을 알게 되었다. 바로 위의 사진에서 표현된 건 Argument의 종류와 순서...(밑에 엄청 자세하게 나와 있었다..) 이걸 보고도 몰랐었다. 내용을 정리해 보자면 이렇다.

    • Regular Position Arguments - Default Arguments - Variable Length Positional Arguments - Keyword Only Argument(이 안에서는 조금 복잡하게 순서가 나뉘는 것 같다) - Variable Length Keyword Argument
    • 인자의 종류도 더 다양한다는 것을 알게 되었고, 컴퓨터가 해석하는 순서가 있고 이에 맞춰 작성을 해야 한다는 것을 알게 되었다.
    Variable Length Argument ?
    • 가변 매개 변수
    • parameter의 갯수가 정해지지 않았을 때 사용이 된다.
    • 사용 방법은 모른다. 뒤에서 나올 예제가 왜 안되는지, 간단하게 찾아본 정도다. 앞으로 알아봐야 한다. 
  1. 예제 풀이 1) Positional Argument / Variable Length Argument

    def func_param_with_var_args(name, *args, age):
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
    
    # 에러 출력
    # TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
    • 위의 코드를 실행하면 에러가 실행된다. 에러 코드의 missing 1 required keyword-only argument : age 이 부분에서 알 수 있듯이 age라는 required keyword argument(필수적인 인자? 이런 식으로 생각이 된다. 앞에 배운 keyword 인자는 아니지만..)가 오지 않아 에러가 나타났다고 생각이 되었다. 앞서 배운 순서를 적용하여 다시 코드를 실행 시켜 보면 에러가 사라지는 것을 확인할 수 있다.
    def func_param_with_var_args(name, age, *args):
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
    func_param_with_var_args("정우성", 20, "seoul", "01012341234")
    
    # 출력
    # name=정우성
    # args=('seoul', '01012341234')
    # age=20
    • args인자를 가장 뒤로 보냈다. name, age는 모두 positional Argument이기 때문에 가장 앞에 있어야 한다.
    • func_param_with_var_args() 함수를 실행하는 부분에 앞 부분 2개가 모두 positional Argument, 뒷 부분에서 seoul과 전화번호가 실행이 된다.
  1. 예제 풀이 2) Variable Length Keyword Argument

    def func_param_with_kwargs(name, age, **kwargs, address=0):
        print("name=",end=""), print(name)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
     
    func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
    
    # 오류 출력
    # invalid syntax
    • 문법적인 오류가 있다고 나오면서 에러가 발생한다. 위에서 살펴본 컴퓨터가 인자를 읽는 순위에 대해 다시 살펴보고, **kwargsVariable Length Keyword Argument 인자를 가장 뒤로 보내면 정상 작동한다.
    def func_param_with_kwargs(name, age, address=0, **kwargs):
        print("name=",end=""), print(name)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
     
    func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
    
    # 출력
    # name=정우성
    # age=20
    # kwargs={'mobile': '01012341234'}
    # address=seoul
    • Positional Argument / Keyword Only args with default / Variable Length Keyword Argument의 순서로 정리.
    • address의 경우 순서에 상관 없이 값이 지정되어 있어 알아서 찾아가는 모습을 볼 수 있다.
    • kwargs경우 dictionary로 반환이 되는 것을 알 수 있다. 추가 학습이 필요해 보인다.
  1. 예제 풀이 3) variable length keyword arguments

    def mixed_params(name="아이유", *args, age, **kwargs, address):
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
     
    mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    
    # 출력이 되지 않는다
    • 하나씩 뜯어서 살펴 보도록 하자.
      • name="아이유" : default value
      • *args : Variable Length Argument
      • age : Positional Argument
      • **kwargs : Variable Length Keyword Argument
      • address : keyword arguments
    • 이를 정리해보면, age - name="아이유" - *args - address - **kwargs 이런 순서가 되겠다. 그럼 이를 적용해 순서를 바꿔주면 정상 출력이 되는 것을 볼 수 있다.
    def mixed_params(age, name="아이유", *args, address, **kwargs):
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
     
    mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    
    # 출력
    # name=정우성
    # args=('01012341234', 'male')
    # age=20
    # kwargs={'mobile': '01012341234'}
    # address=seoul
    • ? name="아이유"이더라도 정우성으로 입력을 하면 정우성으로 나온다.
    • ? args = ( ) / kwargs = {}
profile
지뢰찾기 개발자

0개의 댓글