Python function parameter
파이썬으로 크롤링 해보고 나서 바로 Django를 공부했는데 Django를 하면서 되게 불편했던 부분이 있다.
장고의 기능이 불편하다는 것이 아니라 내 심적인 불편함 그것은 바로 "*" 요놈이다!!
앞에서도 계속 이야기했지만 c++에서 가장 짜증나는 부분 바로 pointer!!
인줄 알았는데 다행이도 파이썬에서는 pointer같은 어렵고 난해한 부분은 아니었다.
1. Order of default value parameter
and non-default value parameter
1. default value parameter
- 위의 주제를 논하기 전에 default value parameter에 대해서 알아야 한다.
def func_param_with_default(age, name="jayko"):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
func_param_with_default(27, "준영")
func_param_with_default(27)
위의 함수를 보았을 때 name="jayko" 이렇게 함수를 정의 할 때 변수에 값을 지정해주면, 함수를 호출 할 때 해당 값을 정해주지 않아도 jayko라는 값이 들어간다. 만약 해당 값을 주게 된다면, 주어준 값으로 함수를 실행하게 됨
위의 코드를 실행 한 결과name은 default value parameter
age는 non-default value parameter
2. change order of parameter
- 위의 코드에서 parameter의 순서를 변경해보자
def func_param_with_default(name="jayko", age):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
func_param_with_default(27, "준영")
func_param_with_default(27)
- 아래의 에러를 발견 할 수 있다
- non-default argument 가 default argument앞에 와야 한다고 알려주고 있다
위 내용에 대한 이해
왜냐? default value parameter이기 때문이다.
그렇다면 우리가 27 이라는 변수를 하나만 주어주게 되면 이것이
name은 주지 않고 age값을 준 것인지?
아니면
name에 27이라는 값을 주고 age는 주지 않은 Human error인지?
기계는 알 수 없다!!
따라서 non-default argument 가 default argument앞에 와야 함
2. Positional arguments and Variable length arguments
1. Positional arguments
- 위치 인수라고 하며 우리가 위에서 다루었던 non-default value parameter, default value parameter 둘다 위치 인수
- 위치 인수란 인수를 주어 줄 때 순서가 중요 한 인수를 말한다.
def positional_arguments(name, age, sex):
positional_arguments(jayko, 27, male)
- 위 코드에서 아래처럼 인수에 값이 할당 되는데 이렇게 순서만 맞게 넣어주면 된다.
jayko -> name
27 -> age
male -> sex
2. Variable length arguments
- 인자를 몇개를 받을지 정해지지 않음
def positional_arguments(name, *args):
positional_arguments(jayko, 27, male)
- 위의 코드처럼 name값 이후에 들어오는 모든 인자는 *args의 값에 들어가게 된다.
3. Positional arguments vs 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("정우성", "01012341234", "seoul", 20)
- 위 코드의 실행결과
이러한 에러를 마주 할 수 있다. 해당 에러는 age에 대한 인자를 받지 못했다는 에러임 - 위의 에러가 발생하는 이유는 *agrs의 내용에 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("정우성", 20, "01012341234", "seoul")
- 위 코드를 수행하면 아래의 사진처럼 정상적으로 작동한다
3. Variable length keyword arguments
1. 가변키워드인자
- dict 형태처럼 키워드를 주어야 하는 인자
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")
위 코드의 실행 결과는
syntax error가 발생한다. 해당 함수는 address라는 인자를 받아야 하는데 위 코드는 address가 **kwargs로 들어가기 때문에 error발생keyword arguments 와 address의 위치를 변경해주면
위와 같이 정상적으로 수행이 되는 것을 알 수 있다
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")
- 위 내용을 실행하면 3에서 다루었던 내용과 같은 에러가 발생한다(**kwargs)뒤에는 아무것도 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(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
- 위 코드를 실행하면 아래와 같은 에러 발생
- age가 agrs의 내용으로 들어가 버렸기 때문
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 값으로(name는 positional arguments의 default value parameter)
"01012341234", "male"는 agrs의 값으로(agrs는 Variable length arguments)
address="seoul"은 address 값으로(address는 Non-Default Keyword-Only Arguments) - Keyword-Only Arguments는 오로지 keyword로만 받는 인자
mobile="01012341234"는 kwargs의 값으로(kwargs는 Variable length keyword arguments)
5. conclusion
위코드의 과제로 주어주지 않았다면, 계속 모르고 지나갔을 내용이었을 수도 있다
하지만 Django, Python을 하는데 있어 꼭 알아야 할 내용이었다
모르는 부분에 대해 고민하고 알아가면서 조금씩 성장하자!!
느리더라도 정확하게 알고 간다👊
21.08.03 위코드 1주차 화요일