파이썬에서 함수는 매우 쉽게 느껴졌다. 그래서 중요한 부분, 생각하지 못한 부분 위주로 복습을 하였다.
그렇기 때문에 실제 파이썬 코딩도장의 내용 순서가 좀 달라질 수는 있다.
📖 UNIT 29. 파이썬 함수
📒함수 독스트링 (documentation strings)
우선, 독스트링이란 함수의 사용법이나 그런 설명을 담아놓은 문자열을 의미한다.
def a():
'''a is mm0ck3r'''
pass
위와 같은 함수를 만들어보자.
이렇게 함수에 대한 설명부분을 담고있다. help(a) 위와 같으 방법을 사용해도 된다.
📒함수의 호출 과정 알아보기
함수는 어떻게 호출되고 어떻게 다시 원래 함수로 돌아가질까. 리버싱 공부를 하면서 대충 알기는 했지만, 파이썬에서도 한 번더 공부를 해보자.
def mul(a, b):
c = a * b
return c
def add(a, b):
c = a + b
print(c)
d = mul(a, b)
print(d)
x = 10
y = 20
add(x, y)
이 코드는 코딩도장에 있는 코드이다. 천천히 살펴보자면, 먼저 x와 y에 값을 할당해주고 add함수를 호출한다.
이후 add함수에서 mul함수를 또 호출한다.
프로그램 시작 => add()함수 호출 => mul()함수 호출 => mul()함수 탈출 => add()함수 탈출 => 원래함수 복귀
개인적으로 리버싱 핵심원리의 스택프레임이 더 잘 설명한다고 생각한다. 분석을 쉽게 하고 싶으면 줄번호가 붙어있는게 좋다.
먼저 프레임이라는 개념을 이해해보자. 프레임은 메모리에서 함수와, 함수에 속한 변수가 저장되는 독립적인 공간이다.
특히 함수 전체에 접근할 수 있는 프레임을 전역 프레임이라고 한다. (Global Frame)
첫 번째 줄 부터 생각을 해보자. 함수를 선언해주고 있다. mul()함수, add()함수를 선언해주고 x, y 변수에 값을 할당해준다.
이후에 add()함수를 호출하게 된다.
mul | |
add | |
x | 10 |
y | 20 |
만약 12번째 줄까지 실행이 되었다면, 전역 프레임은 위와 같은 형태를 띄고 있을 것이다.
여기서 이제 add함수의 스택 프레임이 형성될 것이다. 그 때는
mul | |
add | |
x | 10 |
y | 20 |
a | 10 |
b | 20 |
c | 30 |
이렇게 위의 전역프레임이 있고, 밑의 add()함수에서 스택프레임을 형성하게 된다. mul()함수를 또 호출 하므로 스택프레임이 하나 더 형성된다.
mul | |
add | |
x | 10 |
y | 20 |
a | 10 |
b | 20 |
c | 30 |
a | 10 |
b | 20 |
c | 200 |
밑에 한 개 더 생긴 스택프레임은 mul() 함수 내에서 생긴 스택프레임을 의미한다.
위와 같이 스택프레임이 형성되고, mul()함수가 끝났을 때 mul의 스택프레임에서 c는 add()의 d로 올라가게 된다.
mul | |
add | |
x | 10 |
y | 20 |
a | 10 |
b | 20 |
c | 30 |
d | 200 |
그래서 위와같은 구조를 띄게 된다.
그리구 끝나게 된다. 전역프레임은 파이썬이 끝날 때 사라지게 된다.
c언어에서는 어셈블리어로 직접 스택프레임을 공부해봤는뎅 파이썬에서는 좀 더 자세히 다음에 연구해봐야겠다.
📖 UNIT 30. 위치 인수와 키워드 인수
📒위치 인수와 리스트 언패킹 사용하기
print(10, 20, 30)
위와 같은 방법으로 인수를 넘기는 방식을 위치인수라고 한다. 한마디로 인자(인수?)를 그냥 넘기는 순서의 방법을 의미하는 것 같다.
리스트나 튜플 안에 있는 값들을 인수로 사용하고 싶을 수도 있다.
a = [10, 20, 30]
b = (10, 20, 30)
print(*a)
print(*b)
위와 같이 '*' 이 문자를 리스트나 튜플 앞에 분여준다면 인수로 사용할 수 있다.
딩동댕동 그럼 이런 방식은 왜 사용하는걸까. 바로 인자의 갯수가 정해지지 않은 함수에서 사용이 된다.
print 함수는 인수가 한개, 두개, 세개 ... n개가 들어가도 상관이 없다. 그렇기 때문에 이런 방법으로 인수를 넘기는 것이다.
📒키워드 인수 사용하기
위의 위치인수 방법을 사용할 때 인수마다 사용되는 용도가 다르다면, 그 순서를 외울 때 어느정도 힘들어질 것 같다.
이를 방지하기 위해 키워드 인수를 사용하는 것이다.
personal_info('홍길동', 30, '서울시 용산구 이촌동')
personal_info(name='홍길동', age=30, address='서울시 용산구 이촌동')
그래서 위와같이 쓸 수 있다.
위의 경우는 딕셔너리로 값을 넘길 수도 있다.
하지만 딕셔너리는 쌍으로 이루어져 있기에 *를 두번 써야한다.
📖 UNIT 31. 재귀함수
재귀함수로 팩토리얼을 구해보자.
f(n) = f(n-2) + f(n-1) 이다.
성공했다.
팩토리얼은 기초이니 여기서 끝내겠다.
'스터디 그룹 > ProjectH4C' 카테고리의 다른 글
ProjectH4C 1개월 2주차 과제 (UNIT 34, 35, 36, 37) (0) | 2021.01.31 |
---|---|
ProjectH4C 1개월 2주차 과제 (UNIT 32, 33) (0) | 2021.01.31 |
ProjectH4C 1개월 2주차 과제 (UNIT 27, 28) (0) | 2021.01.29 |
ProjectH4C 1개월 2주차 과제 (UNIT 25, 26) (0) | 2021.01.28 |
ProjectH4C 1개월 2주차 과제 (UNIT 24) (0) | 2021.01.28 |