TIL13 | Python_함수와 파라미터, 가변인수

이정아·2021년 9월 12일
0

Python

목록 보기
3/20
post-thumbnail

Function

def 함수명(parameter):
  실행문1
  실행문2
  ...
  return(또는 print사용) 리턴 값 

  #파라미터와 리턴은 있을 수도 없을 수도 있다.

parameter

1. positional arguments(기본적인)

def name(last, first):
  return last + first

name("이","코딩")

>>> "이코딩"

"이코딩" 으로 값을 리턴하려면 last,first 파라미터 순서에 맞게 인자를 넣어준다.

2. Keyword Argument

def name(last, first):
 return last + first

name(first="코딩",last="이")

>>> "이코딩"

keyword argument 방식을 쓰면 순서가 바뀌어도 괜찮고 가독성도 높아진다.

3. Mixing positional arguments and keyword arguments(혼용하여 사용)

def name(last, first, age):
  print(f"{last+first}, {age}")

name("이", age=25, first="코딩")

>>> "이코딩, 25"

주의할 점 🚨
keyword arguments 는 순서가 바뀌어도 상관 없지만
positional arguments 부분은 순서를 지켜줘야 한다.

4. Parameter Default Value
1. 함수의 parameter에 default 값을 정의를 한다.
2. 인자가 없어도 함수를 호출하면 자동으로 default 값이 넘어간다.

def name(last, first="코딩"):
return last + first

name("이")

>>> "이코딩"

주의할 점 🚨
default 값이 정의된 파라미터가 정의되지 않은 파라미터 보다 앞에 있어선 안된다.

왜 안될까?

내가 생각한 이유: 파라미터에 어떤 값이 들어가는지 정확하게 하기 위해서라고 생각한다.

예를 들어 아래 코드를 보면

def name(last, first="코딩", age):
print(f"{last+first}, {age}")

name("이",25) 
#SyntaxError: non-default argument follows default argument

두 번째 인자 25가 first와 age의 값 중 무엇인지 알 수 없다.
애초에 first에 값이 없을 시 자동으로 가져오는 기본 값이 정의된 거고
확정된 값이 아니기 때문에 순서에 문제가 생긴다.


가변인수 *args, **kwargs

args는 매개변수를 뜻하는 영어 단어 arguments의 약자이며 관례적으로 자주 사용한다.
kwargs는 keyword arguments의 약자이며 args와 마찬가지로 관례적으로 사용한다.

가변인수는 입력값이 몇 개 일지 모를 때 사용한다.

def foo(a, *varargs, **kwargs): 
    print(a, varargs, kwargs) 

## foo 호출
foo(2, 9, 12, 34, x=3, name="bob") 

>>> 2 (9, 12, 34) {'x': 3, 'name': 'bob'}

args - tuple로 만들어줌
kwargs - dictionary로 만들어줌

tuple:
() 소괄호로 둘러싸인 데이터, (생성, 삭제, 수정 불가)

dictionary:
{}중괄호로 둘러싸인 데이터, key:value 형태로 데이터가 들어있으며 순서가 없다.


파라미터 순서👇

positional args > default args > *args > keyword args > **kwrags

파라미터 순서에 주의하며 에러를 찾아보자 👀

< 1번째 문제 >

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)

<에러>
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
*args가 기본파라미터인 age보다 앞에 있어 오류가났다.

<수정>

def func_param_with_var_args(name, age, *args):

< 2번째 문제 >

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")

<에러>
def func_param_with_kwargs(name, age,
**kwargs, address=0):
^
SyntaxError: invalid syntax

default값이 정의된 파라미터보다 **kwargs 가 앞에 있어 오류가 났다.

<수정>

def func_param_with_kwargs(name, age, address=0, **kwargs):

< 3번째 문제 >

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")

<에러>
def mixed_params(name="아이유", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax

파라미터의 순서는 아래와 같다.
positional args > default args > *args > keyword args > **kwrags

<수정>

def mixed_params(age, name="아이유", *args, address, **kwargs):

0개의 댓글