探索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;

调用:

扫描二维码关注公众号,回复: 11404026 查看本文章
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

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


猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/107398065