当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 控制流

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:09

end12345 此处的 1:5 是一个 Range 对象,表示的是 1, 2, 3, 4, 5 序列。 for 循环遍历这些数,将其逐一赋给变量 i 。 while 循环和 for 循环的另一区别是变量的作用域。如果在其它作用域中没有引入变量 i ,那么它仅存在于 for 循环中。不难验证:julia> for j = 1:5 println(j) end12345julia> jERROR: j not defined 有关变量作用域,详见变量的作用域 。 通常,for 循环可以遍历任意容器。这时,应使用另一个(但是完全等价的)关键词 in ,而不是 = ,它使得代码更易阅读:julia> for i in [1,4,0] println(i) end140julia> for s in ["foo","bar","baz"] println(s) endfoobarbaz 手册中将介绍各种可迭代容器(详见多维数组)。 有时要提前终止 while 或 for 循环。可以通过关键词 break 来实现:julia> i = 1;julia> while true println(i) if i >= 5 break end i += 1 end12345julia> for i = 1:1000 println(i) if i >= 5 break end end12345 有时需要中断本次循环,进行下一次循环,这时可以用关键字 continue :julia> for i = 1:10 if i % 3 != 0 continue end println(i) end369 多层 for 循环可以被重写为一个外层循环,迭代类似于笛卡尔乘积的形式:julia> for i = 1:2, j = 3:4 println((i, j)) end(1,3)(1,4)(2,3)(2,4) 这种情况下用 break 可以直接跳出所有循环。 异常处理 当遇到意外条件时,函数可能无法给调用者返回一个合理值。这时,要么终止程序,打印诊断错误信息;要么程序员编写异常处理。 内置异常 Exception 如果程序遇到意外条件,异常将会被抛出。表中列出内置异常。 Exception ArgumentError BoundsError DivideError DomainError EOFError ErrorException InexactError InterruptException KeyError LoadError MemoryError MethodError OverflowError ParseError SystemError TypeError UndefRefError UndefVarError 例如,当对负实数使用内置的 sqrt 函数时,将抛出 DomainError() :julia> sqrt(-1)ERROR: DomainErrorsqrt will only return a complex result if called with a complex argument.try sqrt(complex(x)) in sqrt at math.jl:131 你可以使用下列方式定义你自己的异常:julia> type MyCustomException <: Exception end throw 函数 可以使用 throw 函数显式创建异常。例如,某个函数只对非负数做了定义,如果参数为负数,可以抛出 DomaineError 异常:julia> f(x) = x>=0 ? exp(-x) : throw(DomainError())f (generic function with 1 method)julia> f(1)0.36787944117144233julia> f(-1)ERROR: DomainError in f at none:1 注意,DomainError 使用时需要使用带括号的形式,否则返回的并不是异常,而是异常的类型。必须带括号才能返回 Exception 对象:julia> typeof(DomainError()) <: Exceptiontruejulia> typeof(DomainError) <: Exceptionfalse 另外,一些异常类型使用一个或更多个参数用来报告错误:julia> throw(UndefVarError(:x))ERROR: x not defined 这个机制能被简单实现,通过按照下列所示的 UndefVarError 方法自定义异常类型:julia> type MyUndefVarError <: Exception var::Symbol endjulia> Base.showerror(io::IO, e::MyUndefVarError) = print(io, e.var, " not defined"); error 函数 error 函数用来产生 ErrorException ,阻断程序的正常执行。 如下改写 sqrt 函数,当参数为负数时,提示错误,立即停止执行:julia> fussy_sqrt(x) = x >= 0 ? sqrt(x) : error("negative x not allowed")fussy_sqrt (generic function with 1 method)julia> fussy_sqrt(2)1.4142135623730951julia> fussy_sqrt(-1)ERROR: negative x not allowed in fussy_sqrt at none:1 当对负数调用 fussy_sqrt 时,它会立即返回,显示错误信息:julia> function verbose_fussy_sqrt(x) println("before fussy_sqrt") r = fussy_sqrt(x) println("after fussy_sqrt") return r endverbose_fussy_sqrt (generic function with 1 method)julia> verbose_fussy_sqrt(2)before fussy_sqrtafter fussy_sqrt1.4142135623730951julia> verbose_fussy_sqrt(-1)before fussy_sqrtERROR: negative x not allowed in verbose_fussy_sqrt at none:3 warn 和 info 函数 Julia 还提供一些函数,用来向标准错误 I/O 输出一些消息,但不抛出异常,因而并不会打断程序的执行:julia> info("Hi"); 1+1INFO: Hi2julia> warn("Hi"); 1+1WARNING: Hi2julia> error("Hi"); 1+1ERROR: Hi in error at error.jl:21 try/catch 语句 try/catch 语句可以用于处理一部分预料中的异常 Exception 。例如,下面求平方根函数可以正确处理实数或者复数:julia> f(x) = try sqrt(x) catch sqrt(complex(x, 0)) endf (generic function with 1 method)julia> f(1)1.0julia> f(-1)0.0 + 1.0im 但是

上一页  [1] [2] [3] [4]  下一页


Julia 控制流