파이썬 | 함수의 인자(Arguments)와 매개변수(Parameter)

2022. 6. 23. 18:53·Python
반응형

Positional Arguments

함수는 인수를 매개변수로 받아서 작동한다

순서대로 전해지는 것이 기본적인 형태이다

def only_you(name, pet):
    print(f"{name}만 {pet} 없어")
 
only_you("정우성", "고양이")

# 결과: 정우성만 고양이 없어

Keyword Arguments

함수를 호출하면서 매개변수 이름에 맞추어 인자를 넘기는 방법도 있다.

def only_you(name, pet):
    print(f"{name}만 {pet} 없어")
 
only_you(pet = "고양이", name = "정우성")

# 결과: 정우성만 고양이 없어

순서대로 넘겨주는 방식은 순서가 실수로 바뀌는 경우가 있고, 그럴 경우 알아차리기 쉽지 않다.

keyword arguments 방식을 사용하면 순서가 실수로 바뀌더라도 쉽게 눈치챌 수 있고, 코드도 문제없이 작동한다.

그리고 읽는 사람도 어떤 값을 주는지 명확히 알 수 있기 때문에 쉬워져 코드의 가독성도 높아지게 된다

 

둘을 섞어서 사용할 수도 있지만 positional arguments는 꼭 순서에 맞춰서 넣어줘야 한다.

positional argument가keyword argument가 보다 더 앞으로 위치되어야 한다

def only_you(name, pet):
    print(f"{name}만 {pet} 없어")
 
only_you("정우성", pet = "고양이")
# 정우성만 고양이 없어


def only_you(name, pet):
    print(f"{name}만 {pet} 없어")
 
only_you(name = "정우성", "고양이")
# SyntaxError: positional argument follows keyword argument
# positional argument는 키워드 인자보다 먼저 나와야 한다



def only_you(name, pet):
    print(f"{name}만 {pet} 없어")
 
only_you("고양이", name = "정우성")
# TypeError: only_you() got multiple values for argument 'name'
# 위치 인자가 먼저 왔지만 매개변수 순서랑 다르다

Parameter Default Value

매개변수에 미리 기본값을 정의해 놓을 수도 있다. 값이 넘어가지 않으면 자동으로 기본값이 넘어간다

def only_you(name, pet = "고양이"):
    print(f"{name}만 {pet} 없어")
 
only_you("정우성")

default value parameter의 위치

def only_you(name = "정우성", pet):
    print(f"{name}만 {pet} 없어")
 
only_you("고양이")
# SyntaxError: non-default argument follows default argument

이렇게 함수에서 앞에 있는 매개변수가 기본값을 가지고 있는데 함수를 호출하면서 인자를 하나만 넘겨주었다.

이럴 경우 "고양이"를 name에 넘겨주는건지, pet에 들어가는건지 알 수가 없다.

그래서 기본값이 정의되지 않은 매개변수(non-default value parameter)는 기본값이 정의된 매개변수(default value parameter)보다 먼저 나와야 한다.

 

 

Variable Length Arguments

가변길이 인수로 위치 인수를 여러개 넘길 수 있다.

넘어간 인수들은 튜플로 구성된다.

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

func_param_with_var_args("정우성", "01012341234", "seoul", 20)
# 결과
# name=정우성
# args=('01012341234', 'seoul', 20)

위치 인수(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)
# 에러: TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

이렇게 위치 인수보다 뒤에 들어갔을 때 , age에 들어갈 인수가 없다고 나온다.

가변길이인수인 args에 "010~"부터 20까지 다 들어갔기 때문이다.

그래서 함수 인자의 순서를 변경해야 한다.

def love_you(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
 
love_you("정우성", 20, "01012341234", "seoul")
# 결과
# name=정우성
# args=('01012341234', 'seoul')
# age=20

변경후 잘 작동한다.

 

Variable Length Keyword Arguments

가변길이 키워드 인수는 키워드와 값을 같이 여러개 넘길 수 있다. 딕셔너리 형태로 전달된다.

def func_param_with_kwargs(name, age, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
# 결과
# name=정우성
# age=20
# kwargs={'mobile': '01012341234', 'address': 'seoul'}

가변 키워드 인수 (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

가변길이 키워드 인수가 뒤에서 두번째 있는데 "정우성", "20"은 차례로 name, age에 들어가고 

mobile="01012341234", address="seoul"이 모두 kwargs에 들어갈 수 있다.

그런데 마지막에 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

앞에 두개가 차례로 들어가고 mobile은 kwargs에 들어갈 수 있어서 들어간다. address는 키워드에 따라서 세번째에 들어간다.

 

인자의 순서

위치인수 - 초기값이 있는 인수 - 가변길이 인수 - 키워드 전용 인수 - 가변길이 키워드 인수

 

아래 코드를 실행하면 오류가 난다

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

 

이걸 순서에 맞춰서 바꾸면

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

잘 실행된다

 

 

참고 자료

https://getkt.com/blog/python-keyword-only-arguments/

반응형
저작자표시 비영리 변경금지

'Python' 카테고리의 다른 글

파이썬 | print(i, end='') 개행 없이 한줄로 출력  (0) 2022.07.07
파이썬 | 삼항연산자  (0) 2022.07.01
파이썬 | 모듈 패키지 절대경로 상대경로  (0) 2022.06.26
파이썬 | List vs. tuple vs. set vs. dictionary  (0) 2022.06.23
파이썬 기초문법  (0) 2022.06.22
'Python' 카테고리의 다른 글
  • 파이썬 | 삼항연산자
  • 파이썬 | 모듈 패키지 절대경로 상대경로
  • 파이썬 | List vs. tuple vs. set vs. dictionary
  • 파이썬 기초문법
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
파이썬 | 함수의 인자(Arguments)와 매개변수(Parameter)
상단으로

티스토리툴바