[Python] Function Parameter 정리

Inah-_-·2021년 2월 21일
1

Python

목록 보기
9/21
post-thumbnail



Function Parameters

함수는 기본적으로 input parameter를 받아서 return 값을 output으로 리턴한다.
함수를 호출시 parameter를 함수에 건내주어 호출하는데,

함수의 parameter에는 여러가지 형태가 있다.

  • 매개변수(parameter) : 함수에 전달된 데이터를 대입하기 위한 변수, 함수 선언 시 작성
  • 인자(argument) : 함수에 전달하는 데이터 자체
  • 위치 인자(positional argument): 인자와 매개변수에 위치와 일치시키는 인자
  • 키워드 인자(keyword argument) : 매개변수에 이름으로 일치시키는 인자
  • 가변 인자(variable length positional argument) : 여러 개의 위치 인자를 받을 때 사용, 주로 *args 사용, 튜플로 받음
  • 키워드 가변 인자(keyword variable length positional argument) : 여러 개의 키워드 인자를 받을 때 사용, 주로 **kwrags 사용, 딕셔너리로 받음
  • 매개변수 기본값(parameter default value) : 함수를 정의할때 기본값 지정, 함수를 사용할때 인자를 보내지않는다면 미리 지정한 기본값을 사용



Positional Arguments

def apple(Mac, iPad):
	print(f"{Mac} and {iPad}")
    
apple("lovemac", "loveipad")

# output = "lovemac and loveipad"



Keyword Arguments 형태

parameter를 순서에 맞추지 않고 값을 전하는 방법이 있는데,
이를 Keyword Arguments라고 한다.

Keyword Arguments방식으로 parameter값을
전해주면 실제 parameter 순서가 바뀌어도 에러가 나지 않고, 가독성 또한 높아진다.

def apple(Mac, iPad):
	print(f"{Mac} and {iPad}")
    
apple(Mac="lovemac", iPad="loveipad")

# output = "lovemac and loveipad"

parameter 순서에 맞추어 값을 함수에 넘기는 경우
실수로 값이 바뀌어도 알기가 힘들다는 점이 있는데,
Keyword Arguments는 parameter 이름에 맞추어 값을 함수에 넣기 때문에 실수로 값이 바뀔 확룔이 적다.



Positional과 Keyword mixing

Positional argumentsKeyword arguments를 함께 사용하는 것도 가능하다.

def apple(Mac, iPad):
  	print(f"{Mac} and {iPad}")
    
apple("lovemac", iPad="loveipad")

# output = "lovemac and loveipad"

이 방법에서의 중요한 점은,
Keyword argumentsPositional arguments
지정되어 있는 순서에 들어가게 되면 에러가 난다는 점.

def apple(Mac, iPad):
  	print(f"{Mac} and {iPad}")
    
apple(iPad="loveipad", "lovemac")

# output Error
> apple(iPad="loveipad", "lovemac")
SyntaxError: positional argument follows keyword argument



Parameter Default Value

지금까지 함수를 호출할 때 parameter값을 지정하였는데,
함수를 호출하기 전 parameter에 default값을 정의해줄 수 있다.

def apple(Mac, iPad="loveipad"):
  	print(f"{Mac} and {iPad}")
    
apple("lovemac")

# output = "lovemac and loveipad"

이 방법에서의 주의점은,
default값이 먼저 정의 된 parameterdefault값이 정의 되지 않은 parameter보다 먼저 위치해 있으면 에러가 난다.

def apple(Mac="lovemac", iPad):
  	print(f"{iPad} and {Mac}")
    
apple(iPad="lovemac")

# output
> def apple(Mac="lovemac", iPad):
SyntaxError: non-default argument follows default argument

default argumentnon-default argument 앞에 올 수 없다.



Parameter 개념 이해

Default Argument는 왜 Non-Default Argument 앞에 정의할 수 없는걸까?

SyntaxError: non-default argument follows default argument란 즉,
"기본 인수가 아닌 인수가 기본 인수를 따른다." 라는 말로,

먼저 Python parameter의 순서를 보면
def func(a, b="Hello", *args, c, **Kwargs) 이다.
예를들어 Keyword argumentsDefault Arguments의 순서는 상관이 없는데,
이는 호출시 키워드를 입력하기 때문에 각각의 parameter를 구분할 수 있기 때문이다.

하지만 Non-Default Argument는 위치나 키워드가 정의되지 않은 상태기 때문에
함수 호출시 어떤 parameter를 생략한 것인지 알 수 없으므로,

순서는 Non-Default Argument -> Default Argument가 되어야 한다.



오류 예제

01. 위치인자와 가변인자의 순서

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("라라", "1004", "seoul", 3)

# output
func_param_with_var_args("라라", "1004", "seoul", 3)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

01) 에러 수정 코드

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("라라", 3, "1004", "seoul")

# output
name=라라
args=('1004', 'seoul')
age=3

키워드 인자인 age를 가변 인자인 *args 앞으로 옮기고
함수 호출시 출력되는 age값의 위치를 옮겨 오류를 수정했다.

가변 인자*args는 굳이 **args가 아니어도 된다. *inah, *rara등 (튜플 형태로 출력)




02. 키워드 가변인자의 순서

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("라라", "3", mobile="1004", address="seoul")

# output
def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                ^
SyntaxError: invalid syntax

02) 에러 수정 코드

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("라라", "3", mobile="1004", address="seoul")

# output
age=3
kwargs={'mobile': '1004'}
address=seoul

**kwargs는 키워드 가변인자이다. 순서상 키워드 가변인자 뒤에는 어떤 인자도 올 수 없다.
**kwargs 뒤에 있는 address를 앞으로 이동시키고 에러를 수정하였다.

키워드 가변인자 **kwargs도 다른 이름을 지어줄 수 있다.
**inah, **rara등 (딕셔너리 형태로 저장)




03. 위치인자와 키워드 가변인자의 순서

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

03) 에러 수정 코드

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

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

순서상 키워드 가변인자 뒤에는 어떤 인자도 올 수 없으므로,
address**kwargs 앞으로 이동시켰다
변수를 address 키워드로 통일하여 키워드 인자로 변경하고
age는 함수 호출시의 위치로 이동시켜 위치 인자로 사용하여
에러를 수정하였다.



References

Python_keyword_only_arguments
Python.org

profile
Backend Developer

0개의 댓글