파이썬에서 함수란 수학적 의미와 동일하다.
input -> [함수] -> output
📢 특정기능을 재사용하기위해 사용한다.
변수를 사용하는 이유(재사용)와 동일하다.
파이썬에서 기본으로 제공하는 함수
e.g.
input() / sort() / reverse() / clear() 등등
사용자가 직접 선언하는 함수
def 함수명 () : #선언구 실행구 함수명() #호출구
📢 함수명은 소문자로, 특수문자는 올 수 없다.
변수는 대부분 명사로, 함수는 동사로 쓴다.
📢 데이터를 받고자한다면 ()안에 매개변수를 넣어주면 된다.
#예시1
def add () :
n1 = int(input('n1 입력 : '))
n2 = int(input('n2 입력 : '))
print(f'n1 + n2 = {n1+n2}')
add()
📢 def 이후는 함수가 선언만 되어있으므로 사용하려면 add()로 함수 호출을 해주어야 한다.
#예시2
def add_fun (x,y) :
return x + y #return 반환한다
print(add_fun(1,2))
#실행구에서 print하지 않았으므로 호출구에서 print
즉, return으로 반환하는 값은 반환값이라고 하며 함수를 호출해준 바깥에 결과를 알려주기 위해 사용
return뒤에 print를 넣어도 출력되지 않는다.
이것을 dead code라고 한다.
def add_fun (x,y) :
return x + y
print('여기엔 뭘 넣어도 출력되지 않지롱')
print(add_fun(1,2)) #3
위의 예시1( 함수내에 print/return값 없음)와
예시2 (함수 내에서 return으로 호출부로 실행결과 반환 / 호출부에서 print) 모두
콘솔창의 찍히는 숫자가 같다고 하더라도,
그 의미는 엄연히 다르다.
return은 그 함수의 리턴값(반환값)이 된다.
그 함수자체를 대신한다고 말할 수도 있다.add_fun(1,3) = 4
반면,
print()는 리턴값과 관계없이
단순히 화면에 출력해주는 것일 뿐이다.
함수 실행 시 값이 출력되긴 하지만, 단순히 함수 내 print()구문이 출력되었을 뿐이고 함수의 리턴값은 None이다.
def 보다 간단하게 함수선언 가능
함수명 = lambda 매개변수 : 출력값
#def 사용시
def calculator (n1,n2) :
return n1+n2
print(calculator(1,2))
#lambda사용시
calculator = lambda n1,n2 : n1+n2
print(calculator2(1,2))
실행구에 또 다른 함수 삽입
순서대로 실행된다.
#구구단함수
def gugudan2() : #2
for i in range (1,10) :
print('2 * {} = {} '.format(i,(2*i)))
gugudan3() #2실행시 같이 실행
def gugudan3() : #3
for i in range(1, 10):
print('3 * {} = {} '.format(i, (3 * i)))
gugudan2() #1
gugudan2 함수안에 gugudan3 출력이 중첩되어있으므로 gugudan3까지 실행된다.
함수 호출 시 함수에 데이터를 전달할 수 있다.
def greet (매개변수) : print(f'{매개변수} 고객님 안녕하세요') #or return 매개변수 + ' 고객님 안녕하세요.' greet(인수) #or print(greet('인수'))
# print예시
def greet(customer) :
print(f'{customer} 고객님 안녕하세요')
greet('홍길동')
#홍길동 고객님 안녕하세요
#return예시
def greet(customer) :
return customer + ' 고객님 안녕하세요'
print(greet('홍길동'))
#홍길동 고객님 안녕하세요
📢 매개변수와 인수의 개수는 동일해야한다.
📢 매개변수가 정해지지 않은 경우 *(튜플)를 사용한다.
예시 ↓
#국어, 영어, 수학 점수를 입력받고, 입력받은 점수를 이용해서 총점과 평균을 출력하는 함수를 만들어보자
def print_score(*scores) :
sum=0
for score in scores :
sum += score
avg = sum / len(scores)
return sum , avg
kor = int(input('국어 점수 입력 : '))
eng = int(input('영어 점수 입력 : '))
math = int(input('수학 점수 입력 : '))
sum,avg = print_score(kor,eng,math)
print('총점 : {}'.format(sum))
print('평균 : {}'.format(round(avg,2)))
함수밖에 선언된 변수
📢 어디서나 사용가능하지만 함수 안에서는 수정할 수 없다.
함수 안에 선언된 변수로 함수 안에서만 사용 가능하다.
num_out = 10 # 전역변수
def print_num () :
num_out = 20 #지역변수
print(num_out)
print_num() #함수안의 지역변수 값 #20
print(num_out) #전역변수 값 #10
📢 지역변수를 함수밖에서 print 하면 함수가 정의되어있지 않으므로 error
global을 사용하면
함수안에서도 전역변수 값을 수정할 수 있다.
num_out = 10
def print_number () :
global num_out #함수안의 num_out과 함수 밖의 num_out이 같은게 됨
num_out = 20 #전역변수 10을 20으로 초기화 (=지역변수)
print(num_out) #지역변수
print_number() #함수안의 지역변수 값 #20
print(num_out) #함수밖에 지역변수를 global로 초기화한 값 #20
📁 실습
#사용자가 가로, 세로 길이를 입력하면 삼각형과 사각형의 넓이를 출력하는 함수
width = int(input('가로 길이 입력 : '))
height = int(input('세로 길이 입력 : '))
def print_area ():
global width
global height
triangle = width * height / 2
square = width * height
return triangle,square
triangle, square = print_area()
print('삼각형의 넓이 : {}'.format(triangle))
print('사각형의 넓이 : {}'.format(square))
함수안에 또 다른 함수가 있는 형태
#중첩함수를 이용한 calculator 함수
def calculator(n1,n2,operator) :
def add() :
return n1+n2
def sub():
return n1-n2
def mul():
return n1*n2
def div():
return round(n1/n2,2)
if operator == 1:
print(add())
elif operator == 2:
print(sub())
elif operator == 3:
print(mul())
elif operator == 4:
print(div())
while True :
n1 = int(input('n1 입력 : '))
n2 = int(input('n2 입력 : '))
operator = int(input('1.덧셈, 2.뺄셈, 3.곱셈 4.나눗셈 5.종료 : '))
if operator == 5 :
break
calculator(n1,n2,operator)
함수 안에 자기자신을 호출하는 함수
def factorial(n):
if n == 0 or n == 1:
return 1 # Base case
else:
return n * factorial(n - 1) # Recursive call
result = factorial(5)
print(result) # Output: 120