[TIL] # 19 parameter!

ddalkigum·2020년 12월 17일
2

TIL

목록 보기
19/50
post-thumbnail

Parameter

non default value parameter

기본값이 없는 파라미터로


def my_function(name, age):
	pass

name, age와 같이 기본값이 없고, 순서만이 정해져있는 파라미터
사람이 읽기 좋게 하기위해, name 과 age를 사용했지만
실제로 a,b 로 넣어도 되고 hong 과 hang을 넣어도 그대로 작동합니다

default valur parameter

non 과는 다르게 defult 값을 설정해 주는 겁니다
값이 정해져있기 때문에 바뀌지 않는다라고 생각 하실수 있는데
말그대로 기본 값이기 때문에 값은 물론 바뀔수 있습니다!

def my_function(name, age =19):
	pass

값을 넣지 않아도 기본적으로 설정되어있는 값으로 함수가 작동하기 때문에

이 함수를 사용하는 사람이 설정할 필요가 없는 부분을 default 값으로
주는 경우가 있습니다

둘의 순서

이 부분은 조금 중요합니다

순서를 알고, 내가 어떤 파라미터를 어디에 넣어야 하는지는 아는건 기본입니다

두가지의 차이를 보면 순서만 바꿔줬을 뿐인데
Syntax Error 가 발생합니다

Syntax Error

이 에러의 경우는 구문오류가 발생했을 때 나오게 됩니다
-> 문법적으로 뭔가 잘못됬을 대 발생

앞에 존재하면 안되는 이유

기본값이기 때문에 사용할지 안할지 컴퓨터에게 판단을 맡기는건
안되는 거죠... 사람이 설정을 해줘야 하는 부분입니다

기본값이 설정되어 있더라도

컴퓨터가 마음대로 할 수 없고,
코드를 작성한 사람의 마음까지 컴퓨터가 이해 할 순 없습니다

"내가 기본값으로 이걸 줬으니까 이건 너 마음대로 써"

어떤가요?
컴퓨터한테는 너무나 어려운 문제일거 같습니다

만약 사용하고 싶다면?

뒤에 *args를 설정 해주면 사용 가능합니다

몇개가 들어올지 모르기 때문에 들어오지 않으면 빈 튜플로 넘겨주면 되기 때문이죠

그렇다면 여기엔 사용된 *args는 무엇인지 알아볼게요


우선 2개의 개념을 알기 위해선 packing과 unpacking이 필요합니다

packing, unpacking

packing

감싼다, 포장한다고 생각하면 되고,
파이썬의 함수에서 *arg, **kwargs 이 두가지 많이 쓰이는데
둘다 packing의 뜻으로 보면 됩니다

unpacking

packing 과는 반대로 감싸 있는걸 풀어 주는 역할을 합니다

자세한건 밑에서 다룰게요

args

arguments의 약자로 함수를 사용하면서 인자를 가지고 올때 사용합니다
적은 순서대로 인자를 가지고 옵니다

사용하는 방법은

def my_function(*args):
	pass

형식으로 사용하며, 여러개의 인자를 가지고 올때 사용하게 됩니다

순서대로 가지고 온다

형식으로 사용하며, 여러개의 인자를 가지고 올때 사용하게 됩니다

args를 사용하는 이유

정해지지않은 숫자의 인자를 가지고 올때

이렇게 인자를 받아오는데, 만약 인자가 너무 많아진다면
개발자도 사람입니다

실수할 일이 생길수도, 있고 가독성또한 떨어지게 됩니다
만약 인자의 갯수를 미리 정하기 어려운 경우일 때 사용합니다

args를 사용하지 않을 경우

이 경우에는 많이 복잡하지 않아 보이지만,
실제로 여러개의 인자를 받아올때는, 헷갈리게 됩니다

args를 사용할 경우

이렇게 여러 숫자를 갖고 올때 숫자들을 tuple로 감싸서 가지고 옵니다

보기에도 깔끔하고, 숫자가 더해지더라도 상관없이
계속 사용가능한 함수가 됩니다

만약 위치가 바뀌게 된다면?

이번의 경우에는 TypeError가 발생하게 됩니다

*args의 경우 가지고 오는 인자의 숫자가 정해지지 않았을 때
사용하는데 args에서 모든 인자들을 tuple로 묶어서 사용하기 때문에

*args 뒤에는 kwargs가 와야 하지만
지금의 경우에는 kwargs가 받아 들일 수 있는 타입의 인자가 아니기 때문에
TypeError가 발생하게 됩니다

TypeError

연산이나 함수가 부적절한 형의 객체에 적용될 때 발생합니다. 연관된 값은 형 불일치에 대한 세부 정보를 제공하는 문자열입니다.

파이썬 에러의 모든것

https://docs.python.org/ko/3/library/exceptions.html#TypeError

Kwargs

Keyword arguements 의 줄임말로,

