打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JS高阶编程技巧--compose函数
JavaScript Memoization:让函数也有记忆功能
Julia语法基础:函数进阶
python之线程2(单线程和多线程)
Julia机器核心编程.多重分配
带你一分钟理解 JavaScript 闭包 – 码农网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服