Python 기초 - 함수 보충 정리

ID짱재·2021년 6월 14일
0

Python

목록 보기
19/39
post-thumbnail

🌈 함수 보충 정리

🔥 함수의 기본 개념

🔥 진역변수와 전역변수 이해

🔥 재귀함수(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 = def print() 된 것과 같음
output('hello python') # 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)) # 100
print(b(10)) # 1000
print(c(10)) # 10000

2. 지역변수와 전역변수 이해

  • addx() 함수 내에 있는 x라는 변수는 외부에 있는 변수 x에 접근은 가능하지만, 영향을 끼칠 수 없음
x = 10
def addx():
    x += 10
addx()
print(x)
# UnboundLocalError: local variable 'x' referenced before assignment
  • Incapsulation: 함수 안에서 함수 밖에 변수로 접근은 가능하나 영향을 끼치지 못하게 캡슐화 되어 있음
x = 10
def addx():
    y = x + 10
    return y
print(addx()) # 20
print(x) # 10
  • 함수 안에서 함수 밖에 변수를 제어하기 위해서 함수 안으로 변수가 들어오는 방법은 파라미터 뿐이며, 함수 안에서 함수 밖으로 값을 보내는 방법 또한 return 뿐이 없음
  • 단, 외부에 있는 x라는 변수의 값을 함수 내에서 접근하여 활용하고 return을 통해 내보내는 것 뿐이지 x 자체를 수정한 것은 아님
x = 10
def addx(x):
    y = x + 10
    return y
print(addx(x)) # 20
print(x) # 10
  • 함수 안에서 함수 밖에 변수에 영향을 끼치길 원한다면, global을 통해 전역 변수로 사용하면 됨
  • 즉, 함수 내에 지역변수를 전역변수로 만든다는 것은 Incapsulation으로 부터 해방시키는 것
x = 10
def addx():
    global x
    x += 10
addx()
print(x) # 20
  • x를 지역변수로 사용했을 때와 전역변수로 사용했을 때의 차이점
# 지역변수로 사용했을 때
x = 10
def addx():
    x = 100000 # 지역변수
    return x
print(addx()) # 100000
print(x) # 10
# 전역변수로 사용했을 때
x = 10
def addx():
    global x # 전역변수
    x = 100000
addx()
print(x) # 100000
  • 단, x라는 변수가 리스트형일 때는 예외 사항으로 global을 통해 전역변수로 지정하지 않아도, 접근 및 제어를 할 수 있음
x = [1,2,3]
def addx():
    x[0] = 10000 # 전역변수로 선언하지 않았는데도, 함수 밖의 변수에 접근 뿐아니라 영향을 미침
addx()
print(x) # [10000, 2, 3]
  • 리스트를 l이라는 파라미터로 전달하였을 때도 마찬가지임
  • 파라미터로 전달한 l과 함수 외부에서 사용한 x의 id값을 확인하면 일치하는 것을 볼 수 있음
x = [1,2,3]
def addx(l):
    l[0] = 10000 
    return id(l)
print(x) # [10000, 2, 3]
print(addx(x)) # 140639869825408
print(id(x))   # 140639869825408

3. 재귀함수(recursion)

  • 1을 출력하는 print_1 함수 안에 다시 print_1() 함수를 호출하게되면, 무한 반복되다 오류 메시지를 반환
def print_1():
    print(1)
    print_1()
print_1()
# RecursionError: maximum recursion depth exceeded while calling a Python object
  • 최대 재귀 깊이 확인하기 : 996까지 출력된 뒤 오류 반환
  • sys.setrecursionlimit을 사용하여 재귀함수의 깊이 제한을 해제 가능
def recursion_deap(count):
    print(count)
    recursion_deap(count+1)
recursion_deap(1)
  • factorial 기능 구현
def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)    
print(factorial(5)) # 120
"""
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
"""
  • sigma 기능 구현
def sigma(n):
    if n == 1:
        return 1
    return n + sigma(n-1)
print(sigma(10)) # 55
"""
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
"""
profile
Keep Going, Keep Coding!

0개의 댓글