[TIL]function parameters

jayden·2020년 5월 28일
0

python

목록 보기
1/3

function parameters: positional, keyword, variable arguments

파이썬에는 인자의 종류가 2가지가 있는데 하나는 positional arguments이고 하나는 keyword arguments이다.
그리고 정해지지 않은 인자를 선언하기 위해 variable arguments가 있고 이는 인자 2종류에 모두 적용할 수 있다.(arbitrary arguments 라고도 부른다.)
variable length arguments는 positional arguments의 정해지지 않은 임의의 인자를 담기 위해 만들어졌으며 def func(*args) 형태로 선언할 수 있으며 데이터는 리스트 객체 혹은 튜플 형으로 만들어진다.
variable length keyword arguments는 keyword arguments의 정해지지 않은 임의의 인자를 담기위해 만들어졌으며 def func(**kwargs) 형태로 선언할 수 있으며 데이터는 딕셔너리 형태로 만들어진다.
배열 순서는 positional arguments, variable length arguments, keyword arguments, variable length keyword arguments 순으로 배열한다.(지키지 않을 경우 오류가 발생한다.)

1. Default value arguments가 non-default value parameter 앞에 정의되면 안되는 이유

만약, def func(a=0, b): 라고 정의한 후 함수를 호출할 때 a는 기본값인 0을 사용하고 b=2라는 값을 주고 싶어 func(2)라고 함수를 호출한다면 의도와 다르게 a에 2가 배정이 되어 b는 배정할 값이 없어 에러가 나게 된다.(positional aruguments이기 때문이다.) 이런 경우 non-default value arguments가 앞으로 와야 Default value arguments가 기본값을 사용할 수 있는 문법이 된다.

2. 위치 인수(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("wecode", "01012341234", "seoul", 20)

위 소스는 실행할 경우 에러가 발생된다.

(1) 원인
가변인수는 여러개의 인수를 가질 수 있기 때문에 모든 인자를 빨아들인다. 그로 인해 위치인수는 인자를 가질 수 없게 되면서 오류가 발생된다.

(2) 해결책
가변인수 '*args'와 위치인수'age'의 위치를 변경하고 함수를 호출할 때의 매개변수인 '20'의 위치 역시 아래와 같이 변경해 준다.

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("wecode", 20, "01012341234", "seoul")

(3) 출력결과

name=wecode
args=('01012341234', 'seoul')
age=20
=> None

3. 가변 키워드 인수 (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("wecode", "20", mobile="01012341234", address="seoul")

위 소스를 실행할 경우 에러가 발생한다.

(1) 원인
가변 키워드 인수는 위의 함수의 매개변수 중 위치인수와 키워드인수 뒤에 와야 한다. 하지만 위의 소스에서는 가변인수 '**kwargs'의 위치가 키워드 인수인 'address=0' 앞에 위치하고 있어서 오류가 발생한다.
또한, 4번 라인의 print 문에서 double quote 오류가 발생하므로 이 부분을 수정해 주어야 한다.

(2) 해결책
가변인수 '**kwargs'의 위치를 키워드 인수인 'address=0' 앞에 위치 시키고 함수 호출 시 인자인 'address="seoul"도 아래 소스와 같이 위치를 변경해 준다.

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

(3) 출력결과

name=wecode
age=20
kwargs={'mobile': '01012341234'}
address=seoul
=> None

4. 위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치를 다음 참고 자료를 통해 조사해서 어떤에러 인지 확인하고 함수가 호출되도록 에러를 고치고 호출후에 출력되는 결과를 블로그에 정리해 주세요.

def mixed_params(name="wecode", *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, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")

위의 코드를 실행시키면 오류가 발생한다.

(1) 원인 및 해결책
ㄱ. 위치인수(positional argument)인 'age'는 매개변수 위치 중 가장 먼저 나와야 한다.
ㄴ. default value arguments인 name="wecode"는 위치 인수 뒤에 와야 하고 가변인수 앞에 와야 정상적으로 "wecode"값을 받을 수 있다.
ㄷ. 가변인수인 *args는 키워드 인수 앞에 와야 한다.
ㄹ. 키워드 인수 address는 가변인수 뒤에 와야하고 가변 키워드 인수 앞에 와야 한다.
ㄹ. 가변 키워드 인수인 **kwargs는 마지막에 와야 한다.

(2) 수정 후 코드

def mixed_params(age, name="wecode", *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, "wecode", "01012341234", "male", address="seoul" ,mobile="01012341234")

(3) 출력결과
name=wecode
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
=> None

profile
DevOps 너로 정했다!

0개의 댓글