Python function parameter

고준영·2021년 8월 3일
1

Python🐍

목록 보기
2/7
post-thumbnail

파이썬으로 크롤링 해보고 나서 바로 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앞에 와야 한다고 알려주고 있다

    위 내용에 대한 이해

    함수를 호출 할 때 name값을 주어도 되고 안주어도 되는 값이다.
    왜냐? 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")
  • 위 코드를 수행하면 정상적으로 수행되는 것을 볼 수 있다

    코드 분석

    20은 age의 값으로 (age는 positional argumentsnon-default value parameter)
    "정우성"은 name 값으로(name는 positional argumentsdefault 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주차 화요일

profile
코드짜는귤🍊 풀스택을 지향하는 주니어 개발자 입니다🧡

0개의 댓글