Python: Function Parameter

Tasic·2021년 5월 15일
0

Python

목록 보기
4/7
post-thumbnail

서론

함수는 input parameter를 받아서 return 값을 output으로 리턴합니다.
그리고 함수를 호출할때 parameter를 함수에 건내주어서(pass) 호출 합니다.
본 포스팅에서는 함수의 parameter에 여러 형태에 대해서 정리하였습니다.

인수 종류

위치 인수(positional arguments)

순서대로 값을 넣는 방식 입니다.
기본 적인 함수 인수를 생각하시면 됩니다.

ex)

   def set_info(name, age):
    ....
    
    # 호출 시
    set_name("철수", 25)

키워드 인수(Keyword Arguments)

순서 대신에 parameter 이름으로 맞추어서 값을 전해주는 방법을 키워드 인수라고 합니다.

ex)

   def set_info(name, age):
    ....
    
    # 호출 시
    set_name(age=25, name="철수")

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

키워드 인수처럼 이름을 명시해야되는데, 무조건 명시해야 됩니다.

  • 키워드 인수가 되는 조건은 2가지 경우가 존재
    1. *를 인수로 정의하면 다음 인수부터 키워드 전용 인수임. (*가 나오면 위치 인수가 끝났다고 볼 수 있음)
    2. 가변 인수 뒤에 오는 인수들도 키워드 전용 인수임.
  • default 값을 부여 할 수 있음
  • 함수를 사용시 의도를 명확히 드러내도록 요구할 수 있다.
  • 따라서 사용자가 착각해서 위치를 바꿔 값을 넘기는 사항을 방지 할 수 있음

ex1) * 뒤에 오는 인수들은 키워드 전용 인수

def set_info(name, *, age):
    ....
    
    # 호출 시
set_info("영희", age=20) #ok
set_info("철수", 25) #error

TypeError: set_info() takes 1 positional argument but 2 were given

ex2) 가변인수 뒤에 오는 인수들은 키워드 전용 인수

def set_info(name, *etc, age):
    ....
    
    # 호출 시
set_info("영희", age=20) #ok
set_info("철수", 25) #error

TypeError: set_info() missing 1 required keyword-only argument: 'age'

디폴드 인수(Default Parameter)

  • 함수의 parameterdefault값을 정의하는 방식

  • Default 값이 정의된 paramter는 함수가 호출될때 값이 넘겨지 않아도 괜찮습니다.

    ex)

def set_info(name, age, hobby="없음"):
....

# 호출 시
set_name(age=25, name="철수", "코딩하기")
set_name(age=30, name="철이") # hobby가 자동으로 "없음"으로 설정됨.
    

가변 인수(variable length arguments)

인수의 개수가 정해지지 않고 받을 수 있음 즉 안 넣을 수 도 있고, 여러개를 넣을 수도 있습니다.

  • 함수에서는 List형태로 받음.
  • 함수 정의시에는 인수 앞에 *를 붙임

ex)

def set_names(*names):
....
    
# 호출 시
set_name("철수", "영희", "덕구")
set_name("태식")
set_name()

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

인수의 개수가 정해지지 않고 받을 수 있음 즉 안 넣을 수 도 있고, 여러개를 넣을 수도 있습니다.

  • 함수에서는 dictionary형태로 받음.
  • Key=Value형태로 입력합니다.
  • 함수 정의시에는 인수명 앞에 ** 를 붙임

ex)

def set_option(**option):
    ....
    
# 호출 시
set_option(home="전세", min_price=10000000, max_price=90000000, location="서울")
set_option(home="월세", month_price=300000)
set_option()

function parameter 순서

각 인수에는 순서가 존재합니다. 이러한 순서가 없다면 함수를 호출 하기 위해 값을 설정 시에 어떠한 값이 어느 인수에 들어가야되는지 명확하지 않아 많이 힘들지 않을 까 싶습니다.
아래 그림을 참고하면 알 수 있습니다.

이미지 출처 - getkt.com

  1. 위치 인수(Positional Argument)
  2. 디폴드 인수(Default Arguments)
  3. 가변 인수(Variable Length Arguments)
  4. 키워드 전용, 키워드 전용 디폴트 인수(keyword-only, keyword-only default Arguments)
  5. 가변 키워드 인수(Variable length keyword arguments)

복합 활용 예시

print

자주 사용하는 print는 Variable Length Arguments, Variable length keyword arguments로 구성되어 있습니다.

  • 가변 인수: 출력할 값들을 가변적으로 받음
  • 가변 키워드 인수 : 옵션등을 처리(end="")

💡 21.05.16 Edit end는 키워드 전용 인수인수입니다.

ex)

print() # 가변 인수, 가변 키워드 인수이기 때문에 인수를 안 받아도 됨.
print(end="")
print("hello", "world")
print("Good!", end="")

문제 해결

Q1: 디폴트 인수

def func_param(name="철수", age):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)

func_param("철수", 20)

SyntaxError: non-default argument follows default argument

Q1: Answer

default인수는 non-default 앞에 올 수 없음
가능하다고 해도, non-default인수 때문에, 무조건 2개의 인수를 넣어야됨.
따라서 default 인수를 사용하는 이유가 없어짐.

Q2: 위치 인수, 가변 인수

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'
가변인수 뒤에 있으면, 키워드 전용 인수가 되므로 위와 같은 에러 발생

Q2: Answer1

def func_param_with_var_args(name, *args, age):
...
func_param_with_var_args("철수", "01012341234", "seoul", age=20)

가변인수 뒤에 있으니, age가 키워드 전용 인수 이므로 함수 호출 시, 키워드(age) 명시

Q2: Answer2

def func_param_with_var_args(name, age, *args):
...
func_param_with_var_args("철수", 20, "01012341234", "seoul")

age를 name 뒤로 이동시켜, 위치 인수로 만들기

Q3: 가변 키워드 인수

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, **kwargs, address=0):
                                                                  ^
SyntaxError: invalid syntax

Q3: Answer

가변 키워드 인수는 순서상 맨 마지막에 와야 되기 때문에 **kwargs, address=0의 위치를 변경해야됨.
변경을 하면 1.위치 > 2.디폴트 > 3.가변키워드 인수 순이 됨.

def func_param_with_kwargs(name, age, address=0, **kwargs):

Q4: 위치 인수와 키워드 가변 키워드 인수

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

def mixed_params(name="철수", *args, age, **kwargs, address):
                                                                       ^
SyntaxError: invalid syntax

Q4: Answer

다음 순으로 인수 위치 변경
1. age: 위치 인수
2. name: 디폴드 인수
3. args: 가변 인수 - "01012341234", "male"가 들어감
4. address=0: 디폴트 키워드 전용 인수
5. kwargs: 키워드 전용 인수

def mixed_params(age, name="철수", *args, address, **kwargs):

마치며

앞서 살펴본 바와 같이 python에는 다양한 인수의 형태가 있는데요. 이렇게 다양한 인수의 형태는 코드를 할 때 더욱 더 편하고 유연하게 작성할 수 있도록 도와주는 것 같습니다.

여러가기 인수의 형태 때문에 위치가 헷갈릴 수 있지만, 각 인수의 특징을 이해한다면, 자연스럽게 어떻게 조합해서 사용해야 할지 생각할 수 있을 것 같습니다.

Reference

python keyword only arguments - getkt.com
이펙티브 파이썬 - 21. 키워드 전용 인수로 명료성을 강요하자

profile
블로그 옮겼습니다 (https://jotasic.github.io)

0개의 댓글