python, function parameter

ryan·2020년 8월 20일
0

1. 이번 과제는 programming 과제가 아니라 개념을 이해하고 설명하는 과제 입니다.

함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다.
왜 안돼야만 하는지 생각해보시고 블로깅 하여 채널에 공유해 주세요.

모든 parameter는 어떠한 default value parameter보다 앞에 위치해야한다. 왜냐하면 parameter는 여러 형태가 있는데 가장 기본적인 형태는 순서대로 값이 함수에 전해지기때문이다.

밑에 첫번 째 예시코드를 보면 default 값이 정의된 인수가 먼저 위치해있으면 문법적 오류가 생긴다. 이 이유는 파이썬에서 그 default 값이 어떤 인수를 말하는 건지 알 수 없기 때문이다.

def test_func(a="korean", b="spanish", x, y):
    print(a, b, x, y)

test_func("world", "hello")

SyntaxError: non-default argument follows default argument

반면에, 아래 예시에서는 정의되지않은 인수를 정의된 인수 앞에 위치시켜야만 함수가 제대로 호출되는 것을 볼 수 있다.

def test_func(x, y, a="korean", b="spanish"):
    print(a, b, x, y)


test_func("world", "hello")

korean spanish world hello

따라서 반드시 기본값이 정의해있지 않은 parameter가 먼저 위치해 있어야 한다.

함수 Arguments 우선순위
  1. positional arguments(순서가 정해져 있음)
  2. default arguments (default값이 지정된 arguments)
  3. positional arguments들의 집합
  4. keyword arguments (함수를 호출할 때 값을 지정)
  5. keyword default arguments (keyword arguments에 default 값이 지정된 경우)
  6. keyword arguments의 집합

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

위치 인수(positional argument): 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수. 가장 자주 사용한다.

def print_number(a, b, c):
	print(a, b, c)
    
print_number(7, 8, 9)

7, 8, 9		# 출력 값

가변 인수(variable argument): 인수의 개수가 변할 수 있다는 의미이고, 가변 인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미한다.

def myFun(*argv):  
    for arg in argv:  
        print (arg) 
    
myFun('Hello', 'Welcome', 'to', 'GeeksforGeeks')  

Hello		#출력 값
Welcome
to
GeeksforGeeks

위치 인수를 가변인수 뒤에 선언하면 아래와 같이 오류가 생긴다.

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)

Traceback (most recent call last):
  File "python", line 7, in <module>
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

이 오류는 중간에 있는 가변인수가 어떤 인수를 사용할 지 명확하지않기때문이다.

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("정우성", 20, "01012341234", "seoul")

이 오류를 해결하기위해서 age와 *args의 순서를 바꿔주고, 호출하는 함수의 입력값의 순서를 바꿔준다. 이렇게 하면 가변 인수는 컴퓨터가 읽는 순서에 따라서 남아있는 인수들을 튜플로 묶어서 나타내기때문에 함수가 잘 호출되는 것을 볼 수 있다.

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

Traceback (most recent call last):
  File "python", line 1
    def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^
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

이 오류 또한 다른 문제들과 비슷하게 가변 키워드 인수가 마지막에 위치하지않아서 생기는 오류로 함수에서 가변 키워드 인수의 위치를 마지막으로 변경해주고, default 값이 있는 address를 위치 인수 뒤에 위치시키면 함수가 잘 호출되는 것을 알 수 있다.

4. 위치 인수와 키워드 가변 키워드 인수 (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")


Traceback (most recent call last):
  File "python", line 1
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
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" ,mobile="01012341234", address="seoul")

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

컴퓨터가 읽는 순서에 따라서 age(위치 인수)를 제일 앞으로 옮기고, address와 **kwargs의 위치를 바꾼면 함수가 오류 없이 호출이 된다.

profile
👨🏻‍💻☕️ 🎹🎵 🐰🎶 🛫📷

0개의 댓글