Skip to content

Julia 流程控制

流程控制语句用于控制程序的执行顺序,包括条件判断和循环结构。

条件语句

if-elseif-else

julia
x = 10

if x > 0
    println("正数")
elseif x < 0
    println("负数")
else
    println("零")
end

# 单行形式
if x > 0 println("正数") end

if 作为表达式

julia
x = 10

# if 返回值
result = if x > 0
    "正数"
elseif x < 0
    "负数"
else
    "零"
end

println(result)  # 正数

三元运算符

julia
x = 10

result = x > 0 ? "正数" : "非正数"
println(result)  # 正数

# 嵌套三元运算符
result = x > 0 ? "正" : (x < 0 ? "负" : "零")

短路求值

julia
x = 10

# && 短路与
x > 0 && println("x是正数")  # 会执行
x < 0 && println("x是负数")  # 不会执行

# || 短路或
x > 0 || println("x不是正数")  # 不会执行
x < 0 || println("x不是负数")  # 会执行

# 常用模式
function safe_divide(a, b)
    b == 0 && return nothing
    return a / b
end

循环

for 循环

julia
# 基本 for 循环
for i in 1:5
    println(i)
end

# 遍历数组
arr = ["apple", "banana", "cherry"]
for fruit in arr
    println(fruit)
end

# 遍历字符串
for c in "Julia"
    println(c)
end

# 带索引遍历
for (i, fruit) in enumerate(arr)
    println("$i: $fruit")
end

# 遍历字典
dict = Dict("a" => 1, "b" => 2)
for (key, value) in dict
    println("$key => $value")
end

范围和步长

julia
# 标准范围
for i in 1:5
    print(i, " ")  # 1 2 3 4 5
end

# 带步长
for i in 1:2:10
    print(i, " ")  # 1 3 5 7 9
end

# 倒序
for i in 10:-1:1
    print(i, " ")  # 10 9 8 7 6 5 4 3 2 1
end

# 浮点范围
for x in 0:0.5:2
    print(x, " ")  # 0.0 0.5 1.0 1.5 2.0
end

嵌套循环

julia
# 嵌套 for
for i in 1:3
    for j in 1:3
        println("($i, $j)")
    end
end

# 简写形式
for i in 1:3, j in 1:3
    println("($i, $j)")
end

# 矩阵遍历
matrix = [1 2 3; 4 5 6; 7 8 9]
for i in 1:3, j in 1:3
    println("matrix[$i,$j] = $(matrix[i,j])")
end

while 循环

julia
# 基本 while
i = 1
while i <= 5
    println(i)
    i += 1
end

# 条件循环
count = 0
while true
    count += 1
    if count >= 5
        break
    end
end
println("count = $count")

break 和 continue

julia
# break - 退出循环
for i in 1:10
    if i > 5
        break
    end
    println(i)
end
# 输出: 1 2 3 4 5

# continue - 跳过当前迭代
for i in 1:10
    if i % 2 == 0
        continue
    end
    println(i)
end
# 输出: 1 3 5 7 9

# 带标签的 break(退出外层循环)
for i in 1:5
    for j in 1:5
        if i * j > 10
            @goto done
        end
        println("$i × $j = $(i*j)")
    end
end
@label done
println("完成")

推导式

数组推导式

julia
# 基本推导
squares = [x^2 for x in 1:5]
println(squares)  # [1, 4, 9, 16, 25]

# 带条件
evens = [x for x in 1:10 if x % 2 == 0]
println(evens)  # [2, 4, 6, 8, 10]

# 嵌套推导
pairs = [(i, j) for i in 1:3, j in 1:3]
println(pairs)

# 扁平化嵌套
flat = [i * j for i in 1:3 for j in 1:3]
println(flat)  # [1, 2, 3, 2, 4, 6, 3, 6, 9]

# 复杂表达式
result = [sqrt(x) for x in 1:9 if x % 2 == 1]
println(result)

生成器表达式

