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

Julia 函数

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

由 陈 创建,youj 最后一次修改 2016-08-12 函数 Julia 中的函数是将一系列参数组成的元组映设到一个返回值的对象,Julia 的函数不是纯的数学式函数,有些函数可以改变或者影响程序的全局状态。Julia 中定义函数的基本语法为:function f(x,y) x + yend Julia 中可以精炼地定义函数。上述传统的声明语法,等价于下列紧凑的“赋值形式”:f(x,y) = x + y 对于赋值形式,函数体通常是单表达式,但也可以为复合表达式(详见复合表达式)。Julia 中常见这种短小简单的函数定义。短函数语法相对而言更方便输入和阅读。 使用圆括号来调用函数:julia> f(2,3)5 没有圆括号时, f 表达式指向的是函数对象,这个函数对象可以像值一样被传递:julia> g = f;julia> g(2,3)5 调用函数有两种方法:使用特定函数名的特殊运算符语法(详见后面函数运算符),或者使用 apply 函数:julia> apply(f,2,3)5 apply 函数把第一个参数当做函数对象,应用在后面的参数上。 和变量名称一样, 函数名称也可以使用 Unicode 字符:julia> ∑(x,y) = x + y∑ (generic function with 1 method) 参数传递行为 Julia 函数的参数遵循 “pass-by-sharing” 的惯例,即不传递值,而是传递引用。函数参数本身,有点儿像新变量绑定(引用值的新位置),但它们引用的值与传递的值完全相同。对可变值(如数组)的修改,会影响其它函数。 return 关键字 函数返回值通常是函数体中最后一个表达式的值。上一节中 f 是表达式 x + y 的值。在 C 和大部分命令式语言或函数式语言中, return 关键字使得函数在计算完该表达式的值后立即返回:function g(x,y) return x * y x + yend 对比下列两个函数:f(x,y) = x + yfunction g(x,y) return x * y x + yendjulia> f(2,3)5julia> g(2,3)6 在纯线性函数体,比如 g 中,不需要使用 return ,它不会计算表达式 x + y 。可以把 x * y 作为函数的最后一个表达式,并省略 return 。只有涉及其它控制流时, return 才有用。下例计算直角三角形的斜边长度,其中直角边为 x 和 y,为避免溢出:function hypot(x,y) x = abs(x) y = abs(y) if x > y r = y/x return x*sqrt(1+r*r) end if y == 0 return zero(x) end r = x/y return y*sqrt(1+r*r)end 最后一行的 return 可以省略。 函数运算符 Julia 中,大多数运算符都是支持特定语法的函数。 && 、 || 等短路运算是例外,它们不是函数,因为短路求值先算前面的值,再算后面的值。对于函数运算符,可以像其它函数一样,把参数列表用圆括号括起来,作为函数运算符的参数:julia> 1 + 2 + 36julia> +(1,2,3)6 中缀形式与函数形式完全等价,事实上,前者被内部解析为函数调用的形式。可以像对其它函数一样,对 + 、 * 等运算符进行赋值、传递:julia> f = +;julia> f(1,2,3)6 但是,这时 f 函数不支持中缀表达式。 特殊名字的运算符 有一些表达式调用特殊名字的运算符: 表达式 调用 [A B C ...] hcat [A, B, C, ...] vcat [A B; C D; ...] hvcat A' ctranspose A.' transpose 1:n colon A[i] getindex A[i]=x setindex! 这些函数都存在于 Base.Operators 模块中。 匿名函数 Julia 中函数是第一类对象,可以被赋值给变量,可以通过赋值后的变量来调用函数, 还可以当做参数和返回值,甚至可以被匿名构造:julia> x -> x^2 + 2x - 1(anonymous function) 上例构造了一个匿名函数,输入一个参数 x ,返回多项式 x^2 + 2x - 1 的值。匿名函数的主要作用是把它传递给接受其它函数作为参数的函数。最经典的例子是 map 函数,它将函数应用在数组的每个值上,返回结果数组:julia> map(round, [1.2,3.5,1.7])3-element Array{Float64,1}: 1.0 4.0 2.0 map 的第一个参数可以是非匿名函数。但是大多数情况,不存在这样的函数时,匿名函数就可以简单地构造单用途的函数对象,而不需要名字:julia> map(x -> x^2 + 2x - 1, [1,3,-1])3-element Array{Int64,1}: 2 14 -2 匿名函数可以通过类似 (x,y,z)->2x+y-z 的语法接收多个参数。无参匿名函数则类似于 ()->3 。无参匿名函数可以“延迟”计算,做这个用处时,代码被封装进无参函数,以后可以通过把它命名为 f() 来引入。 多返回值 Julia 中可以通过返回多元组来模拟返回多值。但是,多元组并不需要圆括号来构造和析构,因此造成了可以返回多值的假象。下例返回一对儿值:julia> function foo(a,b) a+b, a*b end; 如果在交互式会话中调用这个函数,但不将返回值赋值出去,会看到返回的是多元组:julia> foo(2,3)(5,6) Julia 支持简单的多元组“析构”来给变量赋值:julia> x, y = foo(2,3);julia> x5julia> y6 也可以通过 return 来返回:function foo(a,b) return a+b, a*bend 这与之前定义的 foo 结果相同。 变参函数 函数的参数列表如果可以为任意个数,有时会非常方便。这种函数被称为“变参”函数,是“参数个数可变”的简称。可以在最后一个参数后紧跟省略号 ... 来定义变参函数:julia> bar(a,b,x...) = (a,b,x)bar (generic function with 1 method) 变量 a 和 b 是前两个普通的参数,变量 x 是尾随

[1] [2]  下一页


Julia 函数