🌈 함수 보충 정리
🔥 함수의 기본 개념
🔥 진역변수와 전역변수 이해
🔥 재귀함수(recursion)
1. 함수의 기본 개념
- 함수를 사용하면 코드를 재사용할 수 있으며, 실수를 줄일 수 있음
- 또한 함수를 통해 코드의 구조를 손쉽게 파악 가능함
1) 함수의 구조
- 함수를 호출 할 때, ( )안에 담긴 10이라는 값을 argument라 하고, 선언된 함수에서 argument를 받기 위해 준비한 r이라는 변수를 파라미터라고 부름
"""
def 👈 함수를 선언하는 키워드
get_circle 👈 함수 이름
get_circle(10) 👈 함수 호출
10 👈 아규먼트(전달되는 값)
r 👈 파라미터(전달 받은 값)
return 👈 함수 종료 및 결과 반환
"""
def get_circle(r):
res = (r ** 2) * 3.14
return res
print(get_circle(10))
2) 함수의 참조
- print 함수에 ()를 붙이면 호출이기 떄문에 ()를 제외한 채로 다른 변수로 받아낼 수 있음
- 이에 output이라는 변수로 받아 파라미터를 전달하면 print() 함수처럼 기능함
- ouput과 print가 같은 기능을하지만, 복사한 것이 아니라 참조를 통해 기능하는 것
- 즉, 본래 print() 함수의 기능이 존재하는 메모리 위치를 print가 가르키고 있었고, 이 print를 다시 ouput을 통해 가르키게 하는 로직임
output = print
output('hello python')
def one(n):
def two(value):
return value ** n
return two
a = one(2)
b = one(3)
c = one(4)
print(a(10))
print(b(10))
print(c(10))
2. 지역변수와 전역변수 이해
- addx() 함수 내에 있는 x라는 변수는 외부에 있는 변수 x에 접근은 가능하지만, 영향을 끼칠 수 없음
x = 10
def addx():
x += 10
addx()
print(x)
- Incapsulation: 함수 안에서 함수 밖에 변수로 접근은 가능하나 영향을 끼치지 못하게 캡슐화 되어 있음
x = 10
def addx():
y = x + 10
return y
print(addx())
print(x)
- 함수 안에서 함수 밖에 변수를 제어하기 위해서 함수 안으로 변수가 들어오는 방법은 파라미터 뿐이며, 함수 안에서 함수 밖으로 값을 보내는 방법 또한 return 뿐이 없음
- 단, 외부에 있는 x라는 변수의 값을 함수 내에서 접근하여 활용하고 return을 통해 내보내는 것 뿐이지 x 자체를 수정한 것은 아님
x = 10
def addx(x):
y = x + 10
return y
print(addx(x))
print(x)
- 함수 안에서 함수 밖에 변수에 영향을 끼치길 원한다면, global을 통해 전역 변수로 사용하면 됨
- 즉, 함수 내에 지역변수를 전역변수로 만든다는 것은 Incapsulation으로 부터 해방시키는 것
x = 10
def addx():
global x
x += 10
addx()
print(x)
- x를 지역변수로 사용했을 때와 전역변수로 사용했을 때의 차이점
x = 10
def addx():
x = 100000
return x
print(addx())
print(x)
x = 10
def addx():
global x
x = 100000
addx()
print(x)
- 단, x라는 변수가 리스트형일 때는 예외 사항으로 global을 통해 전역변수로 지정하지 않아도, 접근 및 제어를 할 수 있음
x = [1,2,3]
def addx():
x[0] = 10000
addx()
print(x)
- 리스트를 l이라는 파라미터로 전달하였을 때도 마찬가지임
- 파라미터로 전달한 l과 함수 외부에서 사용한 x의 id값을 확인하면 일치하는 것을 볼 수 있음
x = [1,2,3]
def addx(l):
l[0] = 10000
return id(l)
print(x)
print(addx(x))
print(id(x))
3. 재귀함수(recursion)
- 1을 출력하는 print_1 함수 안에 다시 print_1() 함수를 호출하게되면, 무한 반복되다 오류 메시지를 반환
def print_1():
print(1)
print_1()
print_1()
- 최대 재귀 깊이 확인하기 : 996까지 출력된 뒤 오류 반환
- sys.setrecursionlimit을 사용하여 재귀함수의 깊이 제한을 해제 가능
def recursion_deap(count):
print(count)
recursion_deap(count+1)
recursion_deap(1)
def factorial(n):
if n == 1:
return 1
return n * factorial(n-1)
print(factorial(5))
"""
factorial() 호출 과정
factorial(5) = 5 * factorial(4) => 120
factorial(4) = 4 * factorial(3) => 24
factorial(3) = 3 * factorial(2) => 6
factorial(2) = 2 * factorial(1) => 2
factorial(1) = 1
"""
def sigma(n):
if n == 1:
return 1
return n + sigma(n-1)
print(sigma(10))
"""
sigma() 호출 과정
sigma(10) = 10 + sigma(9) => 55
sigma(9) = 9 + sigma(8) => 45
sigma(8) = 8 + sigma(7) => 36
sigma(7) = 7 + sigma(6) => 28
sigma(6) = 6 + sigma(5) => 21
sigma(5) = 5 + sigma(4) => 15
sigma(4) = 4 + sigma(3) => 10
sigma(3) = 3 + sigma(2) => 6
sigma(2) = 2 + sigma(1) => 3
sigma(1) = 1
"""