이 글을 보기 전에 봐주세요!
- syntax error : 함수 선언 단계에서 parameter의 순서가 잘못되면 나오는 error
- type error : 선언시 parameter가 잘못 되어도 error가 발생하지 않을 수 있다. 이경우 함수사용시 type error가 뜬다.
def add(*args , a, b):
print(args,a,b)
add(1,2,3,4,5)
이런경우 아래 와 같은 error가 발생한다.
add() missing 2 required keyword-only arguments: 'a' and 'b'
이유는 *args 에서 모든 arguments를 튜플화해서 다 가져갔기때문에 a,b를 처리할 값이 남아있지 않아서 이런 오류가 발생한다.
결국 arguments 처리순서와도 연관되어있다. 아래에서 자세히 다뤄볼 예정이다.
!!!!! 이글의 용어들은 영어로 나와있습니다.
저는 파이썬에서 실행하는 내장함수나 자료형이 아닌경우 블로길 할때 한글로 씁니다.
(대체적으로 영어로된 용어들이 한글보다 더 깁니다 ㅠㅠ)
하지만 parameter들은 영어 단어로써 직관적인 키워드들을 생각하면서 보면 좀더 이해가 좋을것 같아 영어를 사용했습니다.
- positional
- default
- only
- keyword
- variable
을 잘 생각해보시면서 이해하면 편합니다.
type of parameter
- Special Parameter
- Regular Positional Arguments
- default Arguments
- variable Length Positional Arguments
- Keyword-Only Arguments
- Non-Default Keyword-Only Arguments
- Keyord-Only Arguments With Defaults
- Variable Length Keyword Arguments
Special Parameter
특수 매개변수에는 두종류가 있다 "*" , "/"
아래의 코드는 정말 좋은 예시 같다. (파이썬 공식 사이트에서 퍼옴!)
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
----------- ---------- ----------
| | |
| Positional or keyword |
| - Keyword only
-- Positional only
먼저 이 두개의 특별 매개변수를 사용하는것이 아닌 구분점으로 써 작용한다.
"/" 앞에 있는 매개변수들은 Keyword를 사용할 수 없으며
"*" 뒤에 있는 매개변수들은 Positional를 사용할 수 없다. (단독으로 사용하지 않아도 적용된다.)
이후에 나올 (*args , **kwargs 를 사용하면 이후에는 Positional이 사용이 불가능하다.)
이분법적 시각으로 parameter 바라보기
- Variable Length 인가? Non-Variable Length 인가?
- Keyword 인가? Non-Keyword 인가?
- Default 인가? Non-default 인가?
- Positional인가? Non-Positional인가?
Variable Length & Non-Variable Length
길이가 정해져있는가(N-Var)? 정해져있지 않는가(Var)? 에 대한 차이점이다
특징 : *를 사용해서 언패킹한후 값을 사용한다.
입력값을 넣지않아도 오류가 발생하지않는다.
- *args 는 빈튜플을 반환
- **kwargs 는 빈 딕셔너리를 반환
Keyword & Non-Keyword
keyword가 있냐 없냐로 나뉜다.
keyword가 없는 경우는 두가지다.
- *args 일 경우
- 선언시 "/ "앞에 있던 매개변수들
Default & Non-default
Default는 기본값으로 함수 선언시 지정해준다.
실행시 인자를 넣지 않을 경우 자동으로 Default값이 할당된다.
***Default 값의 특징!!!
기본값은 오직 한 번만 실행된다. 리스트나 딕셔너리나 대부분 클래스의 인스턴스와 같은 가변 객체일 때 차이가 보인다.
예를 들어, 다음 함수는 계속되는 호출로 전달된 인자들을 누적합니다:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
#결과
[1]
[1, 2]
[1, 2, 3]
Positional & Non-Positional
Positional - 위치라는 의미지만 인자,매개변수 등에선 연속된 수가 나오기때문에 "순서"라는 개념으로 많이 인식하고있다.
Positional을 확장해서 생각해보면 "갯수"의 영역에 도달할 수 있다.
a,b,c,d 순서대로 선언하였다면 인자를 넣을때도 a,b,c,d를 순서 대로 넣어야한다.
더 많거나 적다면 오류가 발생한다.하지만 이 글에는 어패가 있다.
Variable Length Positional Arguments 라는 것이 존재하는데 Var Len과 포지션이 동시에 존재한다.
뒤에서 자세히다뤄 보자.
굉장히 좋은사진이 있다.. 하지만 조금 뭔가 부족한거같다. special parameter가 존재하지 않는다.
def f(pos1, pos2, /, pos3 = 0,pos,4, *, kwd1 , kwd2 =0):
----------- -------------- ----------
| | |
| Positional or keyword |
| - Keyword only
-- Positional only
이두개를 합쳐서 보면 좋을 것 같다.
위의 사진에는 '/' 가 존재하지 않기때문에 Regula Positional parameter 앞에
pos1,pos2,/
위의 3가지 코드가 온다고 보면된다.
우리가 기본적으로 알고있는 Regula Positional parameter 도 결국 키워드를 사용할수 있다. 이렇게
def p(p1,p2):
print(p1,p2)
p(p2 = "p2" , p1 = "p1")
#결과
"p1 p2"
또한 중간에 형광색인 Variable Length Positional Arguments = *args 가 "*"의 역할을 한다고 보면 된다.
파이썬이 arguments를 읽는 순서
- positional(non-default) arguments
- default arguments
- variable length positional arguments (=*arg)
- keyword-only arguments 4-1. non-default keyword-only arguments 4-2. default keyword-only arguments
- variable length keyword arguments (=**kwargs)
함수 사용시 인자 순서
인자들을 읽어들이는 순서는 존재한다.
다만 중요한것은 Non-Variable Length Keyword Arguments 이다.
즉 **kwargs 형태를 제외한 키워드 인자들.
키 = 값 형태로 이루어진 형태이다. 이뒤에는 **kwargs 의 인자를 제외하고 존재할 수 없다.
예를 들어보자
f(a=1 ,2,3,4,5,6,7)
파이썬이 이 코드를 알아볼때 a 를 1이라고 생각할까? (1,2,3,4,5,6,7)이라고 생각할까?
1,2,3,4,5,6,7 로 인식할 것이다 그래서
f(2,3,4,5,6,7,a=1)
형태로 넣어줘야한다.
'Python > 기초문법' 카테고리의 다른 글
lambda expressions & list Comprehensions (set,tuple,dict) (0) | 2022.06.09 |
---|---|
Package & Module (0) | 2022.05.29 |
Set vs Dictionary & List vs Tuple (0) | 2022.05.26 |
2달 공부하고 다시쓰는 파이썬 기본 문법 (0) | 2022.05.25 |
(39)파이썬 내장함수 , 연산자 우선순위 ,이스케이프 시퀀스 (0) | 2022.05.09 |