어떤 기능을 하는 코드들을 묶어 재사용하거나 알기 쉽게 하기 위해 쓴다.
기본 형태
def 함수 이름() :
문장
호출한다.
'함수를 불러와서 사용한다'는 뜻
매개변수
함수 호출 시 괄호 내부에 넣는 여러 가지 자료
def 함수이름(매개변수, 매개변수, ... ) :
문장
일반 매개변수
함수에 매개변수를 반드시 넣어줘야할 때 쓴다.
만약 함수를 만들 때 매개변수의 수와 함수를 호출했을 때 매개변수의 수가 다르다면 TypeError가 발생한다.
일반 가변 매개변수( *변수명 )
매개변수를 원하는 만큼 받을 수 있게 해준다. -> 매개변수를 생략하거나 무한히 넣을 수 있다.
가변 매개변수 뒤에는 일반 매개변수가 올 수 없다. -> 어길시 가변 매개변수가 어디부터 어디까지인지 알 수 없기 때문에 가변 매개변수 뒤에 일반 매개변수가 오면 일반 매개변수에 값이 들가지 않아서 TypeError가 발생한다.
가변 매개변수는 1개만 쓸 수 있다.
튜플로 값을 받아온다.
기본 매개변수 (함수선언시 변수명=기본값 )
매겨변수에 값이 입력되지 않으면 기본 값으로 처리 -> 매개변수를 생략할 수 있다.
기본 매개변수 뒤에는 다른 매개변수가 올 수 없다. -> 가변 매개변수와 마찬가지로 기본 매개변수가 생략됐는지 안됐는지 알 수 없기 때문에 그렇다. 어길 시 TypeError가 발생하거나 의도와는 다르게 작동할 수 있다.
키워드 매개변수 (함수호출시 변수명=값 )
가변 매개변수 뒤에 있는 매개변수를 사용하기 위해 매개변수을 지정해서 값을 입력해야하는 매개변수
일반 매개변수와 마찬가지로 가변 매개변수가 어디부터 어디까지인지 알 수 없기 때문에 사용한다.
특정 매개변수에 값을 넣어 사용하는 방법정도로 생각하면 된다.
매개변수 이름을 지정해서 입력하기 때문에 키워드 매개변수끼리는 순서를 섞어 넣어도 상관없다.
키워드 가변매개변수(함수선언시 **변수명 )(함수호출시 키=값, 키=값, ... )
키워드 매개변수를 원하는 만큰 받을 수 있게 해준다.
매개변수를 딕셔너리(dictionary)의 형태로 받아온다.
함수선언시 키워드 가변매개변수 뒤에는 어떤 매개변수도 올 수 없다.
요약 : 일반 매개변수 -> 일반 가변매개변수 -> 기본&키워드 매개변수 -> 키워드 가변매개변수
이런 식으로 함수 선언시 매개변수를 지정하는게 좋다.
일반 가변매개변수 뒤에 있는 매개변수는 키워드 매개변수 방식으로 써야 한다.
def repeat_print(value, n) :
print(value*n)
repeat_print("안녕", 3) # 안녕안녕안녕
# repeat_print("안녕") # TypeError: repeat_print() missing 1 required positional argument: 'n'
# repeat_print("안녕", "hi", 3) # TypeError: repeat_print() takes 2 positional arguments but 3 were given
def test1(*value, n) :
print(value*n)
test1("안녕", 1) # TypeError: test1() missing 1 required keyword-only argument: 'n'
def re_print(*values, n=2) :
for value in values :
print(value*n)
re_print("안녕") # 안녕안녕
re_print("안녕",3) # 3까지 가변 매개변수로 인식함
# 실행결과
# 안녕안녕
# 6
re_print("안녕", n=3) # 안녕안녕안녕 -> 키워드 매개변수
def test2(n=2, *values) :
for value in values :
print(value*n)
test2("안녕") # n에 "안녕"이 할당되고 values에는 아무것도 없기때문에 for문이 실행되지않고 끝나버림.
#아무것도 출력하지 않음.
test2(3, "안녕") # 안녕안녕안녕
def re_line_print(*values, n=2, l=1) :
for i in range(l) :
for value in values :
print(value*n)
re_line_print("안녕", l=2, n=3)
# 실행결과
# 안녕안녕안녕
# 안녕안녕안녕
def mixed_params( name, age=19, *args, address, **kwargs ) :
print("name :", name)
print("age :", age)
print("args :", args)
print("address :", address)
print("etc : ", kwargs)
mixed_params("Jack", 30, 'male','programer', mobile='11122220000', address='Jeju', email='jack@pro.net')
#실행결과
#name : Jack
#age : 30
#args : ('male', 'programer')
#address : Jeju
#etc : {'mobile': '11122220000', 'email': 'jack@pro.net'}
# age를 생략할 경우
mixed_params("Jack", 'male','programer', mobile='11122220000', address='Jeju', email='jack@pro.net')
#실행결과
#name : Jack
#age : male # 이런 경우 때문에 기본 매개변수는 가변 매개변수 뒤에 넣는 것이 좋다.
#args : ( 'programer', )
#address : Jeju
#etc : {'mobile': '11122220000', 'email': 'jack@pro.net'}
# address 값을 안 넣을 경우
mixed_params("Jack", 30, 'male','programer', mobile='11122220000', email='jack@pro.net')
# TypeError: mixed_params() missing 1 required keyword-only argument: 'address'
# 때문에 반드시 입력받아야하는 매개변수는 일반 가변 매개변수 앞으로 생략가능하거나 없어도 되는 값은 일반 가변 매개변수 뒤에 위치해서 default값을 정해주는게 좋다.
리턴값
함수를 호출하여 최종적으로 나오는 결과
함수 내 return 키워드를 리턴값을 만들 수 있다.
return을 쓰면 그 즉시 값을 반환하고 함수를 종료하기 때문에 return 뒤에 문장은 실행되지 않는다.
def return_test() :
print('a')
return
print('b')
return_test() # a만 출력됨
value = return_test()
print(value) # None -> 파이썬에서 없다는 의미
#####################
def factorial(n) :
result = 1
for i in renge(1, n+1) :
result *= i
return result
print( "1!:", factorial(1) ) # 1!: 1
print( "2!:", factorial(2) ) # 2!: 2
print( "3!:", factorial(3) ) # 3!: 6
print( "4!:", factorial(4) ) # 4!: 24
재귀 함수 (recusion function)
재귀는 자기 자신을 호출하는 것을 의미한다.
따라서 재귀함수는 자기 자신을 호출하는 함수를 의미한다.
def factorial(n) :
if n == 0 :
return 1
else:
return n * factorial( n-1 )
print( "1!:", factorial(1) ) # 1!: 1
print( "2!:", factorial(2) ) # 2!: 2
print( "3!:", factorial(3) ) # 3!: 6
print( "4!:", factorial(4) ) # 4!: 24
함수 데코레이터
대상 함수의 앞뒤에 꾸밀 부가적인 내용을, 혹은 반복할 내용을 데코레이터로 정의해서 손쉽게 사용할 수 있도록 한 것
기본 구조 예제
# 함수 데코레이터 정의
def test(function) :
def warp( ) :
print( '함수 시작' )
function( )
print( '함수 종료' )
return warp
# 데코레이터를 사용하여 함수 정의
@test
def hello( ) :
print( 'Hello~' )
# 함수 호출
hello()
# 실행결과
# 함수 시작
# Hello~
# 함수 종료
# hello()함수 호출 -> hello()함수를 매개변수로 하여 test함수 데코레이터 호출 -> wrap함수 정의하고 wrap함수를 호출하여 반환
'Python 파이썬 > 기초 & 내장모듈' 카테고리의 다른 글
python ) 모듈과 패키지 (0) | 2022.03.11 |
---|---|
python ) 예외 오류 처리 try (0) | 2022.03.11 |
python ) 이터레이터와 제너레이터, 참조 (0) | 2022.03.08 |
python ) 범위 자료형 range (0) | 2022.03.08 |
python ) 딕셔너리 dictionary (0) | 2022.03.08 |
댓글