L4 fn
1. def
vs fn
def
(🔥, 🐍)
- python의 def는 다이나믹하고 유동성이 강한 함수를 정의하는 방법으로 속도에서 한계를 지닌다.
def
는 모든 인자를 복사하여 받기 때문에 자유롭게 사용할 수 있으나, 외부에 영향을 주지 않는다. (Mojo, Python 동일 개념) fn (🐍)
- 이를 보완하기 위해 Mojo에서는 fn를 사용하는데, 이는 유동성과 다이나믹함을 일부 포기하고 속도를 높이는 방법이다.
fn
의 내부로 전달되는 인자는 기본적으로 immutable(불변)이기 때문에, 외부의 변수를 그대로 가져오나 기본적으론 immutable type이다. - immutable함의 강점을 살리기 위해 Ownership 개념([[L5 Ownership 🔥]])을 사용한다.
그러므로, Mojo의 강점을 살리기 위해서는 fn을 사용하는 것이 좋다. 그러나, 파이썬과의 높은 호환성을 위해 def를 사용할 수도 있다.
fn func1():
print("func1")
@strict
def func2():
# fn이 이 표현방식을 Mojo에서 간단하게 변경한 것
print("func2")
def func3():
print("func3")
2. 기능 차이
- def는 fn이 제공하는 모든 기능을 지원함 (높은 호환성)
- fn은 def에 비해 가지는 제약사항이 있음 (높은 속도)
- 제약1. fn은 기본적으로 immutable(변경 불가능, borrowed)를 통해 데이터를 받아 높은 속도와 메모리 효율을 보장함. 실수를 방지하기 위해 immutable을 사용함.
- 제약2. self를 제외한 모든 인자의 타입을 명시해야함. return의 경우, ->를 통해 명시하지 않으면 None으로 자동으로 처리함.
- 제약 3. fn 내부에서 정의되는 모든 변수들은 let, var를 통해 mutable여부를 명시해야함.
- 제약 4. fn, def 모두 exception을 지원하나, fn의 경우
raises
를 통해 명시해야함. 이러한 제약이 불편함에도 불구하고 빠른 속도와 메모리 효율성, 파이썬의 다양한 프로그래밍 패턴으로 인한 실수 및 협업의 어려움을 방지하기 위해 제약을 두고 있음.