오늘은 강의 시간이 유난히 많았다. 그렇지만, 파이썬의 코어가 되는 부분이기에 강의를 유심히 들었다. 나머지는 다른 언어 공통이라 생략하겠다. 그 중에서 본인은 파이썬의 함수에 관해서 다뤄보고자 한다.
1. 파이썬의 함수의 특징
먼저, 함수에서 parameter를 전달하는 방식은 다음과 같다.
- 값에 의한 호출(Call by Value) : 함수에 인자를 넘길 때 값만 넘김, 함수 내에 인자 값 변경 시, 호출자에게 영향을 주지 않음
- 참조에 의한 호출(Call by Reference) : 함수에 인자를 넘길 때 메모리 주소를 넘김, 함수 내에 인자 값 변경 시, 호출자의 값도 변경됨
- 객체 참조에 의한 호출(Call by Object Reference) : 전달된 객체를 참조하여 변경 시 호출자에게 영향을 주지만, 새로운 객체를 만들 경우 호출자에게 영향을 주지 않는다.
파이썬은 Call by Object Reference라고 한다. 파이썬은 객체의 주소가 함수로 전달되기 때문이다. 그 예는 다음과 같다.
def spam(eggs):
eggs.append(1) # 기존 객체의 주솟값에 [1] 추가
eggs = [2,3] # 새로운 객체 생성
ham = [0]
spam(ham)
print(ham) # [0,1]
ham이 가리키는 주소가 있을 것이다. spam함수를 호출하면 이 때의 egg는 ham이 가리키는 주소와 동일하다. 그 다음에 append를 통해 원소 1을 추가하면 ham과 egg가 가리키는 값은 [0,1]이다. 그런데, 그 아랫줄에서 [2,3]이라는 새로운 객체를 생성했을 때, 그 객체의 주솟값이 할당된다. 또한, spam은 리턴값이 없고, ham은 여전히 [0,1]있는 주소를 가리키므로 최종 ham은 [0,1]이 나오게 되는 것이다.
2. 변수의 범위(Scoping Rule)
- 변수가 사용되는 범위 (함수 또는 메인 프로그램)
- 지역변수(local Variable) : 함수내에서만 사용
- 전역변수(Global variable) : 프로그램 전체에서 사용
def test(t):
print(x)
t=20
print("In function :",t) # 이때의 t는 새로운 주솟값을 가짐
x=10
test(x)
'''
10
In function : 20
'''
print(t) # 전역변수 t가 없으므로 오류
전역 변수는 함수에서 사용가능하다. 그러나, 함수 내에 전역 변수와 같은 이름의 변수를 선언하면 새로운 지역 변수가 생김
def f():
s="I love London!"
print(s)
s = "I Love Paris!"
f()
print(s)
'''
"I love London!"
"I love Paris!"
'''
만약에 함수 내에서 전역 변수를 사용 하고 싶으면 global 키워드를 사용하면 된다.
def f():
global s
s="I love London!"
print(s)
s = "I Love Paris!"
f()
print(s)
'''
"I love London!"
"I love London!"
'''
3. 재귀함수 (recursive Function)
- 자기 자신을 호출하는 함수
- 점화식과 같은 재귀적 수학 모형을 표현할 때 사용
- 재귀 종료 조건 존재, 종료 조건까지 함수 호출 반복
- 재귀 함수 예시
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
print(factorial(int(input("Input Number for Factorial Calculation : "))))
# Input Number for Factorial Calculation : 5
# 120
4. function type hint
- 파이썬의 가장 큰 특징은 dynamic typing, 즉, 자료형을 유동적으로 할 수 있다는 것이다. 그러나, 처음 함수의 사용자가 interface를 알기 어렵다는 단점이 있다. 이러한 단점을 보완하기 위해 Python 3.5이후에는 PEP 484에 기반하여 type hints를 제공한다.
def (함수이름)(변수명 : 변수 타입)->(반환 타입):
(함수 코드)
def type_hint_ex(name : str)->str:
return f"Hello, {name}"
4.1 Type hints의 장점
- 사용자에게 인터페이스를 명확히 알려줄 수 있음
- 함수의 문서화할 때, parameter에 대한 정보가 명확함
- mypy 또는 IDE, linter 등을 통해 코드의 발생 가능한 오류를 사전에 확인
- 시스템 전체적인 안정성을 확보할 수 있다.
5. function docstring
- 파이썬 함수에 대한 상세스펙을 사전에 작성하는 것이다.
- '''로 docstring 영역을 표시한다.
6. 함수는 언제 만들면 좋은가?
- 공통적으로 사용되는 코드는 함수로 변환
- 복잡한 수식,조건 -> 식별 가능한 이름의 함수로 변환
'BoostCamp AI Tech - U Stage' 카테고리의 다른 글
| BoostCamp AI Tech - Day06 (0) | 2021.01.25 |
|---|---|
| BoostCamp AI Tech - Day05 (0) | 2021.01.22 |
| BoostCamp AI Tech - Day04 (0) | 2021.01.21 |
| BoostCamp AI Tech - Day03 (0) | 2021.01.20 |
| BoostCamp AI Tech - Day01 (0) | 2021.01.18 |
댓글