TIL #21 Python-Function Parameters

강경훈·2020년 8월 20일
0
post-thumbnail

python에서 함수를 사용 할 때 매개변수(parameter)을 사용하여 코드를 실행한다. (매개변수가 없을 수도 있음)
함수를 호출하여 매개변수를 넘겨 줄 때 주의해야 점이 몇가지 있다.

  • Positional Arguments: 함수에 정의된 keyword 순서대로 매개벼수를 입력
  • Keyword Arguments: 함수을 호출 할 때 keyword와 parameter을 같이 입력 (keyword = parameter)
    - 정의된 keyword의 순서와 상관없이 입력 가능
    • 가독성 증가

함수 인자들 사이의 우선 순위

  • 함수를 정의 할 때 인자들 사이의 절대적인 우선 순위가 있다. 이를 지키지 않고 정의 할 경우 Syntax error가 발생한다.
  • 우선순위

Regular Positional > Default > Variable Length Positional > Keyword-Only > Variable Length Keyword

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

def add(n1, n2=3):
	return n1 + n2
add(2)

위의 예제를 보면 n2가 default 값으로 3이 설정되어 있다. add(2)로 함수를 호출하면 n1=2, n2=3이 되어 5가 return 된다.

def add(n1=3, n2):
	return n1 + n2
add(2)

위의 예제는 n1=3으로 default 값이 정해져 있다. add(2)로 함수로 호출하게 되면 n1=2가 되고 n2에는 매개변수가 전해 지지 않아 함수가 실행되지 않는다.

default value parameter를 non-default value parameter 앞에 정의 되면 전달되는 매개변수의 수의 차이가 발생하게 되어 함수가 실행 되지 않는다.

2. variable length arguments(가변인수)

전달 받을 parameter의 수가 정해지지 않을 때 (*)을 붙혀 사용하고, 함수에는 tuple형태로 들어온다.

  • 잘 못된 예
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)

위의 코드를 실행하면 다음과 같은 error가 발생한다.

에러의 원인은 name = "정우성", *age = ("01012341234", "seoul", 20) 이 전달 되어 age에 전달될 parameter가 없기 때문이다.

  • 수정
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")

args와 age의 순서을 바꾸고, 함수 호출수 20을 2번째 인자로 넘겨주어 age = 20, age = ("01012341234", "seoul")으로 전달되게 하였다.

3. variable length keyword arguments(가변키워드인수)

전달 받을 parameter의 수가 정해지지 않을 때 (**)을 붙혀 사용하는데, 가변인수가 value만 넘겨주었다면 가변키워드인수는 keyword까지 넘겨주어 함수 내에서 dictionary로 동작한다.

  • 잘 못된 예
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", mobile="01012341234", address="seoul")

adress와 **kwargs의 위치를 바꾸어 에러를 해결 하였다.

4. 위치 인수와 키워드 가변 키워드 인수

  • 잘 못된 예
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")

1) default prameter가 non-default prameter보다 앞에 있음
2) address paramerter가 가변키워드인수보다 앞에 있음

위의 두 가지를 수정하면 코드가 정상적으로 실행된다.

  • 수정
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
방랑하는 개발자

0개의 댓글