0
点赞
收藏
分享

微信扫一扫

探索Julia(part10)--自定义函数

学习笔记,仅供参考,有错必纠

参考自: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

不带参数的函数可能看起来很奇怪,但对于“延迟”计算很有用。




举报

相关推荐

0 条评论