Julia 流程控制

Julia 流程控制完全指南(中文版)

“清晰、灵活、高性能” —— Julia 的流程控制设计极简而强大


一、流程控制总览

类别语法
条件判断if, elseif, else, 三元运算符 ?:
循环for, while, break, continue
异常处理try, catch, finally, throw
短路求值&&, ||
复合表达式begin ... end, ( ... )

二、条件判断 if

1. 基本语法

x = 10

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

2. if 是表达式(返回值!)

result = if x > 0
    "positive"
else
    "non-positive"
end
println(result)  # "positive"

3. 三元运算符 ?:(简洁版)

x > 0 ? "正" : "非正"

优先级:? > 赋值 =,所以无需括号


三、循环

1. for 循环

# 遍历范围
for i in 1:5
    println(i)
end

# 遍历数组
for fruit in ["苹果", "香蕉", "橙子"]
    println(fruit)
end

# 带索引
for (i, val) in enumerate([10, 20, 30])
    println("第 $i 项: $val")
end

# 嵌套循环(可解构)
for (x, y) in [(1,2), (3,4), (5,6)]
    println("($x, $y)")
end

范围语法

1:10          # 1 到 10
1:2:10        # 1,3,5,7,9(步长 2)
range(0, 1, length=5)  # 0.0, 0.25, 0.5, 0.75, 1.0

2. while 循环

n = 1
while n <= 5
    println(n)
    n += 1
end

3. 循环控制:breakcontinue

for i in 1:100
    if i % 3 == 0
        continue    # 跳过本次
    end
    if i > 10
        break       # 跳出循环
    end
    println(i)
end

四、复合表达式(Compound Expressions)

1. begin ... end

z = begin
    x = 1
    y = 2
    x + y
end
println(z)  # 3

2. ( ... )

z = (x = 1; y = 2; x + y)

分号 ; 分隔语句,最后一个表达式为返回值


五、短路求值(Short-circuit Evaluation)

x = 5
x > 0 && println("正数")     # 打印
x < 0 || println("非负")     # 打印

# 自定义控制流
is_file_exist("data.txt") && process_file("data.txt")

&&:左边 false → 不执行右边
||:左边 true → 不执行右边


六、异常处理(Exception Handling)

1. 基本语法

try
    x = 1 / 0
catch e
    println("错误: $e")
finally
    println("清理资源")
end

2. 常见异常

异常触发场景
DivideError除以 0
BoundsError数组越界
UndefVarError未定义变量
MethodError无匹配方法
ErrorException自定义错误
try
    arr = [1,2,3]
    arr[10]
catch e
    if isa(e, BoundsError)
        println("数组越界!")
    else
        rethrow(e)  # 重新抛出
    end
end

3. 抛出异常

function sqrt_positive(x)
    x < 0 && throw(DomainError(x, "参数必须非负"))
    return sqrt(x)
end

sqrt_positive(-1)  # 抛出 DomainError

七、条件循环组合技巧

1. for + if 推导式

# 数组推导
squares = [x^2 for x in 1:10]

# 条件推导
evens = [x for x in 1:10 if x % 2 == 0]

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

2. while + break 实现搜索

function find_first_positive(arr)
    i = 1
    while i <= length(arr)
        if arr[i] > 0
            return i
        end
        i += 1
    end
    return nothing
end

八、性能优化技巧

1. 避免在循环中定义函数

# 慢
for i in 1:1_000_000
    f() = i^2
    f()
end

# 快
f(i) = i^2
for i in 1:1_000_000
    f(i)
end

2. 使用 eachindex 遍历数组

for i in eachindex(arr)
    arr[i] += 1
end

3. 预分配数组(避免 push! 动态增长)

# 慢
result = Int[]
for i in 1:1_000_000
    push!(result, i^2)
end

# 快
result = Vector{Int}(undef, 1_000_000)
for i in 1:1_000_000
    result[i] = i^2
end

九、综合示例:冒泡排序

function bubble_sort!(arr)
    n = length(arr)
    for i in 1:n-1
        swapped = false
        for j in 1:n-i
            if arr[j] > arr[j+1]
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = true
            end
        end
        swapped || break  # 已排序,提前退出
    end
    return arr
end

data = [64, 34, 25, 12, 22, 11, 90]
bubble_sort!(data)

十、综合示例:安全除法函数

function safe_divide(a, b)
    b == 0 && return nothing
    isinf(a/b) && return Inf * sign(a/b)
    return a / b
end

# 使用短路 + 异常
function safe_divide_v2(a, b)
    b == 0 && throw(DivideError())
    return a / b
end

十一、流程控制速查表

语法用途
if ... elseif ... else ... end条件分支
cond ? a : b三元运算
for x in iterable遍历
while cond条件循环
break跳出循环
continue跳过本次
&&, ||短路逻辑
try ... catch ... finally异常处理
throw(e)抛出异常
[x for x in ... if ...]推导式

十二、小练习(立即上手)

  1. 写函数判断闰年(能被 4 整除,但不能被 100 整除,除非能被 400 整除)
  2. while 实现 factorial(n)
  3. try-catch 安全读取文件
  4. 用推导式生成 9×9 乘法表
  5. 实现 find_first(predicate, arr) 返回第一个满足条件的索引

答案示例

# 1. 闰年
is_leap_year(y) = y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)

# 2. 阶乘
function factorial_while(n)
    n < 0 && throw(DomainError(n))
    result = 1
    i = 1
    while i <= n
        result *= i
        i += 1
    end
    return result
end

# 3. 安全读文件
function safe_read(filename)
    try
        return read(filename, String)
    catch e
        isa(e, SystemError) && return nothing
        rethrow(e)
    end
end

# 4. 乘法表
multiplication_table = ["$(i)×$(j)=$(i*j)" for i in 1:9 for j in 1:9]

# 5. find_first
function find_first(f, arr)
    for (i, x) in enumerate(arr)
        f(x) && return i
    end
    return nothing
end

find_first(iseven, [1,3,4,5])  # 3

十三、常见错误与避坑

错误正确做法
if x = 1应为 if x == 1= 是赋值)
for i = 1:10Julia 用 in=,推荐 in
while true 无限循环记得加 break
try 内修改外部变量global 或返回

恭喜!你已精通 Julia 流程控制!

现在你可以:

  • 写出清晰可读的条件逻辑
  • 实现高效循环与搜索
  • 构建健壮的错误处理
  • 推导式优雅生成数据

下一站推荐

主题为什么学
函数与多重派发核心编程范式
数组与广播数据处理
结构体 struct自定义类型
包管理 Pkg项目开发
性能优化@inbounds, @simd

需要我:

  • 写一个 命令行交互计算器
  • 实现 迷宫求解(DFS/BFS)?
  • 构建 配置解析器(带错误处理)?
  • 演示 生成器Channel + for)?

随时告诉我!

文章已创建 2302

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部