函数基础 #

一、函数定义 #

1.1 def函数 #

def 定义动态函数,类似Python:

mojo
def greet(name):
    return "Hello, " + name + "!"

def main():
    print(greet("Mojo"))

main()

1.2 fn函数 #

fn 定义静态函数,编译时类型检查:

mojo
fn greet(name: String) -> String:
    return "Hello, " + name + "!"

def main():
    print(greet("Mojo"))

main()

1.3 def vs fn #

特性 def fn
类型检查 运行时 编译时
默认参数 支持 支持
可变参数 支持 有限支持
性能 较慢 更快
错误检测 运行时 编译时

二、函数参数 #

2.1 位置参数 #

mojo
fn add(a: Int, b: Int) -> Int:
    return a + b

def main():
    print(add(1, 2))

main()

2.2 默认参数 #

mojo
fn greet(name: String, greeting: String = "Hello") -> String:
    return greeting + ", " + name + "!"

def main():
    print(greet("Mojo"))
    print(greet("Mojo", "Hi"))

main()

2.3 关键字参数 #

mojo
fn create_user(name: String, age: Int, city: String) -> String:
    return f"{name}, {age}, {city}"

def main():
    print(create_user(name="Alice", age=25, city="Beijing"))
    print(create_user(age=30, name="Bob", city="Shanghai"))

main()

2.4 可变参数 #

mojo
def sum_all(*numbers):
    var total = 0
    for num in numbers:
        total += num
    return total

def main():
    print(sum_all(1, 2, 3, 4, 5))

main()

2.5 关键字可变参数 #

mojo
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

def main():
    print_info(name="Alice", age=25, city="Beijing")

main()

三、返回值 #

3.1 单返回值 #

mojo
fn square(x: Int) -> Int:
    return x * x

def main():
    print(square(5))

main()

3.2 多返回值 #

mojo
fn divide(a: Int, b: Int) -> (Int, Int):
    return a // b, a % b

def main():
    let quotient, remainder = divide(10, 3)
    print(f"商: {quotient}, 余数: {remainder}")

main()

3.3 无返回值 #

mojo
fn print_message(msg: String):
    print(msg)

def main():
    print_message("Hello")

main()

3.4 提前返回 #

mojo
fn find_negative(numbers: List[Int]) -> Int:
    for num in numbers:
        if num < 0:
            return num
    return 0

def main():
    let nums = [1, 2, -3, 4, 5]
    print(find_negative(nums))

main()

四、函数作用域 #

4.1 局部变量 #

mojo
fn process():
    let local_var = 10
    print(local_var)

def main():
    process()

main()

4.2 全局变量 #

mojo
var counter = 0

fn increment():
    global counter
    counter += 1

def main():
    print(counter)
    increment()
    print(counter)

main()

4.3 嵌套函数 #

mojo
def outer():
    let x = 10
    
    def inner():
        print(x)
    
    inner()

def main():
    outer()

main()

五、高阶函数 #

5.1 函数作为参数 #

mojo
fn apply(x: Int, f: fn(Int) -> Int) -> Int:
    return f(x)

fn double(x: Int) -> Int:
    return x * 2

def main():
    print(apply(5, double))

main()

5.2 函数作为返回值 #

mojo
fn get_multiplier(factor: Int) -> fn(Int) -> Int:
    fn multiply(x: Int) -> Int:
        return x * factor
    return multiply

def main():
    let double = get_multiplier(2)
    print(double(5))

main()

5.3 匿名函数 #

mojo
def main():
    let numbers = [1, 2, 3, 4, 5]
    let squared = map(lambda x: x * x, numbers)
    
    for num in squared:
        print(num)

main()

六、递归函数 #

6.1 基本递归 #

mojo
fn factorial(n: Int) -> Int:
    if n <= 1:
        return 1
    return n * factorial(n - 1)

def main():
    print(factorial(5))

main()

6.2 尾递归 #

mojo
fn factorial_tail(n: Int, acc: Int = 1) -> Int:
    if n <= 1:
        return acc
    return factorial_tail(n - 1, n * acc)

def main():
    print(factorial_tail(5))

main()

6.3 斐波那契数列 #

mojo
fn fibonacci(n: Int) -> Int:
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

def main():
    for i in range(10):
        print(fibonacci(i))

main()

七、函数重载 #

7.1 参数类型重载 #

mojo
fn process(value: Int):
    print(f"Integer: {value}")

fn process(value: String):
    print(f"String: {value}")

fn process(value: Float64):
    print(f"Float: {value}")

def main():
    process(42)
    process("Hello")
    process(3.14)

main()

7.2 参数数量重载 #

mojo
fn add(a: Int) -> Int:
    return a

fn add(a: Int, b: Int) -> Int:
    return a + b

fn add(a: Int, b: Int, c: Int) -> Int:
    return a + b + c

def main():
    print(add(1))
    print(add(1, 2))
    print(add(1, 2, 3))

main()

八、内联函数 #

8.1 内联优化 #

mojo
@inline
fn square(x: Int) -> Int:
    return x * x

def main():
    let result = square(5)
    print(result)

main()

8.2 何时使用内联 #

  • 小型函数
  • 频繁调用
  • 性能关键路径

九、函数最佳实践 #

9.1 单一职责 #

mojo
fn validate_email(email: String) -> Bool:
    return "@" in email and "." in email

fn send_email(email: String, message: String):
    if validate_email(email):
        print(f"Sending to {email}: {message}")

def main():
    send_email("user@example.com", "Hello")

main()

9.2 有意义的命名 #

mojo
fn calculate_monthly_payment(principal: Float64, rate: Float64, years: Int) -> Float64:
    let monthly_rate = rate / 12 / 100
    let months = years * 12
    return principal * monthly_rate / (1 - (1 + monthly_rate) ** (-months))

def main():
    let payment = calculate_monthly_payment(100000.0, 5.0, 30)
    print(payment)

main()

9.3 文档字符串 #

mojo
fn calculate_bmi(weight: Float64, height: Float64) -> Float64:
    """
    计算身体质量指数(BMI)。
    
    Args:
        weight: 体重(公斤)
        height: 身高(米)
        
    Returns:
        BMI值
    """
    return weight / (height * height)

def main():
    print(calculate_bmi(70.0, 1.75))

main()

十、总结 #

本章学习了:

  • def和fn函数定义
  • 参数传递方式
  • 返回值处理
  • 作用域规则
  • 高阶函数
  • 递归函数
  • 函数重载
  • 最佳实践

下一章,我们将学习参数与返回值的高级特性。

最后更新:2026-03-27