julia
# 生成器(惰性求值)
gen = (x^2 for x in 1:10)

# 消费生成器
for x in gen
    print(x, " ")
end

# 生成器传递给函数
println(sum(x^2 for x in 1:10))  # 385

# 对比:数组推导立即计算,生成器惰性计算

字典和集合推导式

julia
# 字典推导
squares_dict = Dict(x => x^2 for x in 1:5)
println(squares_dict)

# 集合推导
unique_remainders = Set(x % 3 for x in 1:10)
println(unique_remainders)  # Set([0, 2, 1])

异常处理

try-catch

julia
try
    result = 10 / 0
    println(result)
catch e
    println("发生错误: $e")
end

# 捕获特定类型
try
    arr = [1, 2, 3]
    println(arr[10])
catch e
    if e isa BoundsError
        println("索引越界")
    else
        println("其他错误: $e")
    end
end

finally

julia
f = nothing
try
    f = open("test.txt", "r")
    content = read(f, String)
catch e
    println("读取错误: $e")
finally
    if f !== nothing
        close(f)
    end
end

抛出异常

julia
function divide(a, b)
    if b == 0
        throw(DivideError())
    end
    return a / b
end

try
    divide(10, 0)
catch e
    println("捕获异常: $e")
end

# 自定义错误消息
function validate_age(age)
    if age < 0
        error("年龄不能为负数")
    end
    if age > 150
        throw(ArgumentError("年龄值不合理: $age"))
    end
    return true
end

断言

julia
# @assert 宏
function factorial(n)
    @assert n >= 0 "n 必须非负"
    n <= 1 && return 1
    return n * factorial(n - 1)
end

# factorial(-1)  # 会抛出 AssertionError

作用域规则

局部作用域

julia
# for 循环引入新作用域
for i in 1:5
    x = i^2  # x 是局部变量
end
# x 在这里不可访问

# let 块创建新作用域
let
    y = 10
    println(y)
end
# y 在这里不可访问

全局作用域

julia
x = 10  # 全局变量

function modify_global()
    global x  # 声明要修改全局变量
    x = 20
end

modify_global()
println(x)  # 20

# 在循环中修改全局变量
counter = 0
for i in 1:5
    global counter
    counter += 1
end
println(counter)  # 5

常用模式

条件赋值

julia
# 获取默认值
value = nothing
result = value !== nothing ? value : "default"

# 使用 something
result = something(nothing, nothing, "default")
println(result)  # "default"

# 使用 coalesce(类似)
using Missings
result = coalesce(missing, missing, 42)
println(result)  # 42

提前返回

julia
function process(data)
    isempty(data) && return nothing
    
    length(data) < 3 && return "太短"
    
    # 正常处理
    return sum(data)
end

循环中的累积

julia
# 使用循环累积
total = 0
for i in 1:10
    total += i
end

# 使用 reduce
total = reduce(+, 1:10)

# 使用 sum
total = sum(1:10)

状态机

julia
function parse_state_machine(input)
    state = :start
    
    for c in input
        if state == :start
            if c == '<'
                state = :tag_open
            end
        elseif state == :tag_open
            if c == '/'
                state = :tag_close
            else
                state = :tag_name
            end
        end
        # ... 更多状态处理
    end
    
    return state
end

性能提示

类型稳定

julia
# 不好:类型不稳定
function unstable(x)
    if x > 0
        return x        # Int
    else
        return 0.0      # Float64
    end
end

# 好:类型稳定
function stable(x)
    if x > 0
        return float(x)  # 总是 Float64
    else
        return 0.0
    end
end

避免在循环中创建数组

julia
# 不好
result = 0
for i in 1:1000
    result += sum([1, 2, 3])  # 每次创建新数组
end

# 好
arr = [1, 2, 3]
result = 0
for i in 1:1000
    result += sum(arr)  # 复用数组
end

下一步

学习完流程控制后,请继续学习:

本站内容仅供学习和研究使用。