[Python]Function Parameter & Arguments

박현희·2020년 9월 18일
0
  1. 이번 과제는 programming 과제가 아니라 개념을 이해하고 설명하는 과제 입니다.
    함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다.
    왜 안돼야만 하는지 생각해보시고 블로깅 하여 채널에 공유해 주세요.

👉🏽 파이썬에는 정해진 함수 처리 순서가 있다.

def example(a, b, c=None, r="w" , d=[], *ae,  **ab):

(a,b) are positional parameter

(c=none) is optional parameter

(r="w") is keyword parameter

(d=[]) is list parameter

(*ae) is keyword-only

(**ab) is var-keyword parameter

파라미터를 받는 순서는 다음과 같으며 이 순서를 지키지 않을 시 오류가 발생한다.
keyword argument를 position argument보다 앞에 위치 시켰기 때문에 위의 코드에서 오류가 난 것이다.

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

👉🏽 먼저 가변 인수(variable length arguments)란 임의의 개수의 Positional Arguments 방식으로, Tuple 형태의 변수로 저장한다. parameter에게 넘겨줄 값이 너무 많거나, 개수가 정해지지 않았을 때 사용을 한다. 코드로 설명을 해보자면

def test(a, b, c, *args):
    print(a)
    print(b)
    print(c)
    print(args)

test(1, 2, 3, 4, 5, 6)
'''
1
2
3
(4,5,6)
'''

인자를 파라미터에 순서대로 할당을 하고 남은 값들은 한 번에 할당을 하는는 것을 볼 수 있다. 이걸 가변 인수(variable length arguments)라고 한다.
가변의 입력을 받는 args는 맨 뒤에 있거나 keyword와 함께 움직여야한다.

다른 예제를 보자면

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)

이 경우에는 오류가 난다.
그 이유는 무엇인가 보면 args는 가변의 길이를 입력받는 파라미터인데,
번호와 서울, 그리고 20까지 모두를 가변의 값으로 인식을 해서 3개의 값 모두 들어게가 된다. 그로인해 age라는 파라미터 값이 없게된다.

이 경우는 age를 keyword로 바꿔서 오류를 잡을 수 있다.

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

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

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

👉🏽 먼저 가변 키워드 인수 (variable length keyword arguments)는 임의의 개수의 Keyword Arguments 방식으로, Dictionary 형태의 변수로 저장한다.

def test(a, b, **kwargs):
  print(a)
  print(b)
  print(kwargs)
test(1, 2, name = "Lee", age = 23, company = "Wecode")
'''
1
2
{'name': 'Lee', 'age': 23, 'company': 'Wecode'}
'''

문제

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

<mobile="01012341234">이라는 variable Length Keyword가 keyword parameter보다 앞에 있기 때문에 오류가 난걸로 보인다.

#address parameter를 kwargs parameter 앞으로 옮겨준다.

def exam2(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)

exam2("정우성", "20", mobile="01012341234", address="seoul")

결과가 잘 나오는것을 볼 수 있다.

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

👉🏽 나는 일단 키워드가 있는 address를 **kwargs 앞으로 빼고 입력하는 인자 순서를 파라미터 처리 순서에 맞춰 변경했다.

def mixed_params(name="아이유", *args, age, 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("정우성", "01012341234", "male", age=20, address="seoul", mobile="01012341234")
'''
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''

값이 잘 나오는걸 볼 수 있다.

0개의 댓글