
生信探索
V1
2023/04/27阅读:14主题:姹紫
Julia编程07:Function
<~生~信~交~流~与~合~作~请~关~注~公~众~号@生信探索>
Julia的函数类似R中的,是泛型函数,比如R中的head函数可以接受vector、list、matrxi、dataframe等等类型对象,而python中的函数如果是一个对象私有的叫做方法。
Julia的函数可以根据传入的位置参数类型不同选择不同的计算方法,这叫做多重派发。
定义 define
-
单行
f(x) = x^2 + 3*x + 1
-
多行
# mysd: Input numeric vector x, output its sample standard deviation.
function mysd(x)
n = length(x)
mx = sum(x) / n
s = 0.0
for z in x
s += (z - mx)^2
end
sqrt(s / (n-1))
end
-
匿名
x -> x^2 + 1 # python: lambda x: x^2+1
(x,y) -> x+y # python: lambda x,y: x+y
参数
位置参数可以不带默认值
关键字参数在位置参数后,用;
分开,须带默认值
多重分派只考虑位置参数而不考虑关键字参数
参数传递模式
传引用而不是传参数 pass by reference(内存id相同)与Python类似,也就是说你穿进去的参数可能会被修改,因此Julia中约定如果一个函数能够修改参数,那么函数名要加!
后缀,比如f!
,而Python中则使用关键字参数inplace=True
function f!(x)
x[1]=0
return x
end
x=[1,2,3]
f!(x) # [0,2,3]
x # [0,2,3]
可变个数参数与元组实参
funx(x, args...)
funx(11,1,2,3)
x = 11; (1,2,3) #其他参数以tuple形式传入
x = [1, 3, 1, 4]
max(x...) # unfold
max(x) # error
链式调用与函数复合
g(f(x))==x |> f |> g==g∘f(x) # ∘ 输入方法为\circ<TAB>
# 每个单词取第一个字母并转换成大写 多种写法
funcs = [uppercase, lowercase, first]
abc = ["apple", "banana", "carrot"]
fnew = funcs[1] ∘ funcs[3]
map(fnew, abc)
map(uppercase∘first, abc)
(uppercase∘first).(abc)
uppercase.(first.(abc))
递归
斐波那契数列
function fib(n::Int)
if n <= 2
return 1
end
return fib(n - 1) + fib(n - 2)
end
闭包
可以在函数内定义内嵌函数并以此内嵌函数为函数返回值, 称这样的内嵌函数为闭包(closure)
# 储存之前的结果
function makefib()
saved = Dict(0=>0, 1=>1)
function fib(n)
if n ∉ keys(saved)
saved[n] = fib(n-1) + fib(n-2)
end
return saved[n]
end
end
myfibnew = makefib()
for n in 0:9
println(n, ": ", myfibnew(n))
end
函数式编程
函数可以作为参数传入另一个函数中,比如R中的apply系列
map((x,y) -> 2*x + y, [1, 2, 3], [10, 20, 30])
filter(x -> x>0, [-2, 0, 1,2,3])
reduce(+, 1:3) # reduce接受2个参数
mapreduce(x -> x ^ 2, +, [1:3;])
#foreach无返回值 ~ map 有返回值
tri = 1:3:7; res = Int[];
foreach(x -> push!(res, x^2), tri)# 不返回内容但res已修改
accumulate
return 每一步计算结果
cumsum(1:5)
accumulate(+, 1:5)
返回值 return
-
return type
只在julia无法判断返回类型时,才需要指定类型。
#指定返回值为Int8类型
function(x,y)::Int8
-
返回值数量
# 不返回值
return nothing
return
# 多返回值
return (xm, xs)
do block
x = [1, 2, 3, 4, -1, 0, -3]
sum(x) do x
if x > 0.5
return x
else
return 0.5
end
end
作者介绍

生信探索
V1
微信公众号:生信探索