Python

Function Parameters

traveler_JH 2022. 7. 6. 23:32

1. 함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유

  • default value parameter :
  • 함수가 호출될때 파라미터에 인자를 받아 넘겨준다.
  • non-default value parameter :
  • 함수가 호출될때 파라미터에 인자를 받아 넘겨줄 수 도 있으며,
  • 인자를 넘겨주지 않아도 keywordname=value 형식으로 선언되어 있기 때문에 지정한 value 를 넘겨줄 수 있다.

예제
아래의 예제와 같이 number라는 함수가있고 my 와 your를 print 해준다.


위의 5번째줄을 보면 my = '1234','567'이라는 non-default value parameter를 받게 되고 SyntaxError: positional 이라는 에러가 생긴것을 볼수있다.
(바로 아래는 오타..)
하지만 9번째 줄을 보면 number(my = 1234, your = 5678) 일경우
non-default value parameter 형식으로 지정이 되어있더라도 keywordname = value 형식으로 지정이 되어있기 때문에 실행이 된다.
(number(your = 5678 , my = 1234)로 지정되어도 실행됨)
물론 마지막과 같이 default value parameter 로 작성을 해도 문제는 없다.
결론
-> 파이썬에서 파라미터를 받는 순서는 다음과 같다.

def example(a,b,c=None, r="w",d=[],ae,**ab)
a,b : positional parameter
c=none : optional parameter
r="w" : keyword parameter
d = [] : list parameter
ae : keyword-only
**ab : var-keyword parameter
파라미터를 정의하는 순서 없이 무작위로 생성 시 함수는 어떤 파라미터에 어떤 값을 받아야 될지 정할 수 없기 때문 이다.

이 순서를 지키지 않는다면 오류가 발생한다.

2.위치 인수(positional arguments)와 가변 인수(variable length arguments)의 위치를 참고 자료를 통해 조사해서 어떤 에러가 발생 하는지 확인하고, 에러를 고쳐 정상적으로 출력되는 결과

위치 인수란?
함수를 호출할때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미
가변인수란 무엇인가 ?
인수의 개수가 변할 수 있다느 의미이며, 가변인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미한다.
*arg를 사용을 사용하여 코드를 입력할땐 순서도 중요하다.

우선순위
1. 위치 인수 (default X)
2. 위치 인수 (default O)
3. / (위치 인수들 어딘가에 존재)
4. 위치 가변 인수 (*)
5. 키워드 전용 인수 (기본값 유무 상관 없음)
6. 키워드 전용 가변 인수 (**)

아래의 코드를 호출하면 오류가 발생한다.

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'

age값이 *arg값이랑 바뀌어서 정상 출력되지 않는다는 의미의 error가 발생한다.
아래와 같이age값과 *arg 값을 위치를 바꿔 호출하면 오류가 발생하지 않는다.

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")


위와 같이 정상 작동 되는 것을 확인할수있다.

3.가변 키워드 인수 (variable length keyword arguments)의 위치를 참고 자료를 통해 조사해서 어떤 에러가 발생 하는지 확인및 수정

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")


위와 같이 오류 발생

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", , address="seoul", mobile="01012341234")

위와 같이 parameter의 순서를 바꾼 뒤 argument의 순서를 지켜야 파이썬이 어느 부분이 가변 키워드 인수인지 확인이 가능하다.

위치 인수와 키워드 가변 키워드 인수 (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")

발생
발생 이유 :
parameter 가
(name="아이유", *args, age, **kwargs, address)
인데
argument가
(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
함수의 parameter 순서를 지켜 parameter 선언을 한 뒤 argument 전달 시에도 그 형식을 따라야 함으로

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", address="seoul", mobile="01012341234")

이렇게 변경하면 된다!