1 函数的定义(两种方法)
function f(x,y)
x + y
end
#f (generic function with 1 method)
f(x,y) = x + y
#f(x,y) = x + y
2 匿名函数(两种方法)
function (x,y)
x + y
end
##3 (generic function with 1 method)
(x,y)->x + y
##5 (generic function with 1 method)
2.1 匿名函数应用:map
3 变参参数
- “参数数量可变”的简称
- 通过在最后一个参数后增加省略号来定义一个变参函数
4 函数参数中的do结构
- 把函数作为参数传递给其他函数是一种强大的技术,但它的语法并不总是很方便
- 当函数参数占据多行时,这样的调用便特别难以编写
比如,考虑在具有多种情况的函数上调用map
map(x->begin
if x < 0 && iseven(x)
return 0
elseif x == 0
return 1
else
return x
end
end,
[1,0,-1])
'''
3-element Vector{Int64}:
1
1
-1
'''
当然可以先定义函数f,然后将f送入map中
function f(x)
begin
if x < 0 && iseven(x)
return 0
elseif x == 0
return 1
else
return x
end
end
end
map(f,[1,0,-1])
'''
3-element Vector{Int64}:
1
1
-1
'''
还有一种方法是使用保留字do
do x 语法创建一个带有参数 x 的匿名函数,并将其作为第一个参数传递给 map
map([1,0,-1]) do x
if x < 0 && iseven(x)
return 0
elseif x == 0
return 1
else
return x
end
end
'''
3-element Vector{Int64}:
1
1
-1
'''
4.1 do函数与文件写入
open("outfile", "w") do io
write(io, data)
end
do io
是一个使用do
语法的块结构。这里,文件被打开并传递给后面的代码块,该代码块可以使用变量io
来引用这个打开的文件。- 使用
do
语法的好处是,代码块结束时,文件会自动关闭,这意味着你不需要显式地调用close(io)
。
5 管道链式调用
把一个函数作用到前一个函数的输出上
5.1 和广播链式使用
["a", "list", "of", "strings"] .|> uppercase
'''
4-element Vector{String}:
"A"
"LIST"
"OF"
"STRINGS"
'''
["a", "list", "of", "strings"] .|> uppercase .|>reverse
'''
4-element Vector{String}:
"A"
"TSIL"
"FO"
"SGNIRTS"
'''
["a", "list", "of", "strings"] .|> [uppercase, reverse, titlecase, length]
'''
4-element Vector{Any}:
"A"
"tsil"
"Of"
7
'''