키워드가 있는 인자 입니다

이것또한 패킹을 해서 인자들을 가지고 오게 되는데

*args와는 다른점이 있다면 dictionary 형태로 가지고 온다는 것입니다

kwargs는 dictionary

트럭을 만들어 보죠

args와 사용법은 거의 비슷하며, 사용하는 이유도 비슷한데

다른점이 있다면 가지고온 타입을 보면 dictionary 타입을 가지고 옵니다

개인적인 의견

저같은 경우에는 이렇게 args, kwargs를 사용하게 된다면
docstring을 사용해서 설명을 덧 붙여 주는걸 좋아합니다

다른 작업을 할때, vsc의 경우 여기에 들어가는 인자가 무엇인지
키워드 인자가 무엇인지 설명도 되고,

한눈에 보기에도 좋아보여서요 ... 👍

packing와 unpacking

위에서 살펴봤던

def my_function(*args):
	pass

이외에도 사용하는 부분이 또 있습니다

함수 내에서 사용하게 되면 packing이 되지만
함수 밖에서 사용하게 되면 unpacking의 의미로 쓰입니다

혹시 아까 봤던것과 차이가 보이시나요??
한번 생각해보시고
.
.
.
.
.

네 .. 바로 인자로 list가 들어간 경우 인데요

이렇게 list가 들어가게 되버리면서 함수가 사용할 수 없게 됬습니다

arguements에 *[ 난 list ] 이런식으로 *를 붙여주게 되면
unpacking이 진행되어 실제로 들어가는 숫자는

튜플로 이루어진 ([2, 3, 4])가 아닌 (2, 3, 4)가 되게 됩니다

*을 붙이지 않는다면?

리스트를 튜플로 감싼형태가 됩니다
kwargs 도 마찬가지로 똑같이 사용 가능합니다

**단! 차이가 있다면 unpacking은 args 와 kwargs 둘다 *로만 이루어집니다.

args와 kwargs의 순서


def my_function(**kwargs, *args):
	pass

어색한가요?

저는 순서를 알기전까지는 별이 2개 다음에 1개 오면 어색해서
습관적으로 args 다음에 kwargs를 썻엇습니다

그 외에도 *args를 인자 앞에 쓰면 안되는 이유를 알아볼게요

*args의 위치

*args의 경우 정해지지 않는 값을 사용한다 했는데
간단하게 설명하면 아직 몇개인지 정해지지 않았기 때문에
*args의 뒤에오는 인자에 대해서는 파이썬이 인지를 못합니다

# 1번
def my_function(name, age, *args):
	pass
# 2번
def my_function(name, *args, age):
	pass

1번의 경우

  1. name, age 두개의 인자를 가지고
  2. *args 즉 두개의 인자 뒤에있는 모든 인자를 가지고 온다

2번의 경우

  1. name의 위치에있는 인자를 가지고 온다
  2. *args 즉 모든 인자를 다 가지고 온다
  3. age는 그럼 할당되는 인자가 없게 됩니다

age : 내껀...??😭

이렇게 위에있는 함수의 경우 정상적으로 작동하지만,

아래 있는 2번의 함수는 TypeError이 발생하고,
age keyword-arguments가 없다고 나옵니다

**kwargs를 사용한 적이 없는데 키워드 인자를 찾습니다

age를 **kwargs로 인식을 하는데 왜 그런지 알아 볼겠습니다

**kwargs의 위치

아까 age에게 인자를 주고 싶다면

이렇게 ** 를 붙여 kwargs 라고 파이썬에게 말해주면 됩니다

*args 와 **kwargs 는 이름이 바뀌어도 사용 가능합니다

위에 말은 **를 붙이면 키워드 인자로 인식을 하고,
*를 붙이면 가변인자로 인식을 한다는 뜻입니다

전체적인 위치

값이 정해져있지 않은 파라미터

값이 정해져있는 파라미터

*args

**kwargs

순으로 적어주시면 됩니다


함수인자, 변수는 직관적이어야 한다

말 그대로 직관적인 코드를 짜는게
코드는 소통의 도구라고 생각하기 때문에, 누가 보던 알아볼 수 있는 코드가
좋은 코드라고 생각 합니다

PEP20에 대해서 궁금하신 분은 여기로 ..

https://www.python.org/dev/peps/pep-0020/

좋았던 점

에러에 대해서 무슨 에러인지
왜 발생하는지, 어떤 종류의 에러가 있는지

에러가 발생하면 이해는 하고 있엇지만, 어떤 에러가 있는지 찾아 본적은
없었던 것 같습니다

공부할 방향을 잡아준 wecode멘토 님들 덕분에 많은 걸 배우고 있습니다

감사합니다 🔥🔥🔥

profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

3개의 댓글

comment-user-thumbnail
2020년 12월 18일

그저 감탄 뿐..

1개의 답글