28. Function Parameters

박재용·2020년 9월 18일
0

과제

목록 보기
3/3

1.

아래의 소스예제에서 Parameter에 Default value가 선언되어 있지않고 Position agruments로 값을 전달하고자 할때, 당연히 비어있는 "your_name"이라는 parameter로 arguments가 전달되는 것이 아니라 Python은 "아이유"라는 값을 "my_name", "your_name" 중 어떤 parameter로 전달해야할지 모르는 상황이 온다.
따라서 defalt 값이 정해지지 않은 parameter는 함수에서 먼저 위치해주어야한다

def love_you(my_name = "정우성", your_name):
print(f"{my_name} loves {your_name}")
love_you("아이유")

따라서 다음과 같이 수정해주어야 한다 .

def love_you( your_name,my_name = "정우성"):
print(f"{my_name} loves {your_name}")
love_you("아이유")

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)

position, keyward 중 position이 먼저 와야한다 또한 가변인수는 순서상 가장 마지막에 와야한다. 따라서 position인수가 오고 그 다음에 variable length가 와야한다.
이유는 . args 는 여러가지의 변수를 받는데 args 가 끝이아닌 중앙에 와버리면 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("정우성", "01012341234", "seoul", 20)

결과값
name=정우성
args=('seoul', 20)
age=01012341234

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

즉, position인 name과 age가 자리하고 위의 인자 우선순위 처럼 그 뒤로 가변키워드인수가 위치하고 마지막으로 Keyword-Only args with default인 address가 있기 때문이다.
아래 코드처럼 address와 **kwargs의 위치를 바꿔야한다. default값이 있는 address는 position보다 뒤에 와야되기 때문에 name과 age뒤에 위치한다.

가변 키워드 인수는 위의 함수의 매개변수 중 위치인수와 키워드인수 뒤에 와야 한다. 하지만 위의 소스에서는 가변인수 '**kwargs'의 위치가 키워드 인수인 'address=0' 앞에 위치하고 있어서 오류가 발생한다.

수정후
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")

-> //Invaild syntax

즉, 아래 코드처럼 posiion인 age를 가장 앞으로 옮겨주고 address와 kwargs의 위치를 바꿔주면 오류는 사라진다.
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul") 함수 순서에 따라 age가 먼저 , 그다음 name *args ,address 키워드 파라메터 순으로 코드를 수정하면 에러가 사라진다 .

수정후

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

profile
박재용이란 사람이 복습을 하기위해 만든 벨로그 입니다 . 잘부탁드려요

0개의 댓글