함수를 할 때, 혼동됐던 거 Parameter & Arguments였다.
Parameter : 함수와 메서드 입력 변수 명
Argument : 함수와 메서드 입력 값
함수를 정의할 때 사용하는 것이 Parameter, 호출할 때 사용하는 것이 argument이다.
def aa(a,b,c) :
라고 함수를 작성하면 일반적으로 파라미터 순서에 맞게 값을 전해준다.
하지만, 순서에 맞추어서 전해주지 않을 때 이 방법을 사용한다.
이름의 경우, 라스트네임이 성/퍼스트네임 순서가 우리에게 익숙하다
이럴 때 이름/성 순서로 인수를 줘야하는데, 실수할 경우가 있을 때
이럴 때 키워드를 이용한다.
그렇기 때문에 가독성이 높아 실수하기 힘들다.
다만 매번 저렇게 '파라미터'='변수'를 치기에 힘든 부분이 있음
기존의 함수 인수 설정 방식과 위 방식을 합친 것이다.
매번 파라미터를 찍어준 방식이 아닌, 함수 작성자의 마음대로기 때문에 순서를 꼭 맞춰줘야 한다.
함수의 파라미터는 이름/성 순으로 받는데, 나는 실행할 때 성/이름 순으로 실행했다.
이름 자리에 'lee'라는 인자를 준 건 그럴 수 있어도,
성이 들어가야할 자리에 이름은 'ky'라고 선언했으니, 함수 입장에서도 말도 안되는 상황이
발생하는 것이다.
그래서 'first_name'이 중복 인자가 들어왔다고 오류가 발생했다.
파라미터에 기본 값을 정해줄 수 있다.
함수 실행될 때 마다 항상 기본이 되기 때문에, 호출 될 때 반드시 안 넘겨도 됨
예를 들어, 아이의 이름을 지을 때 성은 고정되고 돌림자를 쓰는 경우가 많다.
이럴 때, 성을 'lee'로 고정한다면, 함수 실행할 때 이름만 인자로 하면 되는 것이다.
그리고, 디폴트로 정의된 파라미터는 기본 파라미터보다 먼저 있으면 안된다.
예시를 보면 Non-default argument follows default argument
(first_name)이 (last_name) 뒤에 있다고 친절히 설명을 해준다.
age와 *args 라는 파라미터의 순서를 바꿨더니, 1개의 키워드(나이)가 누락(miss)되었다고 한다.
파라미터 순서도 바꾸고, 인자의 순서도 바꿨는데 왜 오류가 나지?
이거는 *args의 속성에 답이 있다.
*args는 우리가 파라미터를 받을 때 몇개를 받을지 몰라서, 무엇을 받을지 몰라서 사용한다.
즉, 파라미터를 유연하게 받을 수 있어서 개수가 정해지지 않았으니,
우리 입장에서야 마지막에 20이 들어갔으니 나이겠구나.. 하겠지만
함수 입장에서는 20이라는 것 자체도 *args의 일종이기 때문이다
마찬가지로 왜 에러가 나고 '**kwargs' 이거는 뭘까?
뒤에 기술할 예정이지만, *args와 달리 파라미터를 'key-value'형태로 받겠다는 뜻이다.
첫 번째 사진을 보면, 이름은 정우성 / 나이는 20 / 주소는 서울로 받았기 때문에
키 값이 'mobile'이고 값이 '010~' 인 딕셔너리 형태의 인자가 **kwargs로 되는 것이다.
그리고 아까 설명한 invalid syntax 라고 유효하지 않은 문맥이라고 뜨는 이유는
문법적으로 이걸 허용했을 때, **kwargs가 들어가면 변수 입력에서
**kwargs 이후로 'key-value'로 들어오는 변수는 kwargs의 것으로 생각할 것이기 때문이다.
*args 의 위치를 맨 앞으로 가져왔다.
args가 몇 개일 줄, 무엇일 줄 모르기 때문에 20도 args로 들어가서 나이에서 걸리는 것이다.
그래서 나이에 20이라고 친절하게 해줬는데도 오류가 났다.
키워드 방식이 앞에 나와서 발생한 오류이다.
첫 번째 : 함수의 인수 인식
일반적으로 파라미터를 선언할 때, 아래 함수처럼 변수만 설정하는 경우가 많다.
def func(a,b,c) :
그리고 함수 작성 후 실행할 때 인수를 넣고 func(10,'a',3) 같이 실행하는데
만약 def func(val=10, b, c) : 라고 선언을 하고 인수를 넣어야 하는 함수라면
함수 호출 시 입력 인수는 선언한 것 보다 적은데,어떤 파라미터의 값인지 추가적인
로직이 필요하여 안된다고 생각했다.
두 번째 : nested function
함수가 중첩됐다는 의미로, 함수 안에 정의된 함수라고도 한다.
이후에 다룰 내용이지만, 간단하게 왜 굳이 두 번 쓸까에 대해 말하면
부모 함수의 변수나 정보를 유출하고 싶지 않기 때문이다.
함수에서 기본 값을 선언해버리면, 이 값은 모두에게 노출되는데
보안상의 문제가 생길 수 있기 때문이다.
우리가 기본적으로 함수의 인자를 선언하는 방식을 positional arguments라고 하는데,
이 다음으로 기본 값 설정해주는 Default Arguments
다음으로 하는 것이 Keyword-only Arguments 순서이다.
자세한 내용은 이미지를 참고하자