Function Parameters

riassuc·2021년 5월 13일
0

함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유에 대해 생각해보시고 블로깅 해주세요.

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

가변 키워드 인수 (variable length keyword arguments)의 위치를 참고 자료를 통해 조사해서 어떤 에러가 발생 하는지 확인하고, 에러를 고쳐 정상적으로 출력되는 결과를 블로그에 정리해 주세요.

위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치를 위치를 참고 자료를 통해 조사해서 어떤 에러가 발생 하는지 확인하고, 에러를 고쳐 정상적으로 출력되는 결과를 블로그에 정리해 주세요.

파라미터의 순서

파이썬 함수에는 파라미터를 받는 순서가 정해져 있다.

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

이다.

default value parameter가 기본값이 정해져 있을 뿐이지 값을 바꾸지 못하는 것은 아니다.

def add(a, b = 1):
    return a + b

add(2)    #a값만 2가 되면서 반환값은 3
add(2, 2) #b값이 2로 바뀌면서 반환값은 4

그래서 default value parameter를 non-default value parameter보다 앞에 두었을때 에러가 없이 잘 작동한다면 기본값을 설정해놓은게 무색하게 매번 인자를 2개 주어야 한다.

def add(a = 1, b):
    return a + b

add(2)    #b값을 2로 주려는 의도, 하지만 a값이 2가 되고 b값이 없어서 에러
add(2, 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)
#실행결과
#TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
#파라미터 순서가 잘못되어서 에러가 남



#올바른 코드
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
#파라미터 순서를 수정해서 해결

#잘못된 코드
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")
#실행결과
#syntax 에러가 뜸
#**kwargs는 사실상 함수의 인자 중 가장 마지막으로 오는 인자, 따라서 뒤에 다른 인자가 붙으면 안 됌



#올바른 코드
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
#파라미터 순서를 수정해서 해결

#잘못된 코드
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")
#실행결과
#syntax 에러가 뜸
#**kwargs는 사실상 함수의 인자 중 가장 마지막으로 오는 인자, 따라서 뒤에 다른 인자가 붙으면 안 됌
#그리고 address는 값을 정해서 호출하고 있기 때문에 *args이후 **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")

profile
riassuc

0개의 댓글