[TIL] Function Parameters

min00young·2020년 10월 27일
0

Function Parameters

  • 함수정의할때 전달되는 요소

Keyword Arguments

  • 키워드 아규먼트 방식으로 파라미터값을 전달해줄때 장점
  1. 순서가 바뀌어도 괜찮음
  2. 가독성이 높아짐

Mixing positional arguments and keyword arguments

  • 순서에 맞추어서 파라미터값을 전달해주는 positional argument
  • 순서에 맞추지 않는 non-positional argument (= keyword arguments?)
  • 같이 혼용해서 사용가능하지만.. 순서를 지켜줘야 함(예제참고)

Parameter Default Value

  • 함수를 정의할때, 파라미터값에 default값을 정의해줄수있음
  • 함수호출시 아규먼트를 입력하지않는다면, default값으로 호출
  • 주의할점
    default값이 정의된 파라미터가 dafault값이 정의되지않은것보다 앞에 있으면 안됨

Assignment

  1. default value parameter를 non-default value parameter 앞에 정의하면 안되는 이유
    --> 파라미터를 정의할때, 순서없이 무작위로 생성하면 함수가 어떤 파라미터에 어떤 값을 받아야할지 정할수없기때문에..

  2. 아래코드가 에러메시지 없이 진행되도록 수정하기

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)
  • 에러메시지
Traceback (most recent call last):
  File "python", line 7, in <module>
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
  • 에러이유
    에러메시지를 읽어보면, 필요한 아규먼트가 없다고 하면서 age 파라미터에 해당하는것이 없다고 한다.
    파이썬입장에서는 *args를 통해서 받게되는 arguments들이 어디가 마지막인지 알수없기에 받게되는 아규먼트를 모두 *args로 받게된다.
    그래서 마지막에 넣은 20이 age 파라미터에 해당하는 아규먼트인지 인식하기가 어렵다.

  • 해결방법
    age파라미터와 *args 파라미터의 순서를 바꾸고, 호출시에도 순서를 바꾼다.

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, "01012341234", "seoul")
  • 출력값
name=정우성
args=('01012341234', 'seoul')
age=20
  1. 아래코드가 에러메시지 없이 진행되도록 수정하기
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")
  • 에러메시지
Traceback (most recent call last):
  File "python", line 1
    def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^
SyntaxError: invalid syntax
  • 에러이유
    함수정의에서 문법에 맞지않다고 나온다. 아마도 **kwargs 파라미터의 위치가 중간에 위치한것이 문제가 된것 같다.

  • 해결방법
    **kwargs 파라미터를 순서상으로 마지막에 위치시킴으로써 문제해결이 가능하다.

def exam2(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)

exam2("정우성", "20", mobile="01012341234", address="seoul")
  • 출력값
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
  1. 아래코드가 에러메시지 없이 진행되도록 수정하기
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")
  • 에러메시지
Traceback (most recent call last):
  File "python", line 1
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
SyntaxError: invalid syntax
  • 해결방법
    함수 파라미터의 순서를 다시 정의를 해줘야 한다.
    함수호출시, 처음에 나이에 대한 age가 먼저 나오고
    이름에 해당하는 name="아이유"가 다음에 나온다.
    그다음에 나오는 숫자와 male에 대한 정보는 *args로 받고
    값이 지정된 address가 파라미터 순서상 **kwargs보다 앞에 나와야 함수가 argument 부족에 대한 오류를 막을수있다.
    마지막에 **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
profile
개발공부를 하면서 배우고 경험하고 앞으로 알아가야할것들에 대해서 정리하고 있습니다 🙂

0개의 댓글