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]
# [0,2,3]

可变个数参数与元组实参

funx(x, args...)

funx(11,1,2,3)
x = 11; (1,2,3#其他参数以tuple形式传入

x = [1314]
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=>01=>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, [123], [102030])
filter(x -> x>0, [-201,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 = [1234, -10, -3]
sum(x) do x
    if x > 0.5
        return x
    else
        return 0.5
    end
end

本文由 mdnice 多平台发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值