함수 Parameter와 Argument

Junyoung Lee·2021년 6월 9일
0

Python

목록 보기
4/6


이번에는 Python의 함수 ParameterArgument에 대해 작성 해 보고자 한다


Parameter와 Argument는 뭘까?

Parameter는 함수가 받는 변수 - 매개변수
Argument는 함수에 실제로 들어가는 값 - 인자

def add(a, b): # 함수가 받는 변수 a, b가 Parameter
    return a + b 

add(1, 2) # a, b자리에 들어간 숫자 1, 2가 Argument

함수 Parameter에서의 arguments 처리 순서

함수가 argument를 받을 때의 처리 순서를 아래에서 확인해 보자

  1. Regular Positional Arguments

    순서대로 넣으면 되지만 순서를 다르게 넣는다면 잘못된 출력이 될 수 있음

  2. Default Arguments

    함수를 호출할 때 인자의 값을 설정하지 않아도 기본값이 할당되도록 할 수 있음

  3. Variable Length Positional Arguments (*args)

    변수의 개수를 동적으로 받아 올 수 있으며 입력된 값을 tuple로 받아온다

  4. Keyword-Only Arguments

    Non-Default Keyword-Only Arguments (Default값이 없고 Keyword와 함께 호출되어야 함)Keyword-Only Arguments With Defaults (Default값이 있어서 Keyword가 호출되지 않아도 Error가 발생하지 않음)가 있다
    위치 기반으로는 전달될 수 없고 키워드로만 전달 가능하다!

  5. Variable Length Keyword Arguments (**kwargs)

    *args와 기능은 비슷하지만 값을 dictionary로 받아온다

아래 몇 가지 의문점, 예제를 통해 좀 더 확실하게 이해해 보자!


예시 몇 가지

1. Default 값이 있는 parameter를 Default값이 없는 parameter앞에 정의하면 안되는 이유가 뭘까? 단순히 순서를 그렇게 해야하기 때문일까?

아래의 예시를 확인해보자!

def time(hour = 3, minite, second):
    print(hour, minite, second)

time(5, 21)

# SyntaxError: non-default argument follows default argument

Default값이 있는 parameter가 있다면 argumentsparameter보다 적게 적어서 호출하게 되는데 위의 경우를 보면 5hour에 들어가야할지 minite에 들어가야 할 지 선택할 수 있지 않기 때문에 에러가 발생한다!

def time(hour = 3, minite = 21, second):
    print(hour, minite, second)
   
time(59)

이런 경우에도 마찬가지로 59가 어느 parameter에 들어가야 할 지 interpreter가 선택할 수 없어 SyntaxError가 발생한다!

올바른 순서로 수정 된 아래 예시를 보자!

def time(hour, minite , second = 59):
    print(hour, minite, second)
   
time(5, 21)

위 코드처럼 해줘야 arguments들이 순서대로 parameter에 들어가고 그 뒤의 Default 값이 있는 parameter는 따로 argument를 주지 않아도 자동으로 출력된다!

argument 개수를 최소한 Default값이 없는 parameter 개수 이상으로 줘야 함수를 호출해도 모든 parameter에 값이 할당되어 있기 때문에 에러가 없다!


2. Positional Arguments와 Variable Length Arguments

아래 예시를 확인해보자!

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)

# func_param_with_var_args() missing 1 required keyword-only argument: 'age'

ageRegular Positional Argument로 간주하고 parameterage위치를 *args앞으로, 호출 부분에서의 20"01012341234"의 앞으로 옮긴다면 해결이 가능하다!

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

에러가 발생한 예시 - func_param_with_var_args() missing 1 required keyword-only argument: 'age'- 대로 해결하려면 agekeyword-only argument로 간주하여 parameter순서를 변경하지 않고 age = 20와 같이 값을 줘서 호출해도 정상적으로 출력 가능하다!


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

# SyntaxError: invalid syntax

**kwargsVariable Length Keyword Arguments기 때문에 함수를 정의할 때 제일 마지막 parameter에 있지 않아서 오류가 난다.

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

# name=정우성
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul

parameter 순서를 바꿔주니 정상적으로 출력된다!


4. Positional Arguments 와 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")

# SyntaxError: invalid syntax

상단의 처리 순서를 확인하고 이 코드를 확인해보면 무언가 잘못 된 부분들을 확인할 수 있다!

일단 첫 번째로 보이는 것은 name='아이유' 부분인데 함수 호출부분에 20이 가장 앞에 있고 Default Arguments가 가장 앞에 올 수 없으므로 age를 맨 앞으로 이동해 봤다!

def mixed_params(age, name="아이유", *args, **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")

# SyntaxError: invalid syntax

수정을 진행했는데도 에러가 발생하는 이유는 3번 예시에서 해결 해 봤듯이 **kwargs가 가장 뒤 쪽에 있어야 하는데 현재 Keyword-Only 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", mobile="01012341234", address="seoul")

# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul

최종적으로 수정을 해 줬더니 출력이 정상적으로 되는 것을 확인 할 수 있었다!


ref.
https://naon.me/posts/til18
https://getkt.com/blog/python-keyword-only-arguments/
https://livetodaykono.tistory.com/18
https://www.python.org/dev/peps/pep-3102/
https://elvanov.com/304

profile
🎹재즈를 사랑하는 백엔드 개발자 이준영입니다🎷

0개의 댓글