[Python] Function Parameter

짱구석·2020년 10월 21일
0
post-thumbnail

시작하기

오늘은 function parameter를 한번 이해보도록 하겠다!

문제1

  1. default parameter, non-default parameter
def sum(a=1,b=2):
	return a+b
sum(3)
>>5 # 여기서 1은 a로 들어간다.
sum()
>>3 #심지어 이렇게 아무인수를 넣지 않아도 에러가 남지 않는다. 
  • default parameter와 non-default parameter 뒤로 오는 경우(이건 된다)
def sum(a,b=2):
	return a+b

sum(1) # 여기서 1은 a로 들어간다.
>>3 
  • default parameter와 non-default parameter 앞으로 오는 경우
def sum(a=2,b):
	return a+b

>>SyntaxError: non-default argument follows default argument

default parameter 가 있다는 것은 굳이 값을 정해주지않아도 사용할 값(default)이 있기 때문에 함수를 줄여 쓸 수가 있다.

내생각

default parameter가 앞에 오면 줄여서 썼을 때 의미가 모호해지고 처리가 파이썬 시스템에서

처리하기가 복잡해서 순서를 준 것이라고 생각했다.


이렇게 parameter의 따라 우선 순위가 있어 반드시 순서를 지켜줘야 하는 경우가 있다. 몇가지 더 알아보자

문제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)
>> TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

다음과 같은 age 인자는 keyword only argument가 필요하다고 한다

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
# 20 -> age=20으로 변경
func_param_with_var_args("정우성", "01012341234", "seoul", age=20) 

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

왜 그럴까

가변 인자뒤에 키워드 인자가 들어오지 않으면 모두 가변인자로 판단하기 때문에 사실상 처음 에러난 코드의 20은 args[2]에 들어갔기 떄문에 더이상에서 age에서 줄수 있는 arument가 없어서 에러가 난 것이다.

이때 keyword arument로 age를 특정지어주면 에러가 발생하지 않는다.

문제3

수정 전

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

수정 후

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

문제4

수정 전

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", address='seoul', mobile="01012341234")

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

내 생각

이렇게 parameter에 성질에 따라 순서를 준 것은 보통은 가변 인자를 사용하면서 우선순위를 정해주지 않으면 어디까지가 어떤 매개변수에 들어가야하는지 모호해지기 때문에 에러처리하도록 한 것 같다.

뭐랄까 일반 매개변수는 positional argument로 받고 거기에 추가되는 변수는 *args로 받고 그중에 키워드로 되있는 것들은 또 **kwargs로 받는 다는 느낌이다.

정리

  • *args는 여러 인자를 매개변수로 받을 수 있다.(중간보스)
  • **kwargs 는 키워드 인자만 받을 수 있다.(최종 보스)
  • 하지만 이런 편리함으로 위해서 지켜야할 약속이 있다.
  • (a, b=0, *arg, c, **kwargs) -. 이상적인 형태
  • a는 b보다 항상 앞에 와야한다.
  • *arg 뒤로 다양한 인자가 올 수 있다.
  • 여기서 c는 '키워드 인자'로 넘겨 줘야한다.
  • 함수를 작성할 때 어떻게 parameter를 설정해야하는 지 항상 유념하자

Reference


https://www.python.org/dev/peps/pep-3102/

0개의 댓글