def func(a, b, c='C'):
print(a,b,c)
func(1,2,3) # 1 2 3
func(1,2) # 1 2 C
func(1, b='비', c='씨') # 1 비 씨
l = [1,2,3]
func(*l) # 1 2 3
def add(x,y):
return x+y
print(add(2,3)) # 5
함수
파이썬의 함수
함수호출연산을 적용시킬 수 있는 콜러블형 객체 <class 'function'> 괄호() 붙여서 실행시킬 수 있다는 뜻.
파이썬의 실행 단위인 코드블럭의 일종
함수 정의
def 함수이름( 매개변수 0개이상 ) : 함수바디
함수 바디는 함수 정의 때 실행되지 않고 호출 때마다 실행된다.
이름이 같은 함수를 정의하면 에러는 안 나고 그냥 나중 것으로 덮어써진다. 변수도 새 값으로 걍 덮어써지잖아
매개변수
기본 매개변수
def func(a,b,c)
여타 언어들에서 하듯 매개변수들을 나열한다.
def func(a,b,c):
print(a,b,c)
func(1,2,3) # 1 2 3
func(1,2 ) # 에러: c에 해당하는 인자가 없다
func(1,2,3,4) # 에러: 필요 이상의 인자 수
위치전용 매개변수, 키워드전용 매개변수
def func(a,/,b,*,c)
매개변수 목록 중에 /나 *를 넣는다. (둘 중 하나만도 됨)
(위치전용, /, 기본, *, 키워드전용) 순서 지켜서
# a: / 앞에 있으므로 위치로만 인자가 넣어진다.
# b: 위치 방식, 키워드 방식 둘 다 되는, 기본 형태의 매개변수
# c: * 뒤에 있으므로 키워드로만 인자가 넣어진다.
def func(a, /, b, *, c):
print(a,b,c)
func( 1, 2, 3 ) # 에러: c는 키워드로만 인자가 넣어진다
func( 1, 2, c=3 )
func( 1, b=2, c=3 )
func( a=1, b=2, c=3 ) # 에러: a는 위치로만 인자가 넣어진다
가변 위치 매개변수
def func(*a)
앞선 매개변수들이 인자 하나씩 먹고 남은 위치인자들(키워드전용 인자 나오기 전까지의 모든 인자)를 모두 모아서 튜플 형태로 받는다.
def func(*Q):
for x in Q:
print(x, end=' ')
func(1,2,3) # 1 2 3
위 문단에서 * 뒤에 키워드전용들이 나오듯; 이 *매개변수 뒤에도 키워드전용들만 나온다.
*얘 가 위치인자들 다 먹었으니까 그 뒤의 위치 매개변수가 먹을 게 안 남음.
가변 키워드 매개변수
def func(**a)
대응되는 이름의 매개변수가 없는, 나머지 키워드인자들을 모두 모아서 딕셔너리 형태로 받는다.
이 **매개변수 뒤에는 더이상 매개변수가 못 나온다.
def func(a, c, **W): # a, c가 아닌 키워드인자들은 모두 W에
print(W) # **W로 받은 거만 출력하면
func(a='에', b='비', c='씨', d='디') # {'b': '비', 'd': '디'} (a,c 빼고 다 나옴)
매개변수 기본값
def func( a=기본값 )
매개변수에 기본값을 지정한다. 인자를 넣지 않을 경우; 에러 없이, 인자 대신 기본값이 쓰인다.
def func(a, b, c='C'): # c의 기본값 'C'
print(a,b,c)
func(1,2,3) # 1 2 3
func(1,2 ) # 1 2 C
func(1 ) # 에러: b에 인자도 기본값도 없어서
(기본값 없는 매개변수들, 기본값 있는 매개변수들) 순서대로 쓴다
def func(a, b='B', c): pass # 에러
기본값은 함수가 정의될 때 한 번만 설정되지만; 그럼에도 함수 호출 때마다 기본값이 다르게 나올 수도 있다. 예를 들어; 기본값이 리스트이면 매개변수의 기본값은 그 리스트를 가리키고, 그 리스트의 요소가 하나 바뀌면 그 다음 함수 호출 때 함수는 그 요소가 바뀐 리스트를 참조한다.
도큐멘테이션문자열(독스트링)
함수 바디 시작하자마자 '''따옴표 세 개 문자열로 이게 뭔지 설명하기'''
데코레이터
@데코레이터0개이상 def 함수이름( 매개변수 0개이상 ) -> 어노테이션 : 함수바디
@데코레이터 @데코레이터(뭐시깽) def 함수이름( 매개변수, 매개변수, 매개변수 ) -> 어노테이션 : 어쩌구 저쩌구
??? 여기수정
어노테이션
함수의 매개변수와 반환형 힌트
파이썬 어노테이션innerLink_84데코레이터
정의된 함수를 추가가공
파이썬 데코레이터innerLink_108함수 호출
콜러블객체( 인자 0개이상 )
콜러블객체( 컴프리헨션 1개만 )
컴프리헨션을 넣으면 컴프리헨션이 생성하는 제너레이터의 멤버들이 자동으로 언패킹돼서 인자목록처럼 들어가는 게 아니라 그냥 제너레이터 한 개가 인자로 들어간다. 해당 제너레이터를 인자 중 하나로 넣고싶을 땐 컴프리헨션을 괄호로 감싸서 제너레이터 표현식으로 만든다.
인자
위치 인자
func( 1,2,3 )
여타 언어들에서처럼; 함수의 매개변수 순서에 맞게; 각 매개변수에 대응하는 인자를 순서대로 나열한다.
def func(a,b,c):
print(a,b,c)
func(1,2,3) # 1 2 3
언패킹으로 위치 인자 넣기
func( *l )
이터러블 객체 이름 앞에 *를 붙여서 인자로 넣는다. 그 위치에 항목들을 나열한 것과 같다.
l = [1,2,3]
func(*l) # 1 2 3
l = 10, 20
func(*l, 999) # 10 20 999
키워드 인자
func( a=1 )
어느 매개변수에 해당하는지 매개변수이름 = 인자 꼴로 표시한다.
식별자를 특별히 적어줬으므로 나열순서는 상관없다. 다만; 위치인자들보단 뒤에 나온다. (위치 인자들, 키워드 인자들) 순서로
def func(a,b,c):
print(a,b,c)
func( 1 , b='비', c='씨') # 1 비 씨
func(a='에', b='비', c='씨') # 에 비 씨
func(c='씨', a='에', b='비') # 에 비 씨
func(a='에', c='씨', 2 ) # 에러: 키워드 인자가 뒤에, 위치 인자가 앞에 나와야 한다.
func( 2 , a='에', c='씨') # 에러: 첫째 인자가 a로 해석되는데 키워드인자로 a가 또 지정돼서
언패킹으로 키워드 인자 넣기
func( **dict )
딕셔너리 객체 이름 앞에 **를 붙여서 인자로 넣는다. 그 객체의 항목들을 각각 추가로 인자로 넣은 것과 같다.
d = {'a': '에', 'b': '비', 'c': '씨'}
func(**d) # 에 비 씨
반환(return문)
return 표현식, 표현식, 표현식, …
return 표현식
return # None을 반환
흔한 반환문