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. 循环控制:break 和 continue
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 ...] | 推导式 |
十二、小练习(立即上手)
- 写函数判断闰年(能被 4 整除,但不能被 100 整除,除非能被 400 整除)
- 用
while实现factorial(n) - 用
try-catch安全读取文件 - 用推导式生成 9×9 乘法表
- 实现
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:10 | Julia 用 in 或 =,推荐 in |
while true 无限循环 | 记得加 break |
try 内修改外部变量 | 用 global 或返回 |
恭喜!你已精通 Julia 流程控制!
现在你可以:
- 写出清晰可读的条件逻辑
- 实现高效循环与搜索
- 构建健壮的错误处理
- 用推导式优雅生成数据
下一站推荐
| 主题 | 为什么学 |
|---|---|
| 函数与多重派发 | 核心编程范式 |
| 数组与广播 | 数据处理 |
结构体 struct | 自定义类型 |
包管理 Pkg | 项目开发 |
| 性能优化 | @inbounds, @simd |
需要我:
- 写一个 命令行交互计算器?
- 实现 迷宫求解(DFS/BFS)?
- 构建 配置解析器(带错误处理)?
- 演示 生成器(
Channel+for)?
随时告诉我!