学习笔记,仅供参考,有错必纠
参考自:Julia数据科学应用–Zacharias Voulgaris;官方文档
使用Julia-1.1.1
自定义函数
Functions
在Julia中,函数是将参数值的元组映射到返回值的对象。Julia函数不是纯粹的数学函数,因为函数可以改变程序的全局状态,并受其影响,在Julia中定义函数的基本语法是:
function f(x,y)
x + y
end
在Julia中还有第二种更简洁的定义函数的语法。上面演示的传统函数声明语法等价于以下紧凑的"赋值形式":
f(x,y) = x + y
在赋值形式中,函数体必须是单个表达式,尽管它可以是复合表达式(参见复合表达式)。简短、简单的函数定义在Julia中很常见。
函数调用使用传统的括号语法:
f(2,3)
#返回值
5
函数名后不加括号,则表达式f指的是函数对象,可以像任何值一样传递:
g = f;
g(1, 2)
#返回值
3
和变量一样,Unicode也可以用于函数名:
∑(x,y) = x + y;
∑(1, 2)
#返回值
3
return关键字
默认情况下,函数返回的值是最后一个计算表达式的值,该表达式是函数定义体中的最后一个表达式,return关键字将导致函数立即返回,例如:
function g2(x,y)
return x * y
x + y
end;
调用:
g2(5, 6)
#返回值
30
返回值类型
可以在函数声明中使用::
操作符指定返回值类型,这将返回值转换为指定的类型:
function g3(x, y)::Int8
return x * y
end;
查看返回值类型:
typeof(g3(3, 4))
#返回值
Int8
对于不需要返回值的函数(仅用于某些副作用的函数),Julia约定是不返回值:
function printx(x)
println("x = $x")
return nothing
end
这是一种约定,因为nothing不是一个Julia关键字,而是唯一的nothing类型的单例对象。
Operators Are Functions
在Julia中,大多数操作符是支持特殊语法的函数(具有特殊求值语义的操作符,如&&
和||
例外,这些运算符则不能为函数),我们可以应用他们使用圆括号参数列表,就像其他任何函数一样:
julia> 1 + 2 + 3
6
julia> +(1,2,3)
6
中缀形式(infix form)与函数应用程序形式(function application form)完全相同,实际上,前者被解析为在内部生成函数调用,这也意味着我们可以分配和传递操作符,比如+
和*
,就像你对待其他函数值一样:
julia> f1 = +;
julia> f1(1,2,3)
6
具有特殊名称的操作符
一些特殊表达式对应于调用具有不明显名称的函数,这些是:
Expression | Calls |
---|---|
[A B C ...] |
hcat |
[A; B; C; ...] |
vcat |
[A B; C D; ...] |
hvcat |
A' |
adjoint |
A[i] |
getindex |
A[i] = x |
setindex! |
A.n |
getproperty |
A.n = x |
setproperty! |
匿名函数
Julia中的函数是一类对象:它们可以被赋给变量,并使用标准的函数调用语法从已赋值的变量中调用。它们可以用作参数,也可以作为值返回。它们也可以匿名创建,无需给出名称,例如:
julia> x -> x^2 + 2x - 1
#3 (generic function with 1 method)
Julia创建了一个函数,参数为x,返回多项式x^2 + 2x - 1在该值处的值。请注意,该函数返回结果是一个泛型函数,且具有基于连续编号的编译器生成的名称。
匿名函数的主要用途是将它们传递给其他函数,作为一个参数。一个典型的例子是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
不带参数的函数可能看起来很奇怪,但对于“延迟”计算很有用。