Function Arguments 개념 정복

python funtion에서 사용되는 arguments와 parameter에 대해 이해해보도록 하겠습니다. Funtion의 code를 보면 대략 어떻게 적용되는지 알 것 같은데 상세하게 들어가면 용어가 많고 입출력 원리 등을 이해하는게 어려웠습니다.

하나씩 살펴보도록 할게요.

우선 가장 큰 개념인 Arguments와 Parameter는 유사하지만 의미가 좀 달라요.

  • Arguemnts(인수/인자/전달인자) : 함수와 메서드의 입력 값(Value)
  • Parameter(매개 변수 or 파라미터) : 함수와 메서드의 입력 변수(Variable) 명

간단한 코드로 보여드릴게요.

def plus(a, b):
    print(a + b)
    
plus(3,4)

여기서 a, b(변수)는 parameter이고 3, 4(값)는 arguments 입니다.

자, 이제 복잡한 Arguments의 전체 구조에 대해 알아보려고 합니다.
Arguments를 완전히 이해하기 위해선 이 사진을 반드시 이해해야 해요.
되게 복잡해 보이는데 이해하고 나면 되게 잘 정리했다는 느낌을 받으실 거에요.

arguments

자, 우선 Arguments는 크게 2가지로 나뉩니다.
Positional arguments 영역과 Keyword-only Arguments 영역입니다.
(영역이라는 말은 잘 안쓰나 이해를 위해 썼습니다.)

Positional arguments(위치 인수)

위치가 설정된 인수를 포괄적인 의미를 뜻합니다.  

Default Arguemnts는 Positional에 기반하여 함수를 호출하기 때문에 Regular Positional Arguments 앞에 위치 할 수 없습니다. 

위 그림에서 첫 번째 인수부터 Variable Length Positional Arguments까지에 해당됩니다.
- Regular Positional Arguments (기본값이 없는 위치 인수)
- Default Arguments (기본값이 있는 위치 인수)
- Variable Length Positional Arguments(가변 위치 인수) (feat. *args) 


Keyword-only Arguments (키워드 전용 인수)

오직 keyword로만 함수를 호출할 수 있는 인수의 포괄적인 의미로 Non-default Keyword-only Arguments, Default Keyword-only Arguments, Variable Length Keyword Arguments 등의 개념을 뜻합니다.  

Default Keyword-only Arguments는 Keyword를 기반으로 함수를 호출을 하기 때문에 Non-Default Keyword-only Arguments 과 순서가 바뀌어도 상관없습니다.  

위 그림에서 Variable Length Positional Arguments부터 마지막까지 해당됩니다.
- Non-default Keyword-only Arguments (기본값이 없는 키워드 전용 인수)
- Default Keyword-only Arguments (기본값이 있는 키워드 전용 인수)
- Variable Length Keyword Arguments(가변 키워드 인수) (feat. **kwargs)



바로 예제를 통해 알아봅시다.

예제 1)

def text(age="25", name):
    print(age)
    print(name)
    
text("tomas")

에러내용
SyntaxError: non-default argument follows default argument


에러 내용을 보면 non-default argument(name)가 default argument에 자리에 있어서 에러가 난 것을 확인할 수 있습니다.

코드를 고쳐보겠습니다.

def text(name, age="25"):
    print(age)
    print(name)
    
text("tomas")

코드 결과값
25
tomas

Default Arguments Regular Positional Arguments 뒤로 위치하니 정상적으로 출력되는 것을 볼 수 있습니다.



여러가지 예제를 더 작성하겠습니다.


예제 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)

여기서 발생되는 에러는 age가 *args 뒤로 간 것입니다.
해결 방법은 2가지가 있습니다

해결 1 : age를 Regular Positional Arguments로 적용 해결 2 : age를 Non-default Keyword-only Arguments로 적용

해결 1 code

def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("args=",end=""), print(args)

func_param_with_var_args("정우성", 20, "01012341234", "seoul")


결과 값

name=정우성
age=20
args=('01012341234', 'seoul')


해결 2 code

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", age = 20)


결과 값

name=정우성
args=('01012341234', 'seoul')
age=20


예제 2)

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

위 코드는 Default Keyword-only Arguments(address=0)가 Variable Length Keyword Arguments(**kwargs) 보다 뒤로 가서 에러가 발생합니다. 가변인수인 **kwargs가 모든 arguments 값을 호출해버리기 때문에 address로 호출할 인자가 없기 때문입니다.

코드를 수정 해보도록 하겠습니다.

수정 코드

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



예제 3) *args, **kwargs 등 혼용하여 사용하도록 하겠습니다.

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

에러가 발생됩니다. Arguments 순서가 뒤죽박죽 섞여 있습니다.
positional arguments에서 keyword-only arguments로 순서를 변경하였습니다.

수정코드

def mixed_params(age, name="아이유", *args, address, **kwargs):
    print("age=",end=""), print(age)
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("address=",end=""), print(address)
    print("kwargs=",end=""), print(kwargs)
    


mixed_params(20, "정우성", "01012341234", "male" , address="seoul", mobile="01012341234")


결과 값

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



마지막으로 모든 타입의 인수를 넣은 예제를 보겠습니다.

예제 4)

def exam(
    a, b, name="아이유", nation="한국", *args, address_01="서울시 강남구", age_01, age_02, address_02="서울시 서초구", **kwargs
):
    # a : Regular Positional Arguments
    # b : Regular Positional Arguments
    # name="아이유" : Default Arguments
    # nation="한국" : Default Arguments
    # *args : Variable Length Positional Arguments
    # address_01="서울시 강남구" : Defaults Keyword-Only Arguments
    # age_01 : Non-defaults Keyword-Only Arguments
    # age_02 : Non-defaults Keyword-Only Arguments
    # address_02="서울시 서초구" : Defaults Keyword-Only Arguments
    # **kwargs : Variable Length Keyword Arguments

    print(a)
    print(b)
    print(name)
    print(nation)
    print(args)
    print(age_01)
    print(address_01)
    print(age_02)
    print(address_02)
    print(kwargs)


exam(
    "난 a", "난 b", "아이유 말고 정우성", "대한민국", "male", "01012341234", 1, 1.5, 2, age_01=20,address_02="서울 아니고 성남", age_02=80, mobile1="01012341234", mobile2="01001010101", mobile3="23423423423"
)

출력 결과값

난 a
난 b
아이유 말고 정우성
대한민국
('male', '01012341234', 1, 1.5, 2)
20
서울시 강남구
80
서울 아니고 성남
{'mobile1': '01012341234', 'mobile2': '01001010101', 'mobile3': '23423423423'}

내용이 많아 좀 더 간결하게 작업을 하는 중이니 참고해주세요!
updated on 2020-10-23

업데이트:

댓글남기기