Julia 流程控制
流程控制语句用于控制程序的执行顺序,包括条件判断和循环结构。
条件语句
if-elseif-else
julia
x = 10
if x > 0
println("正数")
elseif x < 0
println("负数")
else
println("零")
end
# 单行形式
if x > 0 println("正数") endif 作为表达式
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])")
endwhile 循环
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
endfinally
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下一步
学习完流程控制后,请继续学习: