TIL 10. Python - 함수 파라미터 순서

Byoungju Park·2021년 7월 9일
1
post-thumbnail
post-custom-banner

함수를 정의할 때 파라미터를 넣어줄 수 있고, 파라미터의 종류는 다양하다. 종류의 특징에 따라 파라미터 순서를 정해주어야 한다.

함수 파라미터의 순서
1. Position argument 위치 인수 name
우리가 주로 사용하는 기본 파라미터에 들어가는 값
2. Default value argument 기본값 인수 name = "python"
기본값을 넣어준 파라미터이다. 함수 호출 시 인자값을 입력하지 않으면 기본값을 불러와 출력해준다.
3. Variable length argument 가변 인수 *args
파라미터 값의 길이가 변화한다. 파라미터 앞에 *를 붙여 가변 인자를 정의할 수 있다. args는 argument의 약자로 관례적으로 사용한다. 다른 이름을 붙여줘도 무관하다.
4. Keword only argument 키워드 인수 imFunction(... age=20)
다른 인자들은 함수를 정의할 때 어떤 인자를 불러올 것인지 알 수 있다. 이와 다르게 키워드 인자는 함수를 호출할 때 구분할 수 있다. 인자와 함께 파라미터 이름을 같이 넣어주도록 한다. 파라미터 입력 우선 순위를 지킨다면 키워드 인자를 파라미터 순서와 다르게 입력하는 것도 가능하다.
5. Variable length keyword argument 가변 키워드 인수 **kwargs
가변 키워드 인자도 가변 인자와 마찬가지로 파라미터 키워드와 값의 길이가 변화한다. 따라서 그 개수가 정해지지 않는다. **를 붙이고 관례적으로 파라미터 이름을 kwargs로 붙인다.

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

A. 기본값 파라미터는 일반 파라미터 뒤에 입력해야 한다. 기본값 파라미터 - 일반 파라미터 순으로 정의하면 함수 호출 시 인수 개수가 파라미터와 같지 않을 때 에러가 발생된다.

def sum(num1=10, num2):
   return num1 + num2

sum(2) #num1= 2

위 함수는 num1과 num2, 2개의 파라미터를 설정하였고 num1의 기본값은 10으로 설정했다. sum 함수 호출 시 우리는 num2에 2를 인수로 넣어주었지만, 프로그램은 인수를 순서대로 받아오기 때문에 num1의 인수를 2로 넣어준다. 따라서 기본값 파라미터는 일반 파라미터 뒤에 입력해주어야 한다.

Q2. 위치 인수(positional arguments)와 가변 인수(variable length arguments)의 위치를 참고하여 아래 함수에서 어떤 에러가 발생 하는지 확인하고, 에러를 고쳐 정상적으로 출력해보자

<변경 전> TypeError 가 발생한다.

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)

가변 인수는 위치 인수와 다르게 인수 개수가 유동적이다. 본인 순서를 기준으로 뒤에 위치한 모든 인수들을 자신의 값으로 받아들인다. 따라서 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")

가변 인수 *args를 위치 인수 뒤에 입력하면 아래와 같이 정상 출력된다.

<출력 결과>
name=정우성
args=('01012341234', 'seoul')
age=20

Q3. 가변 키워드 인수 (variable length keyword arguments)의 위치를 참고하여 아래 함수에서 어떤 에러가 발생 하는지 확인하고, 에러를 고쳐 정상적으로 출력해보자

<변경 전> SyntaxError 가 발생한다.

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

<출력 결과>
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

Q4. 위치 인수와 가변 키워드 인수 (variable length keyword arguments)의 위치를 참고하여 아래 함수에서 어떤 에러가 발생 하는지 확인하고, 에러를 고쳐 정상적으로 출력해보자

<변경 전> SyntaxError 가 발생한다.

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

3번과 마찬가지로 함수 정의 시 이미 구문 오류가 발생한다. 파라미터를 순서에 맞게 작성하여야 한다.

<변경 후>

def mixed_params(age, name="아이유", *args, address=0, **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
wanna be good programmer
post-custom-banner

0개의 댓글