! 먼저, 파이썬 함수를 적을때 매개변수는 기본값을 가질수도 안 가질수도 있습니다.!
def my_function(name, age = 25):
print(f"{name} is {age} years old")
my_function("seungjae")
# seungjae is 25 years old
def my_function(name, age = 25):
print(f"{name} is {age} years old")
my_function("seungjae")
# seungjae is 25 years old
다음과 코드와 같이, name 변수는 기본값을 안지고 있고, age 변수는 기본값을 가지고 있는 것을 확인 할 수 있습니다. 그래서 밑에 my_function 이란 함수를 실행시킬때, 기본값을 안가지고 있는 name 변수는 값을 지정해주어야 되며 , age 변수는 입력을 안해도 기본값인 25를 가지고 있기 때문에 다음과 같이 결과 화면을 확인 할 수 있죠 !
하지만, 이 때 주의해야 될 점은 기본값을 가지고 있는 매개 변수 (age) 같은 경우 기본값을 가지고 있지 않는 변수 (name) 앞에는 명시를 하면 안된다는 점이다. 만약 이렇게 안쓴다면 아래와 같이 파이썬은 SyntaxError 을 발생시키죠 ㅠㅠ
def my_function(age = 25,name):
print(f"{name} is {age} years old")
my_function(age = 10, name = "seungjae")
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
파이썬에서 왜 이런 규칙을 만들었는지에 대해서 고민해 봤을때 저는 2가지 정도가 생각이 났습니다.
첫번째는 "매개변수의 혼동"을 초래 할것이기 때문입니다.
각 매개변수의 값을 지정할 수 도없지만, 파이썬에서는 아래와 같이 대게 생략을 할 수 도 있죠.
이렇게 했을때, 다음 주석과 같이 혼동이 올 수 도있죠. 그래서 만약 일반 string 변수와 integer 변수가 사칙연산이 안되기 때문에, 코드에서 Value 의 TypeError 또한 초래할 수 있기 때문에 다음과 같이 default value를 가지는 parameter 는 다양한 혼동을 야기하기 때문에 파이썬 개발자 분들께서 다음과 같은 규율을 정한거 같습니다.
def my_function(age = 25, siblings = 1, name, favorite):
print(f"{name} is {age} years old. I have {sibilings} sibling(s). My favorite is {favorite}" )
my_function(10,'seungae','cake') # age == 10 name == 'seungjae' favorite = 'cake' ???
or
# siblings == 10 name == 'seungjae' favorite = 'cake' ???
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
두번째는 "편의성"이 더 좋을것 같다고 생각했습니다.
다른 분들은 잘 머르겠지만, 예를 들어서 저는 일단 확실한 문제부터 처리하고 애매한 문제는 다음에 두고 생각한 다음에 푸는 걸 선호하죠. 이렇게 하면 애매한 문제를 풀면서 확실한 문제를 생각하지 않아도 돼서 조금 더 여유롭게 고민할 수 있어서 좋더라구요. 이런 것처럼 저 함수를 이용하는 입장으로써, non-default parameter 같은 경우 무조건 값을 줘야하기 때문에 그 부분을 먼저 처리하고, 나중에 default value paremeter를 처리하는게 이용하는 입장에서 더 편할 것이라고 생각하네요. 그래서 이용자는 하지만, 이 부분은 솔직히 취향적인 부분이여서 저의 개인적인 생각입니다 하하 ...
틀린 방식
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 "/home/seungjae/바탕화면/project/test.py", line 9, in <module>
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
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")
'''
name=정우성
args=('01012341234', 'seoul')
age=20
'''
위에서 설명한 가변인수와 비슷하게, 가변 키워드 인수 (variable lenght keyword arguments)는 불특정 다수의 키워드 argument를 생성할 때 사용되는 매개변수입니다. 그리고, 위의 이미지에서 확인할 수 있듯이, 이 인자는 항상 마지막의 매개변수로 오기 때문에 아래와 같은 코드는 에러를 생성하게 되죠 ...
틀린방식
def func_param_with_kwargs(name, age, 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")
'''
File "/home/seungjae/바탕화면/project/test.py", 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", address="seoul" ,mobile="01012341234")
'''
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''
틀린 방식
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")
'''
File "/home/seungjae/바탕화면/project/test.py", line 1
def mixed_params(name="아이유", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax
'''
맞는 방식
def mixed_params(age, *args ,address =0,name="아이유", **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
'''