Julia 学习笔记——3. 流程控制
简单过一遍 Julia 中的流程控制,其实和 Python 以及 MATLAB 基本一致。
主要的区别包括:
- Julia 的条件表达式必须是显式
Bool,不像 Python 和 MATLAB 那样允许各种隐式真值判断; if、begin这类结构本身都可以作为表达式使用;for和while不只是“执行循环”,还会和局部作用域规则产生联系。
条件语句
if 条件语句和其它语言一样,注意其中的条件表达式不需要括号
1 | x = 3; |
C/C++ 使用
else if;Python 使用elif;MATLAB 使用elseif,Julia 也使用elseif。
Julia 严格要求 if 和 elseif 所接受的条件必须是 Bool 值,不接受隐式转换,例如下面的语句会报错
1 | if 1 # error |
if 语句整体在运行时会把命中分支的结果作为整个表达式的返回值,这点和很多传统命令式语言不太一样。
1 | julia> if x > 0 |
需要说明的是:和 Python 一样,Julia 在 if 语句中不会开辟独立的局部作用域。
Julia 支持三元运算符,可以用来简化判断语句,例如
1 | x = 3; |
这里也是采用短路逻辑,始终只有一个分支会被执行。
Julia 还提供了一个内置函数 ifelse()
1 | ifelse(1>0, 1, 0) # 1 |
循环语句
while 循环语句也和其它语言一样
1 | i = 0 |
for 循环语句也和 MATLAB/Python 很类似,需要注意范围是闭区间而不是左闭右开,Julia 提供了三种等效的方式(=,in,unicode 字符 ∈),例如
1 | for i = 1:5 |
在循环中对于 break 和 continue 的支持也是类似的,无需重复。
Julia 支持将多重 for 循环写在一起,直接遍历笛卡尔积,例如
1 | for i = 1:3, j = 2:4 |
在这种情况下,使用 break 语句会直接跳出整个循环。
需要注意,这里不能误写作 for i = 1:3; j = 2:4,因为会被视作复合表达式。
while 循环和 for 循环通常会引入变量局部作用域,这里暂时不作讨论。
复合表达式
有时我们只是希望将几个表达式按顺序组合到一起,依次运算,并使用最后一个表达式的值作为整体的结果,Julia 提供了 begin ... end 语法来完成这个功能,例如
1 | x = begin |
也可以写在一行中,此时表达式之间必须使用 ; 分隔
1 | x = begin a = 1; b = 2; a + b end |
可以使用 () 代替 begin ... end,此时表达式之间总是不能省略 ;
1 | x = (a = 1; |
异常控制
抛出和捕获异常的语法和 Python、C++ 都差不多。
捕获异常
1 | try |
输出形如
1 | exception: |
除了最基础的
try catch,Julia 的异常捕获结构还支持else语句(无异常时执行)和finally语句(总是会执行)。
主动抛出异常
1 | f(x) = x>=0 ? exp(-x) : throw(DomainError("x<0")) |
输出形如
1 | ERROR: DomainError with x<0: |
