Julia函数进阶:匿名函数、函数复合、管道计算

news/2025/2/9 3:14:42 标签: julia, 函数式, 匿名函数, 管道, 函数复合, 多参数

文章目录

Julia系列:编程初步🔥数组🔥元组、字典、集合

Julia作为科学计算语言,对函数式编程提供了良好的支持,不仅支持匿名函数,还支持管道操作,并且为函数复合提供了运算符,十分强大且便利。

可变参数

有一些函数可以传入任意个数的参数,例如最大值函数

> max(1,2,3)
3

这种机制在Julia中由arg...实现,比如下面定义一个Max函数

function Max(arg...)
    M = -Inf
    for a in arg
        if a > M
            M = a
        end
    end
    return M
end

Max(3,1,4,5)    # 返回5

其逻辑是,把3,1,4,5映射为arg...,则arg自动变成[3,1,4,5],从而可以被迭代。

反过来说,...可以理解为把一个数组展开,效果如下

Max([3,1,4,5])  # 报错!!!
Max([3,1,4,5]...)   # 返回5,等价于Max(3,1,4,5)

匿名函数

目前我们讲了两种定义函数的方法,一种类似于f(x)=x^2,另一种则用function...end来实现,这两种写法均把一段映射和一个名字等同起来了。如果在创建函数时,并不声明函数的名字,那么就相当于创建了一个匿名函数,比如

function (x)
    x^2
end

这个就是匿名函数。当然,这个匿名函数毫无意义,因为没有名字就没法调用,但如果写成如下形式,就可以调用了。

f = function (x)
    x^2
end

f(5)    # 25

在这个过程中,函数名f和函数的实际内容x->x^2被分离开了,相当于把函数当作一个变量赋值给了f,这就是函数式编程的核心思想:函数也是一种变量。

匿名函数还有一种更为简单的写法,这种写法一般也叫做lambda表达式

f = x->x^2
f(5)    # 25

事情到了这个地步,量变也就引起了质变,匿名函数支持一种更加玄幻的写法,即不通过函数名,直接调用

(x->x^2)(5) # 返回25

函数式

函数既然可以被赋值,那么也自然可以作为参数在另一个函数中传递,比如下面写一个函数生成器,用以生成N次方函数

function gen(N)
    x->x^N
end

其输入是一个整数,输出为一个函数,下面测试一下

e5 = gen(5)
e5(3)   # 返回243,即3的5次方

此外,Julia提供了Lisp家族的书写风格,即可以把所有的二元运算改写成函数的形式,示例如下

+(1,2,3)   # 6
*(2, +(3, 5))   # 16, 即2*(3+5)

函数复合

Julia还提供了Ocaml家族的链式风格,用以完成函数复合,比如下面的表达式用于求1,2,3,4,5的均方根

[1:5;] |> (x->x.^2) |> (x->sum(x)/length(x)) |> sqrt 

其中经过三层管道

  1. 对每个元素求平方
  2. 取平均值,由于Base中不提供平均值函数,所以用sum和length自己做了一个
  3. 开根号

管道起到的作用其实是函数的复合,Julia为函数复合提供了运算符,在命令行中可输入\circ然后按下tab键即可,有了这个就可以将上面的三个函数合在一起了,但需要注意,其书写顺序和管道操作|>正好相反,对于f∘g∘h(x)来说,其运算顺序为f(g(h(x))),而对应的管道计算应该表示为x|> h |> g |> f

std = sqrt ∘ (x->sum(x)/length(x))(x->x.^2) 
std([1,2,3,4,5])    # 3.3166247903554

http://www.niftyadmin.cn/n/5205773.html

相关文章

Linux常用命令——blockdev命令

在线Linux命令查询工具 blockdev 从命令行调用区块设备控制程序 补充说明 blockdev命令在命令调用“ioxtls”函数,以实现对设备的控制。 语法 blockdev(选项)(参数)选项 -V:打印版本号并退出; -q:安静模式; -v&…

聚观早报 |快手Q3营收;拼多多杀入大模型;Redmi K70E开启预约

【聚观365】11月23日消息 快手Q3营收 拼多多杀入大模型 Redmi K70E开启预约 华为nova 12系列或下周发布 亚马逊启动“AI就绪”新计划 快手Q3营收 财报显示,快手第三季度营收279亿元,同比增长20.8%;期内盈利21.8亿元,去年同期…

《微信小程序开发从入门到实战》学习二十四

3.3.12开发创建投票多选投票页面 创建投票多选投票页面和创建单选投票页面没有区别,唯一区别仅在于向服务端发送数据时,告诉服务器这个投票是什么类型的投票。这个类型用三种数据类型表示都可以,分别如下所示: multiple:true/fa…

数学与她的

文章目录 定义域函数的定义域:一般地复合函数求解极值,单调性综合考题: 定义域 函数的定义域: 求定义域的原则性问题(通用)分母不为0 偶次根式的被开方式为非负( ≥ 0 ) 偶次根式的…

面试官:什么是三色标记

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

Nevron Vision for .NET 2023.1 Crack

Nevron Vision for .NET 适用于桌面和 Web 应用程序的高级数据可视化 Nevron Vision for .NET提供最全面的组件,用于构建面向 Web 和桌面的企业级数据可视化应用程序。 该套件中的组件具有连贯的 2D 和 3D 数据可视化效果,对观众产生巨大的视觉冲击力。我…

05 取样器(BeanShell和JSR223 Sampler)

一、取样器作用 1、取样器可以理解为Jmeter的桥梁,或者是Jmeter的加工厂; 2、Jmeter使用过程中,经常有些数据不能直接使用,需要加工后才能使用;这样就用到了取样器;但是这里存在问题,Jmeter中的…

上海亚商投顾:北证50指数持续大涨 短剧概念股再爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整,深成指跌超1.4%,创业板指跌超1.7%。北证50指数大涨超8%,…